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