Веб-компоненты — это набор технологий, которые предоставляют разработчикам возможность создавать повторно используемые пользовательские 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 разработчики могут создавать собственные элементы с инкапсулированными стилями и поведением, которые можно использовать в нескольких веб-проектах.