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.
Бесплатный онлайн-инструмент — проверка HTTP-заголовков: результат мгновенно, без регистрации.
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 — это технология, позволяющая создавать инкапсулированные компоненты в веб-приложениях, что обеспечивает защиту от конфликтов стилей и скриптов. Она является частью спецификации Web Components и позволяет разработчикам создавать повторно используемые элементы с собственным стилем и поведением.
Использование 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: same JS context, same origin, lightweight. iframe: full browsing context, heavyweight, cross-origin isolation. Shadow для widgets, iframe для third-party untrusted content.
Обычно нет (React virtual DOM достаточно). Но React web components wrapper может использовать. Material UI v6 опционально.
::part() для exposed parts, :host для host element, CSS custom properties наследуются. Tailwind через ::part — возможно.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.