Middle
Šta je Shadow DOM?
sobes.tech АИ
Одговор од АИ
Shadow DOM је веб стандард који омогућава инкапсулацију HTML, CSS и JavaScript-а у засебне, изоловане блокове од главног документа.
Главни концепти:
- Shadow Host: Елемент DOM-а на који се прикачити Shadow DOM.
- Shadow Tree: Изоловано поддрево DOM-а.
- Shadow Boundary: Граница између Shadow DOM-а и главног документа.
- Shadow Root: Језгени чвор Shadow Tree-а. Креира се помоћу
element.attachShadow({ mode: 'open' | 'closed' }):open: Shadow Root је доступан споља прекоelement.shadowRoot.closed: Shadow Root није доступан споља.
Предности:
- Инкапсулација стилова: Стилови дефинисани у Shadow DOM-у не процуре напоље и не утичу на главни документ. Стилови из главног документа по подразумевану не утичу на Shadow DOM, али то може бити контролисано.
- Инкапсулација DOM-а: Елементи унутар Shadow DOM-а нису видљиви у главном DOM-у, што спречава случајно преклапање селектора и манипулације.
- Инкапсулација понашања: Логика и обработници догађаја могу бити изоловани у Shadow DOM-у.
Пример креирања Shadow DOM-а:
// Креирамо нови елемент DIV
const hostElement = document.createElement('div');
// Прикачимо Shadow DOM на елемент
const shadowRoot = hostElement.attachShadow({ mode: 'open' });
// Додајемо садржај у Shadow DOM
shadowRoot.innerHTML = `
<style>
/* Стил који важи само унутар овог Shadow DOM-а */
p {
цолор: плаво;
}
</style>
<p>Ово је текст унутар Shadow DOM-а</p>
`;
// Додајемо хост-елемент у главни документ
document.body.appendChild(hostElement);
Користи се за:
- Креирање поновно коришћених веб-компонената.
- Изолацију стилова страних библиотека.
- Заштиту унутрашњих детаља компонента од спољашњих утицаја.
Особине рада са стиловима:
- Спољашњи стилови по подразумеваној вредности не утичу на Shadow DOM.
- Може се користити
:hostпсевдо-класа за стилизовање самог Shadow Host-а изнутра Shadow DOM-а. - Може се користити
:host-context()за стилизовање на основу контекста Shadow Host-а. - Може се користити
::slotted()псевдо-елемент за стилизовање елемената постављених у слотове (<slot>).
<my-component>
<!-- Овај елемент ће бити "послат" у слот унутар Shadow DOM-а -->
<span>Садржај слота</span>
</my-component>
// Унутар Shadow DOM компонента my-component
const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
<style>
/* Стил за елемент постављен у слот са именом "my-slot" */
::slotted(span) {
font-weight: bold;
}
</style>
<div>Главни садржај компонента</div>
<slot></slot> <!-- Овде ће бити приказан садржај слота -->
`;
Shadow DOM је део спецификације Web Components.