Технология Shadow DOM является важной частью современной веб-разработки. Она позволяет создавать инкапсулированные элементы на веб-страницах, обеспечивая изоляцию стилей и скриптов. В этой статье мы рассмотрим основные концепции, его преимущества и примеры использования.

Что такое DOM?

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

ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ 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
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку (240$) бесплатно
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно