Веб-компоненты
Веб-компоненты — это набор различных технологий, позволяющий создавать переиспользуемые пользовательские элементы — с их функциональностью, изолированной от остальной части вашего кода — и использовать их в ваших веб-приложениях.
Концепции и использование
Как разработчики, мы все знаем, что повторное использование кода по возможности — хорошая идея. Традиционно это не было так просто для пользовательских структур разметки — вспомните сложные HTML-конструкции (и соответствующие стили и скрипты), которые иногда приходилось писать для рендеринга пользовательских элементов управления, и как их многократное использование может привести к хаосу на вашей странице, если вы не будете внимательны.
Веб-компоненты призваны решить такие проблемы — они состоят из трёх основных технологий, которые могут быть объединены для создания универсальных пользовательских элементов с изолированной функциональностью, которые могут быть повторно использованы где угодно без риска столкновений кода.
- Пользовательские элементы
-
Набор JavaScript-API, позволяющий определять пользовательские элементы и их поведение, которые затем можно использовать по своему усмотрению в вашем пользовательском интерфейсе.
- Тень DOM
-
Набор JavaScript-API для прикрепления изолированного "теневого" дерева DOM к элементу — которое рендерится отдельно от основного DOM документа — и управления связанной функциональностью. Таким образом, вы можете сохранить функции элемента конфиденциальными, чтобы их можно было программировать и стилизовать без опасения столкновений с другими частями документа.
- HTML-шаблоны
-
Элементы
<template>и<slot>позволяют вам создавать шаблоны разметки, которые не отображаются на рендеренной странице. Затем их можно многократно использовать в качестве основы структуры пользовательского элемента.
Базовый подход к реализации веб-компонента обычно выглядит примерно так:
- Создайте класс, в котором вы определите функциональность вашего веб-компонента, используя синтаксис класса.
- Зарегистрируйте ваш новый пользовательский элемент с помощью метода
CustomElementRegistry.define(), передав ему имя элемента, который необходимо определить, класс или функцию, в которой определяется его функциональность, и, необязательно, от которого элемента он наследует. - При необходимости прикрепите теневой DOM к пользовательскому элементу с помощью метода
Element.attachShadow(). Добавьте дочерние элементы, обработчики событий и т. д. в теневой DOM, используя обычные DOM-методы. - При необходимости определите HTML-шаблон с помощью
<template>и<slot>. Снова используйте стандартные DOM-методы для клонирования шаблона и прикрепления его к вашему теневому DOM. - Используйте ваш пользовательский элемент где угодно на вашей странице, как любой другой обычный HTML-элемент.
Руководства
- Использование пользовательских элементов
-
Руководство, демонстрирующее, как использовать возможности пользовательских элементов для создания простых веб-компонентов, а также рассматривает жизненный цикл обратных вызовов и некоторые другие расширенные функции.
- Использование теневого DOM
-
Руководство, которое рассматривает основы теневого DOM, показывая, как прикрепить теневой DOM к элементу, добавлять элементы в теневое дерево DOM, стилизовать его и многое другое.
- Использование шаблонов и слотов
-
Руководство, показывающее, как определить переиспользуемую HTML-структуру с помощью элементов
<template>и<slot>, и как затем использовать эту структуру внутри ваших веб-компонентов.
Справочник
Пользовательские элементы
CustomElementRegistry-
Содержит функциональность, связанную с пользовательскими элементами, в частности метод
CustomElementRegistry.define(), используемый для регистрации новых пользовательских элементов, чтобы их можно было затем использовать в вашем документе. Window.customElements-
Возвращает ссылку на объект
CustomElementRegistry. - Обратные вызовы жизненного цикла
-
Специальные функции обратного вызова, определённые внутри определения класса пользовательского элемента, влияющие на его поведение:
connectedCallback()-
Вызывается, когда пользовательский элемент впервые подключён к DOM документа.
disconnectedCallback()-
Вызывается, когда пользовательский элемент отключён от DOM документа.
adoptedCallback()-
Вызывается, когда пользовательский элемент перемещён в новый документ.
attributeChangedCallback()-
Вызывается, когда один из атрибутов пользовательского элемента добавлен, удалён или изменён.
- Расширения для создания пользовательских встроенных элементов
-
Определены следующие расширения:
- Глобальный HTML-атрибут
is -
Позволяет указать, что стандартный HTML-элемент должен вести себя как зарегистрированный пользовательский встроенный элемент.
- Параметр "is" метода
Document.createElement() -
Позволяет создать экземпляр стандартного HTML-элемента, который ведет себя как указанный зарегистрированный пользовательский встроенный элемент.
- Глобальный HTML-атрибут
- CSS псевдоклассы
-
Псевдоклассы, относящиеся конкретно к пользовательским элементам:
:defined-
Совпадает с любым элементом, который определен, включая встроенные элементы и пользовательские элементы, определенные с помощью
CustomElementRegistry.define(). :host-
Выбирает теневого хоста теневого DOM, содержащего CSS, внутри которого он используется.
:host()-
Выбирает теневого хоста теневого DOM, содержащего CSS, внутри которого он используется (позволяет выбирать пользовательский элемент внутри его теневого DOM) — но только если селектор, переданный в качестве параметра функции, соответствует теневому хосту.
:host-context()-
Выбирает теневого хоста теневого DOM, содержащего CSS, внутри которого он используется (позволяет выбирать пользовательский элемент внутри его теневого DOM) — но только если селектор, переданный в качестве параметра функции, соответствует предку(ам) теневого хоста в месте его расположения в иерархии DOM.
:state()-
Совпадает с пользовательскими элементами, которые находятся в указанном пользовательском состоянии. Более точно, он соответствует анонимным пользовательским элементам, где указанное состояние присутствует в
CustomStateSetэлемента.
- CSS псевдоэлементы
-
Псевдоэлементы, относящиеся конкретно к пользовательским элементам:
::part-
Представляет любой элемент внутри теневого дерева, имеющий соответствующий атрибут
part.
Теневой DOM
ShadowRoot-
Представляет корневой узел поддерева теневого DOM.
-
Elementрасширения -
Расширения интерфейса
Element, связанные с теневым DOM:- Метод
Element.attachShadow()прикрепляет дерево теневого DOM к указанному элементу. - Свойство
Element.shadowRootвозвращает корень тени, прикреплённый к указанному элементу, илиnull, если тень не прикреплена.
- Метод
- Соответствующие дополнения к
Node -
Дополнения к интерфейсу
Node, относящиеся к теневому DOM:- Метод
Node.getRootNode()возвращает корневой объект контекста, который необязательно включает корень тени, если он доступен. - Свойство
Node.isConnectedвозвращает булевое значение, указывающее, подключён ли узел (прямо или косвенно) к объекту контекста, например, к объектуDocumentв случае обычного DOM или кShadowRootв случае теневого DOM.
- Метод
-
Eventрасширения -
Расширения интерфейса
Event, относящиеся к теневому DOM:Event.composed-
Возвращает
true, если событие будет распространяться через границу теневого DOM в стандартный DOM, в противном случаеfalse. Event.composedPath-
Возвращает путь события (объекты, для которых будут вызваны обработчики). Это не включает узлы в теневых деревьях, если корень тени был создан с
ShadowRoot.modeзакрытым.
HTML-шаблоны
<template>-
Содержит фрагмент HTML, который не отображается при первоначальной загрузке содержащего документа, но может быть отображен во время выполнения с помощью JavaScript, в основном используется в качестве основы для структур пользовательских элементов. Соответствующий интерфейс DOM —
HTMLTemplateElement. <slot>-
Заполнитель внутри веб-компонента, который вы можете заполнить собственным разметкой, что позволяет создавать отдельные деревья DOM и представлять их вместе. Соответствующий интерфейс DOM —
HTMLSlotElement. - Глобальный атрибут HTML
slot -
Назначает слот в тенистом дереве DOM теневому элементу.
Element.assignedSlot-
Только для чтения атрибут, который возвращает ссылку на
<slot>, в который вставлен этот элемент. Text.assignedSlot-
Только для чтения атрибут, который возвращает ссылку на
<slot>, в который вставлен этот узел текста. -
Elementрасширения -
Расширения интерфейса
Element, относящиеся к слотам:Element.slot-
Возвращает имя теневого слота DOM, присоединённого к элементу.
- Псевдоэлементы CSS
-
Псевдоэлементы, относящиеся конкретно к слотам:
::slotted-
Сопоставляет любой контент, который вставляется в слот.
- Событие
slotchange -
Вызывается на экземпляре
HTMLSlotElement(<slot>элемент), когда узел(ы), содержащиеся в этом слоте, изменяются.
Примеры
Мы создаем ряд примеров в нашем репозитории GitHub web-components-examples. По мере времени будут добавлены новые.
Спецификации
| Спецификация |
|---|
| HTML # the-template-element |
| DOM # interface-shadowroot |
Совместимость с браузерами
| Настольные | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
Web_components |
53 | 79 | 63 | 40 | 10 | 53 | 63 | 41 | 10 | 6.0 | 53 |
activeElement |
53 | 79 | 63 | 40 | 10 | 53 | 63 | 41 | 10 | 6.0 | 53 |
adoptedStyleSheets |
73 | 79 | 101 | 60 | 16.4 | 73 | 101 | 50 | 16.4 | 11.0 | 73 |
clonable |
124 | 124 | 123 | 110 | 17.4 | 124 | 123 | 82 | 17.4 | 27.0 | 124 |
delegatesFocus |
53 | 79 | 94 | 40 | 15 | 53 | 94 | 41 | 15 | 6.0 | 53 |
elementFromPoint |
53До Chrome 66, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
79 | 63 | 40До Opera 53, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
10.1 | 53До Chrome Android 66, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
63 | 41До Opera Android 47, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
10.3 | 6.0До Samsung Internet 9.0, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
53До WebView Android 66, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
elementsFromPoint |
53До Chrome 66, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
79 | 63 | 40 | 11.1 | 53До Chrome Android 66, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
63 | 41 | 11.3 | 6.0До Samsung Internet 9.0, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
53До WebView Android 66, этот метод возвращалnull когда элемент был дочерним элементом узла-хоста. Смотрите ошибку 40537452. |
fullscreenElement |
71 | 79 | 6463 | 58 | 16.4 | 71 | 6463 | 50 | 16.4["Доступно только на iPad, не на iPhone.", "Показывает кнопку оверлея, которую нельзя отключить. Проведение пальцем вниз выходит из полноэкранного режима, что делает его непригодным для некоторых случаев использования, таких как игры."] |
10.0 | 71 |
getAnimations |
84 | 84 | 75 | 70 | 14 | 84 | 79 | 60 | 14 | 14.0 | 84 |
getHTML |
125 | 125 | 128 | 111 | 18 | 125 | 128 | 83 | 18 | 27.0 | 125 |
getSelection |
53 | 79 | Нет | 40 | Нет | 53 | Нет | 41 | Нет | 6.0 | 53 |
host |
53 | 79 | 63 | 40 | 10 | 53 | 63 | 41 | 10 | 6.0 | 53 |
innerHTML |
53 | 79 | 63 | 40 | 10 | 53 | 63 | 41 | 10 | 6.0 | 53 |
mode |
53 | 79 | 63 | 40 | 10.1 | 53 | 63 | 41 | 10.3 | 6.0 | 53 |
pictureInPictureElement |
69 | 79 | Нет | 56 | 13.1 | 105 | Нет | 72 | 13.4 | 20.0 | 105 |
pointerLockElement |
53 | 79 | 63 | 40 | 10.1 | 53 | 63 | 41 | Нет | 6.0 | 53 |
serializable |
125 | 125 | 128 | 111 | 18 | 125 | 128 | 83 | 18 | 27.0 | 125 |
setHTMLUnsafe |
124 | 124 | 123 | 110 | 17.4 | 124 | 123 | 82 | 17.4 | 27.0 | 124 |
slotAssignment |
86 | 86 | 92 | 72 | 16.4 | 86 | 92 | 61 | 16.4 | 14.0 | 86 |
styleSheets |
53 | 79 | 63 | 40 | 12.1 | 53 | 63 | 41 | 12.2 | 6.0 | 53 |
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
Web_components |
26 | 13 | 22 | 15 | 8 | 26 | 22 | 14 | 8 | 1.5 | 4.4 |
shadowrootclonable |
124 | 124 | 125 | 110 | Нет | 124 | 125 | 82 | Нет | 27.0 | 124 |
shadowrootdelegatesfocus |
123 | 123 | 123 | 109 | Нет | 123 | 123 | 82 | Нет | 27.0 | 123 |
shadowrootmode |
11190–111 | 11190–111 | 123 | 9776–97 | 16.4 | 11190–111 | 123 | 7564–75 | 16.4 | 22.015.0–22.0 | 11190–111 |
shadowrootserializable |
125 | 125 | Нет | 111 | Нет | 125 | Нет | 83 | Нет | 27.0 | 125 |
Шаблон html.elements
Таблицы BCD загружаются только в браузере
api.ShadowRoot
Таблицы BCD загружаются только в браузере
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Web_components