Shadow DOM — это ключевой механизм веб-компонентов, обеспечивающий инкапсуляцию структуры и стилей. Он позволяет создавать элементы с внутренней разметкой и стилями, полностью изолированными от остальной страницы. В Polymer Shadow DOM используется для обеспечения компонентной независимости и предотвращения конфликтов CSS.
В Polymer 3 структура компонента строится на основе класса,
наследуемого от PolymerElement. Для включения Shadow DOM
достаточно определить шаблон с использованием тега
<template> и включить его в компонент:
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
class MyComponent extends PolymerElement {
static get template() {
return html`
<style>
:host {
display: block;
padding: 10px;
background-color: #f0f0f0;
}
.content {
color: blue;
font-weight: bold;
}
</style>
<div class="content">Текст внутри Shadow DOM</div>
`;
}
}
customElements.define('my-component', MyComponent);
Ключевые моменты:
:host применяется к самому элементу, создавая стили для
внешней оболочки..content) ограничены Shadow DOM и не
будут конфликтовать с глобальными стилями страницы.Shadow DOM позволяет полностью изолировать CSS:
--custom-property) можно пробрасывать внутрь Shadow DOM
для управления стилями из внешнего кода.Пример использования кастомного свойства:
<style>
:host {
--text-color: red;
}
.content {
color: var(--text-color);
}
</style>
<div class="content">Кастомный цвет текста</div>
Внешняя установка свойства:
<my-component style="--text-color: green;"></my-component>
В результате текст внутри компонента будет зелёным, при этом остальные стили страницы останутся нетронутыми.
Shadow DOM предоставляет механизм слотов, позволяющий размещать внешнее содержимое в заранее определённых областях:
class MyCard extends PolymerElement {
static get template() {
return html`
<style>
:host {
display: block;
border: 1px solid #ccc;
padding: 10px;
border-radius: 5px;
}
</style>
<div class="header">
<slot name="header"></slot>
</div>
<div class="body">
<slot></slot>
</div>
`;
}
}
customElements.define('my-card', MyCard);
Использование:
<my-card>
<h2 slot="header">Заголовок карточки</h2>
<p>Основное содержимое карточки</p>
</my-card>
name="header")
для точного распределения элементов..content не будет виден глобально.:host и
:host-context() позволяет управлять поведением компонента в
зависимости от внешнего окружения.Пример использования :host-context:
<style>
:host-context(.dark-theme) {
background-color: #333;
color: white;
}
</style>
Эти стили применяются, если родительский элемент имеет класс
dark-theme.
В Polymer доступ к Shadow DOM возможен через свойство
shadowRoot:
this.shadowRoot.querySelector('.content').textContent = 'Обновлённый текст';
querySelector и querySelectorAll
работают только внутри компонента, что повышает безопасность и
предсказуемость поведения.Shadow DOM в Polymer обеспечивает мощный уровень компонентной
инкапсуляции, изоляции стилей и гибкого управления контентом.
Правильное использование :host, слотов и кастомных свойств
позволяет создавать сложные интерфейсы, полностью управляемые и
независимые от глобального контекста страницы.