Skip to content
EN

Shadow DOM

Коротко:

Shadow DOM — technology для создания изолированного DOM-subtree внутри element. CSS из outer document не пробивается внутрь (исключая inheritable properties), а outside JS querySelector не видит shadow tree. Основа Web Components standard. Использование: YouTube Player, Google Docs, CodePen embeds, Shopify Polaris.

Ниже: подробности, пример, смежные термины, FAQ.

Проверить свой сайт →

Подробности

  • Mode: open (shadowRoot accessible) / closed (hidden)
  • Style encapsulation: CSS внутри не leaks out, snaapshot outside не leaks in
  • : placeholder для light DOM content projection
  • ::part() и :host: CSS API для styling shadow от outside
  • Browser support: 100% modern browsers (2019+)

Пример

class MyCard extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.innerHTML = `
      <style>
        p { color: red; }  /* scoped */
      </style>
      <p><slot>Default</slot></p>
    `;
  }
}
customElements.define('my-card', MyCard);

Смежные термины

Что такое Shadow DOM?

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

Преимущества Shadow DOM

Использование Shadow DOM предоставляет ряд преимуществ:

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

Эти преимущества особенно важны при разработке крупных приложений, где множество разработчиков работают над разными частями кода.

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

Для создания компонента с использованием Shadow DOM нам потребуется JavaScript. Рассмотрим пример простого веб-компонента, который отображает кнопку с собственным стилем:

class MyButton extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
const button = document.createElement('button');
button.textContent = 'Нажми меня';
button.style.backgroundColor = 'blue';
button.style.color = 'white';
shadow.appendChild(button);
}
}
customElements.define('my-button', MyButton);

В этом примере мы создаем класс MyButton, который расширяет HTMLElement. В конструкторе мы создаем теневое дерево с помощью метода attachShadow. Затем создаем кнопку и добавляем ее в теневое дерево. Такой подход обеспечивает полную инкапсуляцию стилей и поведения кнопки.

Чтобы использовать наш новый компонент, достаточно добавить его в HTML-код:

<my-button></my-button>

Теперь, даже если на странице есть другие кнопки, стили и поведение нашего компонента останутся изолированными.

Больше по теме

Часто задаваемые вопросы

Shadow DOM vs iframe?

Shadow: same JS context, same origin, lightweight. iframe: full browsing context, heavyweight, cross-origin isolation. Shadow для widgets, iframe для third-party untrusted content.

React использует?

Обычно нет (React virtual DOM достаточно). Но React web components wrapper может использовать. Material UI v6 опционально.

CSS styling извне?

::part() для exposed parts, :host для host element, CSS custom properties наследуются. Tailwind через ::part — возможно.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.