Технология Shadow DOM является важной частью современной веб-разработки. Она позволяет создавать инкапсулированные элементы на веб-страницах, обеспечивая изоляцию стилей и скриптов. В этой статье мы рассмотрим основные концепции, его преимущества и примеры использования.
Что такое DOM?
Документ-объектная модель (DOM, Document Object Model) представляет собой структурированное дерево, описывающее HTML-документ. Каждый узел дерева соответствует элементу документа, включая теги, атрибуты и текстовые узлы. DOM позволяет скриптам динамически изменять структуру, стиль и содержание веб-страницы.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Основные понятия Shadow DOM
Shadow Tree
Shadow Tree (теневое дерево) – это часть, которая инкапсулирована внутри элемента и недоступна для внешних стилей и скриптов. Оно создается с помощью Shadow Root (теневого корня) и может содержать свои собственные узлы и стили.
Root
Это корневой узел теневого дерева. Он создается вызовом метода attachShadow() на элементе, к которому нужно прикрепить теневое дерево. Пример кода для создания теневого корня:
let shadowRoot = element.attachShadow({ mode: 'open' });
Host
Это элемент, к которому прикреплено теневое дерево. Он служит контейнером для теневого DOM и внешне выглядит как обычный элемент.
Boundary
Boundary (граница) – это граница, отделяющая теневое дерево от остального DOM. Внешние стили и скрипты не могут влиять на элементы внутри теневого дерева, и наоборот.
Преимущества использовани
- Инкапсуляция стилей и скриптов: возможность инкапсуляции внешних файлов. Это предотвращает конфликт CSS и гарантирует, что изменения в одном компоненте не повлияют на другие части страницы.
- Повторное использование: позволяет создавать повторно используемые веб-компоненты, которые можно легко внедрять в различные проекты. Это значительно ускоряет процесс разработки и улучшает поддерживаемость кода.
- Упрощение тестирования: изолированные части легче тестировать, так как они не зависят от внешних файлов. Это позволяет создавать более надежные и предсказуемые тесты.
Примеры использования
Создание простого веб-компонента
Рассмотрим пример создания простого веб-компонента с использованием этой техники. Создадим кнопку, вид которой будут инкапсулирован.
class MyButton extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
<style>
button {
background-color: blue;
color: white;
padding: 10px;
border: none;
border-radius: 5px;
}
</style>
<button>Click Me</button>
`;
}
}
customElements.define('my-button', MyButton);
Пример использования
Теперь мы можем использовать наш компонент на странице как обычный HTML-тег:
<my-button></my-button>
Сложные компоненты
Shadow DOM также поддерживает создание более сложных компонентов, которые могут включать другие части, взаимодействовать между собой и обеспечивать сложную логику и стилизацию. Рассмотрим пример – виджет пользовательского профиля.
Пример: виджет профиля пользователя
Создадим компонент <user-profile>, который будет отображать информацию о пользователе, включая его имя, аватар и краткое описание. Он будет состоять из нескольких подкомпонентов и иметь собственный вид.
class UserProfile extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
<style>
.profile {
display: flex;
align-items: center;
padding: 10px;
background-color: #f0f0f0;
border-radius: 10px;
}
.avatar {
border-radius: 50%;
margin-right: 10px;
}
.details {
display: flex;
flex-direction: column;
}
.name {
font-weight: bold;
font-size: 1.2em;
}
.description {
font-size: 0.9em;
color: #666;
}
</style>
<div class="profile">
<img class="avatar" src="" alt="User Avatar" width="50" height="50">
<div class="details">
<span class="name"></span>
<span class="description"></span>
</div>
</div>
`;
}
connectedCallback() {
this.shadowRoot.querySelector('.avatar').src = this.getAttribute('avatar');
this.shadowRoot.querySelector('.name').textContent = this.getAttribute('name');
this.shadowRoot.querySelector('.description').textContent = this.getAttribute('description');
}
}
customElements.define('user-profile', UserProfile);
Использование сложного компонента
Теперь мы можем использовать наш сложный компонент на веб-странице, передавая необходимые данные через атрибуты:
<user-profile avatar="https://example.com/avatar.jpg" name="John Doe" description="Web Developer at Example Corp"></user-profile>
Этот компонент можно легко интегрировать в любую веб-страницу. Он демонстрирует, как Shadow DOM помогает инкапсулировать стили и структуру, предотвращая конфликты с другими элементами страницы и обеспечивая чистоту и читаемость кода.
Заключение
Технология предоставляет мощные инструменты для создания изолированных и повторно используемых компонентов. Она улучшает инкапсуляцию стилей и скриптов, упрощает тестирование и ускоряет разработку. Ее использование позволяет создавать более надежные и масштабируемые веб-приложения.
- Освой Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку (240$) бесплатно
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