Найти в Дзене
Frontend developer

Shadow DOM: что это вообще такое и как его использовать

Введение:
Shadow DOM — это технология, позволяющая создавать инкапсулированные DOM-деревья внутри веб-страницы. Это значит, что элементы и стили внутри Shadow DOM изолированы от основного документа и не влияют на другие элементы. Shadow DOM — важная часть веб-компонентов и используется для создания самостоятельных и повторно используемых компонентов. В этой статье мы разберем, что такое Shadow DOM, как с ним работать и рассмотрим примеры его использования. Shadow DOM позволяет создавать скрытые поддеревья внутри DOM-дерева, которые не видны и не доступны из основного документа. Это позволяет разработчикам инкапсулировать структуру, стиль и поведение компонента, не опасаясь, что они случайно затронут глобальные стили или другие элементы на странице. Shadow DOM используется для создания компонентов, которые могут легко интегрироваться в проекты без риска конфликтов. Shadow DOM применяется в следующих случаях: Чтобы создать Shadow DOM, используется метод attachShadow(). Он прикрепляется к
Оглавление
Shadow DOM preview
Shadow DOM preview

Введение:
Shadow DOM — это технология, позволяющая создавать
инкапсулированные DOM-деревья внутри веб-страницы. Это значит, что элементы и стили внутри Shadow DOM изолированы от основного документа и не влияют на другие элементы. Shadow DOM — важная часть веб-компонентов и используется для создания самостоятельных и повторно используемых компонентов. В этой статье мы разберем, что такое Shadow DOM, как с ним работать и рассмотрим примеры его использования.

Что такое Shadow DOM?

Shadow DOM позволяет создавать скрытые поддеревья внутри DOM-дерева, которые не видны и не доступны из основного документа. Это позволяет разработчикам инкапсулировать структуру, стиль и поведение компонента, не опасаясь, что они случайно затронут глобальные стили или другие элементы на странице. Shadow DOM используется для создания компонентов, которые могут легко интегрироваться в проекты без риска конфликтов.

Когда используется Shadow DOM?

Shadow DOM применяется в следующих случаях:

  • Создание повторно используемых компонентов: например, кнопки, модальные окна или другие элементы интерфейса, которые должны вести себя одинаково независимо от окружения.
  • Инкапсуляция стилей: стили внутри Shadow DOM не влияют на остальную часть документа, что позволяет избежать конфликтов CSS.
  • Повышение удобства разработки компонентов: компоненты с Shadow DOM не требуют сложной настройки стилей и изоляции для работы в разных проектах.

Как создать Shadow DOM?

Чтобы создать Shadow DOM, используется метод attachShadow(). Он прикрепляется к элементу и создает новое инкапсулированное DOM-дерево.

Пример:

html
html
javaScript
javaScript

В этом примере текстовый параграф <p> внутри Shadow DOM будет виден только внутри этого инкапсулированного дерева и не будет зависеть от стилей, заданных в основном документе.

Режимы Shadow DOM: open и closed

При создании Shadow DOM доступны два режима:

  1. open — Shadow DOM доступен для JavaScript в основном документе. Это значит, что мы можем обращаться к shadowRoot для манипуляций.
  2. closed — Shadow DOM закрыт для доступа извне, и его нельзя модифицировать или просмотреть через shadowRoot из основного документа.

Пример создания закрытого Shadow DOM:

javaScript
javaScript

При попытке обратиться к element.shadowRoot вернется null, так как доступ к closed Shadow DOM закрыт.

Пример создания компонента с Shadow DOM

Создадим простой компонент "кнопка" с Shadow DOM. Этот компонент будет изолирован от внешних стилей и иметь собственные стили внутри Shadow DOM.

javaScript
javaScript
html
html

Здесь мы:

  • Создаем класс CustomButton, который наследуется от HTMLElement.
  • Добавляем стили и разметку в Shadow DOM, что позволяет кнопке сохранить собственные стили независимо от остальных стилей страницы.
  • Регистрируем компонент с именем <custom-button>, и теперь его можно добавлять в HTML как обычный тег.

