En el caso de los componentes web, existe un problema fundamental que dificulta el uso de los widgets creados con HTML y JavaScript.
Problema : el árbol DOM dentro de un widget no está encapsulado del resto de la página. Esta falta de encapsulación significa que la hoja de estilo de su documento podría aplicarse accidentalmente a partes dentro del widget; su JavaScript podría modificar accidentalmente partes dentro del widget; sus ID pueden superponerse con los ID dentro del widget y así sucesivamente.
Shadow DOM aborda el problema de encapsulación del árbol DOM .
Por ejemplo, si tuvieras un marcado como este:
<button>Hello, world!</button>
<script>
var host = document.querySelector('button');
var root = host.createShadowRoot();
root.textContent = 'こんにちは、影の世界!';
</script>
entonces en lugar de
Hello, world!
tu página se ve como
こんにちは、影の世界!
No solo eso, si JavaScript en la página pregunta cuál es el textContent del botón, no lo obtendrá “こんにちは、影の世界!”
, sino “Hello, world!”
porque el subárbol DOM debajo de la raíz sombra está encapsulado .
NOTA : He recogido el contenido anterior de https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/, ya que me ayudó a entender Shadow DOM un poco mejor que las respuestas que ya están aquí. He agregado contenido relevante aquí para que ayude a otros, pero eche un vistazo al enlace para una discusión detallada sobre el mismo.