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