Инкапсуляция стилей с Shadow DOM

Стили внутри Shadow DOM не влияют на внешний DOM и не зависят от стилей вне его. Это помогает избежать конфликтов CSS и гарантирует, что компоненты будут выглядеть одинаково, независимо от окружения. В то же время стили из основного документа не затрагивают элементы внутри Shadow DOM.

Например, даже если в основном документе есть стиль для button, он не повлияет на кнопку внутри Shadow DOM:

html
html

Кнопка custom-button сохранит свой оригинальный стиль из Shadow DOM, несмотря на определение глобального стиля для button.

Shadow DOM и события

События внутри Shadow DOM работают как обычно, но при всплытии они не видны для внешнего документа. Это называется "Shadow DOM event retargeting". Когда событие всплывает из Shadow DOM, целевой элемент (event.target) заменяется на элемент-хозяин Shadow DOM, скрывая структуру внутреннего DOM.

Чтобы обработать события внутри Shadow DOM, можно добавлять слушатели событий в shadowRoot:

javaScript
javaScript

Плюсы и минусы использования Shadow DOM

Преимущества:

  • Изоляция стилей: стили внутри Shadow DOM не конфликтуют с внешними.
  • Удобство создания компонентов: компоненты с Shadow DOM легко интегрируются в разные проекты.
  • Улучшение безопасности и структуры кода: компоненты становятся независимыми и более безопасными.

Недостатки:

  • Совместимость: не все браузеры поддерживают Shadow DOM, особенно в старых версиях.
  • Сложность дебага: так как Shadow DOM изолирован, отладка может быть сложнее.
  • Ограниченные возможности стилизации: псевдоэлементы вроде ::before и ::after в некоторых случаях не работают с Shadow DOM.

Реальные примеры использования Shadow DOM

  • Стилизация встроенных элементов браузера: Некоторые браузерные элементы, например, <video>, <audio>, <input type="range">, используют Shadow DOM для оформления своих внутренних компонентов — кнопок, ползунков, прогресс-баров. Shadow DOM позволяет им быть единообразными и независимыми от стилей страницы, на которой они находятся.
  • UI-компоненты библиотек: Библиотеки компонентов, такие как Google Material Web Components или Lightning Web Components (LWC) от Salesforce, используют Shadow DOM для изоляции стилей своих компонентов, чтобы их можно было внедрять в любую страницу без риска конфликта стилей.
  • Встраиваемые виджеты и сторонние плагины: Когда сервисы встраивают свои виджеты на другие сайты, например, виджеты чатов поддержки, виджеты соцсетей или формы подписки, Shadow DOM помогает избежать конфликтов с дизайном и структурой страницы хоста. Виджет остается визуально согласованным с брендом сервиса, независимо от внешних стилей.
  • Разработка интерфейсов в крупных приложениях: В масштабных веб-приложениях, где много компонентов от разных команд, использование Shadow DOM позволяет командам разрабатывать и тестировать компоненты независимо, так как каждый компонент инкапсулирован и не может случайно повлиять на внешний интерфейс приложения.
  • Создание дизайнов для платформ-конструкторов: В системах, где пользователи могут создавать свои собственные интерфейсы (например, конструкторы сайтов или админ-панели), Shadow DOM помогает дизайнерам и разработчикам гарантировать, что их компоненты сохранят правильный вид даже в условиях динамически меняющегося окружения и пользовательских настроек.

Заключение

Shadow DOM — это мощный инструмент для создания инкапсулированных и независимых компонентов, которые легко интегрировать в любые проекты без опасений насчет стилей или конфликтов с остальным кодом. Знание Shadow DOM помогает разработчикам создавать современные, безопасные и удобные компоненты, подходящие для использования в сложных интерфейсах.