attachShadow y Shadow Root
Cree un árbol shadow encapsulado en un elemento host
attachShadow y Shadow Root es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué es Shadow DOM?
Shadow DOM proporciona a un elemento su propio árbol DOM aislado (el "árbol shadow"), que no aparece en el DOM principal de la página. El CSS externo no se filtra hacia dentro y el CSS interno no se filtra hacia fuera: es una encapsulación perfecta para los componentes.
Conexión de una raíz shadow
Llame a this.attachShadow({ mode: "open" }) desde el constructor o connectedCallback de un elemento personalizado. El método devuelve un ShadowRoot, que puede rellenar como un árbol DOM normal mediante innerHTML, appendChild, etc.
class MyCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: "open" });
shadow.innerHTML = "<style>p{color:red}</style><p>Hello</p>";
}
}Modo abierto frente a modo cerrado
mode: "open" expone el árbol shadow como element.shadowRoot. mode: "closed" lo oculta: element.shadowRoot devuelve null, por lo que los scripts externos no pueden entrar en el árbol. En la práctica, el modo cerrado rara vez resulta útil, porque el mismo código que definió el elemento puede conservar su propia referencia.
Encapsulación de estilos
Los estilos definidos dentro del árbol shadow (mediante <style> u hojas de estilo adoptadas) solo se aplican dentro de ese árbol shadow. Los selectores CSS del documento principal nunca coinciden con los descendientes del árbol shadow, y sus estilos nunca salen al documento.
El selector :host
Desde dentro del árbol shadow, el elemento host (el propio elemento personalizado) se selecciona con la pseudoclase especial :host. :host(.large) coincide cuando el host tiene la clase .large; :host([disabled]) coincide cuando el host tiene el atributo disabled.
:host {
display: block;
padding: 16px;
border: 1px solid #ccc;
}
:host([disabled]) {
opacity: 0.5;
pointer-events: none;
}display: block en elementos personalizados
Los elementos personalizados tienen de forma predeterminada display: inline. Dentro de la raíz shadow, aplique :host { display: block } para que el elemento se comporte como un componente de nivel de bloque. Olvidarlo es una causa común de errores en los que "se ignora mi width: 100%".
Composición de eventos
Los eventos que emergen del árbol shadow se redirigen al host. Un clic en un botón interno llega a los escuchadores externos con event.target === host. Use event.composedPath() para ver el destino interno real si lo necesita.
composed: true para eventos personalizados
Los eventos personalizados enviados dentro de la raíz de Shadow DOM no atraviesan el límite a menos que los cree con bubbles: true y composed: true. Sin composed, los listeners externos del host nunca ven el evento.
Los scripts externos no pueden acceder
Los scripts externos pueden consultar el elemento host, pero no sus descendientes shadow. document.querySelector("my-card span") no devuelve nada si el <span> vive dentro del árbol shadow. La encapsulación protege los elementos internos frente al acoplamiento accidental.
Shadow DOM declarativo
Con <template shadowrootmode="open"> dentro del HTML de un elemento, el navegador construye el árbol shadow durante el análisis, sin JavaScript. Esto facilita la hidratación de los componentes renderizados en el servidor, porque el árbol shadow existe antes de que se ejecute JavaScript.
Consideraciones de rendimiento
Cada raíz shadow tiene cierta sobrecarga: un ámbito de estilos adicional y una capa de renderizado adicional. Cientos de raíces shadow no suponen un problema; decenas de miles pueden ser relevantes. En interfaces de usuario de muy alta densidad (tablas grandes, listas virtualizadas), realice un perfil de rendimiento para confirmar que los costes de Shadow DOM son aceptables.
Comprobación de conocimientos
¿Qué hace el modo open que no hace el modo closed?
Resumen
attachShadow({ mode: "open" }) crea un subárbol DOM aislado en el que CSS e IDs no se filtran en ninguna dirección. Aplique estilos al host con :host, recuerde display: block y use composed: true para los eventos que deban salir. Por lo demás, el árbol shadow se comporta como un DOM normal: innerHTML, appendChild y querySelector funcionan con normalidad dentro de él.
Preguntas frecuentes
¿La lección «attachShadow y Shadow Root» es gratis?
Sí — el texto completo de «attachShadow y Shadow Root» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué aprenderé en «attachShadow y Shadow Root»?
Cree un árbol shadow encapsulado en un elemento host Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar HTML Academy?
No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «attachShadow y Shadow Root»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de HTML Academy?
Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- attachShadow y Shadow Root
- Elementos slot para distribuir contenido
- Estilos con ámbito dentro del Shadow DOM
- Part y exportparts para aplicar estilos externos