Shadow DOM является ключевым механизмом для создания изолированных и повторно используемых веб-компонентов в JavaScript. Он позволяет разработчику инкапсулировать внутреннюю структуру элемента, скрывая её от внешнего контекста страницы и обеспечивая независимость стилей и скриптов. В Polymer Shadow DOM используется как основа для построения компонентной архитектуры.
В Polymer элементы наследуются от Polymer.Element, что
позволяет автоматически интегрировать Shadow DOM. Для создания
собственного компонента используется метод
static get template(), который возвращает HTML-шаблон. Этот
шаблон помещается в Shadow DOM компонента:
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
class MyElement extends PolymerElement {
static get template() {
return html`
<style>
:host {
display: block;
border: 2px solid #000;
padding: 10px;
}
.inner {
color: red;
}
</style>
<div class="inner">Текст внутри Shadow DOM</div>
`;
}
}
customElements.define('my-element', MyElement);
Ключевые моменты:
:host позволяет задавать стили для самого компонента,
не затрагивая внешние элементы..inner) не конфликтуют
с глобальными стилями.customElements.define.Shadow DOM обеспечивает полную изоляцию CSS, что предотвращает утечки стилей внутрь компонента и из него наружу. Для управления стилями используются несколько подходов:
<style> внутри
шаблона — применяются только к Shadow DOM элемента.<style>
:host {
--main-color: blue;
color: var(--main-color);
}
</style>
Shadow DOM предоставляет механизм распределения внешнего контента через слоты. Это позволяет комбинировать инкапсулированный компонент с контентом, переданным извне:
static get template() {
return html`
<style>
:host { display: block; padding: 10px; }
::slotted(p) { color: green; }
</style>
<slot></slot>
`;
}
Особенности работы слотов:
<slot>.::slotted позволяет применять стили только к
распределенному контенту.Инкапсуляция Shadow DOM ограничивает прямой доступ к внутренним элементам. Для взаимодействия с внешним контекстом используются кастомные события:
this.dispatchEvent(new CustomEvent('custom-action', {
detail: { value: 42 },
bubbles: true,
composed: true
}));
bubbles: true позволяет событию всплывать.composed: true делает событие видимым за пределами
Shadow DOM.this.shadowRoot для сохранения инкапсуляции.Shadow DOM в Polymer обеспечивает высокий уровень модульности и предсказуемости поведения компонентов. Он становится фундаментом для создания безопасных и независимых UI-блоков, что особенно важно при масштабных приложениях и библиотеках компонентов.