attachShadow e raiz de sombra
Crie uma árvore de sombra encapsulada em um elemento hospedeiro.
attachShadow e raiz de sombra é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.
O que é o DOM isolado?
O DOM isolado fornece ao elemento sua própria árvore DOM, a “árvore isolada”, que não aparece no DOM principal da página. O CSS externo não entra nela e o CSS interno não sai — é um encapsulamento perfeito para componentes.
Anexando uma raiz isolada
Chame this.attachShadow({ mode: "open" }) no construtor ou em connectedCallback de um elemento personalizado. O método retorna um ShadowRoot, que o senhor pode preencher como uma árvore DOM comum usando 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 aberto versus fechado
mode: "open" expõe a árvore isolada como element.shadowRoot. mode: "closed" a oculta — element.shadowRoot retorna nulo, portanto scripts externos não podem entrar na árvore. O modo fechado raramente é útil na prática, porque o mesmo código que definiu o elemento pode manter sua própria referência.
Encapsulamento de estilos
Os estilos definidos dentro da árvore isolada, por meio de <style> ou de folhas de estilo adotadas, aplicam-se somente dentro dessa árvore. Os seletores CSS do documento principal nunca correspondem aos descendentes isolados, e os estilos da árvore isolada nunca atravessam para o documento.
O seletor :host
Dentro da árvore isolada, o elemento hospedeiro, que é o próprio elemento personalizado, é selecionado com a pseudoclasse especial :host. :host(.large) corresponde quando o hospedeiro tem a classe .large; :host([disabled]) corresponde quando o hospedeiro tem o atributo disabled.
:host {
display: block;
padding: 16px;
border: 1px solid #ccc;
}
:host([disabled]) {
opacity: 0.5;
pointer-events: none;
}display: block em elementos personalizados
Por padrão, os elementos personalizados usam display: inline. Dentro da raiz isolada, aplique :host { display: block } para que o elemento se comporte como um componente em nível de bloco. Esquecer isso é uma causa comum de erros em que “minha largura de 100% está sendo ignorada”.
Composição de eventos
Os eventos que se propagam para fora da árvore isolada têm o alvo redefinido no elemento hospedeiro. Um clique em um botão interno chega aos ouvintes externos com event.target === host. Use event.composedPath() para ver o alvo interno real, se necessário.
composed: true para eventos personalizados
Eventos personalizados despachados dentro da raiz de sombra não atravessam o limite a menos que sejam criados com bubbles: true e composed: true. Sem composed, os ouvintes externos no elemento hospedeiro nunca veem o evento.
Os scripts não podem vazar para dentro
Os scripts externos podem consultar o elemento hospedeiro, mas não seus descendentes da sombra. document.querySelector("my-card span") não retorna nada se o <span> estiver dentro da árvore de sombra. O encapsulamento protege os elementos internos contra acoplamentos acidentais.
DOM de sombra declarativo
Com <template shadowrootmode="open"> dentro do HTML de um elemento, o navegador constrói a árvore de sombra durante a análise, sem JavaScript. Isso torna os componentes renderizados no servidor compatíveis com hidratação, pois a árvore de sombra existe antes da execução do JS.
Considerações de desempenho
Cada raiz de sombra tem um custo adicional — um escopo de estilos extra e uma camada de renderização extra. Centenas de raízes de sombra funcionam bem; dezenas de milhares podem fazer diferença. Em interfaces de usuário de densidade muito alta (tabelas grandes e listas virtualizadas), faça uma análise de desempenho para confirmar que os custos do DOM de sombra são aceitáveis.
Verificação de conhecimento
O que o modo aberto faz que o modo fechado não faz?
Resumo
attachShadow({ mode: "open" }) cria uma subárvore DOM isolada, na qual CSS e IDs não vazam em nenhuma direção. Estilize o elemento hospedeiro com :host, lembre-se de display: block e use composed: true para eventos que precisam escapar. Fora isso, a árvore de sombra se comporta como um DOM comum — innerHTML, appendChild e querySelector funcionam normalmente dentro dela.
Perguntas Frequentes
A aula “attachShadow e raiz de sombra” é grátis?
Sim — o texto completo de “attachShadow e raiz de sombra” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.
O que vou aprender em “attachShadow e raiz de sombra”?
Crie uma árvore de sombra encapsulada em um elemento hospedeiro. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar HTML Academy?
Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “attachShadow e raiz de sombra”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de HTML Academy?
Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- attachShadow e raiz de sombra
- Elementos slot para distribuição de conteúdo
- Estilos com escopo dentro do DOM de sombra
- Part e Exportparts para estilização externa