У випадку веб-компонентів існує фундаментальна проблема, через яку віджети, побудовані з 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 трохи краще, ніж відповіді вже тут. Я додав сюди відповідний вміст, щоб він допомагав іншим, але подивись посилання для детального обговорення цього ж питання.