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

Веб-компоненты состоят из трех ключевых технологий: пользовательских элементов, теневого DOM и шаблонов HTML.
Пользовательские элементы предоставляют разработчикам возможность создавать свои собственные пользовательские элементы HTML. Вот пример пользовательского элемента, который расширяет существующий элемент кнопки HTML:
class MyButton extends HTMLButtonElement {
constructor() {
super();
this.addEventListener('click', () => {
console.log('My button was clicked!');
});
}
}
customElements.define('my-button', MyButton, { extends: 'button' });
В этом примере мы создали пользовательский элемент с именем my-button, который расширяет элемент button. Функция-конструктор добавляет к кнопке прослушиватель событий щелчка, записывая сообщение в консоль при нажатии кнопки. Метод customElements.define() регистрирует наш пользовательский элемент в браузере.
Shadow DOM предоставляет разработчикам возможность инкапсулировать стили и поведение пользовательского элемента. Вот пример использования Shadow DOM:
class MyComponent extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
const template = document.createElement('template');
template.innerHTML = `
<style>
.my-class {
color: red;
}
</style>
<div class="my-class">
<slot></slot>
</div>
`;
shadowRoot.appendChild(template.content.cloneNode(true));
}
}
customElements.define('my-component', MyComponent);
В этом примере мы создали пользовательский элемент с именем my-component, который инкапсулирует свои стили и поведение с помощью Shadow DOM. Метод attachShadow() создает новое дерево Shadow DOM для элемента, а элемент template содержит HTML и CSS для компонента. Элемент slot — это заполнитель для содержимого, которое добавляется к компоненту при его использовании.
Шаблоны HTML предоставляют разработчикам возможность определять структуру пользовательского элемента. Вот пример того, как использовать шаблоны HTML:
class MyList extends HTMLElement {
constructor() {
super();
const template = document.getElementById('my-list-template');
const content = template.content.cloneNode(true);
this.appendChild(content);
}
}
customElements.define('my-list', MyList);
В этом примере мы создали пользовательский элемент с именем my-list, который использует шаблон HTML для определения своей структуры. Метод document.getElementById() извлекает элемент my-list-template, а метод cloneNode() создает копию содержимого шаблона. Наконец, метод appendChild() добавляет содержимое к элементу my-list.
Готовые к использованию веб-компоненты: https://www.webcomponents.org/
Таким образом, веб-компоненты обеспечивают стандартизированный подход к созданию и совместному использованию многократно используемых компонентов пользовательского интерфейса. С помощью Custom Elements, Shadow DOM и HTML Templates разработчики могут создавать собственные элементы с инкапсулированными стилями и поведением, которые можно использовать в нескольких веб-проектах.