No caso de componentes da web, há um problema fundamental que torna os widgets construídos em HTML e JavaScript difíceis de usar.
Problema : a árvore DOM dentro de um widget não está encapsulada no resto da página. Essa falta de encapsulamento significa que a folha de estilo do documento pode ser aplicada acidentalmente às partes dentro do widget; seu JavaScript pode modificar acidentalmente partes dentro do widget; seus IDs podem se sobrepor aos IDs dentro do widget e assim por diante.
Shadow DOM aborda o problema de encapsulamento da árvore DOM .
Por exemplo, se você tivesse uma marcação como esta:
<button>Hello, world!</button>
<script>
var host = document.querySelector('button');
var root = host.createShadowRoot();
root.textContent = 'こんにちは、影の世界!';
</script>
então em vez de
Hello, world!
sua página parece
こんにちは、影の世界!
Além disso, se o JavaScript na página perguntar o que é textContent do botão, ele não obterá “こんにちは、影の世界!”
, mas “Hello, world!”
porque a subárvore DOM sob a raiz de sombra está encapsulada .
NOTA : Eu peguei o conteúdo acima de https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/ , pois me ajudou a entender o DOM da sombra um pouco melhor do que as respostas já aqui. Eu adicionei conteúdo relevante aqui para ajudar outras pessoas, mas dê uma olhada no link para uma discussão detalhada sobre o mesmo.