Shadow DOM является одной из ключевых технологий современного веб-разработки, обеспечивающей инкапсуляцию структуры, стилей и поведения компонентов. В сочетании с библиотекой Bliss.js работа с Shadow DOM становится более простой и выразительной, благодаря удобным методам управления элементами и событиями.
В Bliss.js для создания Shadow DOM используется метод
el.shadow(), который оборачивает стандартный
attachShadow. Этот метод позволяет создать изолированное
дерево DOM внутри элемента и сразу настроить режим инкапсуляции.
import { $ } from 'bliss';
const host = $('#shadow-host');
const shadow = host.shadow({ mode: 'open' }); // 'open' или 'closed'
shadow.innerHTML = `
<style>
p { color: blue; font-weight: bold; }
</style>
<p>Текст внутри Shadow DOM</p>
`;
open позволяет получать доступ через
host.shadowRoot, closed полностью скрывает
содержимое.Bliss.js сохраняет привычный API для поиска и манипуляции элементами,
даже если они находятся внутри Shadow DOM. Для этого используется метод
find или $ в контексте shadow-дерева.
const paragraph = shadow.find('p');
paragraph.text('Новый текст');
paragraph.addClass('highlighted');
Bliss.js позволяет создавать модульные компоненты с Shadow DOM, что облегчает повторное использование и инкапсуляцию.
function CardComponent(title, content) {
const host = document.createElement('div');
const shadow = host.shadow({ mode: 'open' });
shadow.innerHTML = `
<style>
.card { border: 1px solid #ccc; padding: 1em; border-radius: 4px; }
.title { font-weight: bold; margin-bottom: 0.5em; }
</style>
<div class="card">
<div class="title">${title}</div>
<div class="content">${content}</div>
</div>
`;
return host;
}
document.body.appendChild(CardComponent('Заголовок', 'Содержимое карточки'));
Bliss.js обеспечивает удобную работу с событиями внутри Shadow DOM, сохраняя контекст и предотвращая утечки обработчиков.
const shadow = $('#shadow-host').shadow({ mode: 'open' });
shadow.innerHTML = `<button>Клик</button>`;
shadow.on('click', 'button', () => {
console.log('Кнопка внутри Shadow DOM нажата');
});
Shadow DOM полностью изолирует CSS, но Bliss.js позволяет добавлять стили динамически и управлять ими программно.
const shadow = $('#shadow-host').shadow({ mode: 'open' });
shadow.addStyle(`
p { font-size: 16px; color: darkgreen; }
`);
<style> внутри Shadow DOM.Bliss.js облегчает передачу данных между Shadow DOM и внешним документом через свойства и события.
const shadowHost = $('#shadow-host');
const shadow = shadowHost.shadow({ mode: 'open' });
shadow.innerHTML = `<button>Отправить</button>`;
shadow.on('click', 'button', () => {
shadowHost.trigger('customEvent', { message: 'Данные из Shadow DOM' });
});
shadowHost.on('customEvent', (e, data) => {
console.log(data.message); // 'Данные из Shadow DOM'
});
Bliss.js позволяет динамически изменять содержимое Shadow DOM без разрушения его структуры и стилей.
const shadow = $('#shadow-host').shadow({ mode: 'open' });
shadow.html('<p>Изначальный текст</p>');
setTimeout(() => {
shadow.html('<p>Обновленный текст через 2 секунды</p>');
}, 2000);
html заменяет содержимое Shadow DOM, сохраняя его
инкапсуляцию.append,
prepend, find для сложных обновлений.closed режима доступ к внутренностям
возможен только через методы самого Bliss.js.on, off,
find, html, text) работают внутри
Shadow DOM, что обеспечивает единообразный API для работы с документом и
инкапсулированными компонентами.Shadow DOM в Bliss.js превращается из сложной технологии браузера в удобный инструмент для модульной разработки, позволяя строить безопасные, изолированные и повторно используемые компоненты.