У випадку веб-компонентів існує фундаментальна проблема, через яку віджети, побудовані з HTML та JavaScript, важко використовувати.
Проблема : Дерево DOM у віджеті не інкапсульоване з решти сторінки. Ця відсутність інкапсуляції означає, що таблиця стилів вашого документа може випадково застосувати до частин всередині віджета; ваш JavaScript може випадково змінити частини всередині віджета; ваші ідентифікатори можуть збігатися з ідентифікаторами у віджеті тощо.
Shadow DOM вирішує проблему інкапсуляції дерева DOM .
Наприклад, якщо у вас була така розмітка:
<button>Hello, world!</button>
<script>
var host = document.querySelector('button');
var root = host.createShadowRoot();
root.textContent = 'こんにちは、影の世界!';
</script>
то замість
Hello, world!
ваша сторінка виглядає так
こんにちは、影の世界!
Мало того, якщо JavaScript на сторінці запитує, що таке textContent кнопки, це не буде отримано “こんにちは、影の世界!”, але“Hello, world!” тому, що піддерево DOM під тіньовим коренем інкапсульовано .
ПРИМІТКА : Я взяв вищезгаданий вміст із https://www.html5rocks.com/en/tutorials/webcomponents/shadowdom/, оскільки це допомогло мені зрозуміти тіньовий DOM трохи краще, ніж відповіді вже тут. Я додав сюди відповідний вміст, щоб він допомагав іншим, але подивись посилання для детального обговорення цього ж питання.