Spec-Zone.ru › Web APIs

Веб-компоненты

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

Концепции и использование

Как разработчики, мы все знаем, что повторное использование кода по возможности — хорошая идея. Традиционно это не было так просто для пользовательских структур разметки — вспомните сложные HTML-конструкции (и соответствующие стили и скрипты), которые иногда приходилось писать для рендеринга пользовательских элементов управления, и как их многократное использование может привести к хаосу на вашей странице, если вы не будете внимательны.

Веб-компоненты призваны решить такие проблемы — они состоят из трёх основных технологий, которые могут быть объединены для создания универсальных пользовательских элементов с изолированной функциональностью, которые могут быть повторно использованы где угодно без риска столкновений кода.

Пользовательские элементы

Набор JavaScript-API, позволяющий определять пользовательские элементы и их поведение, которые затем можно использовать по своему усмотрению в вашем пользовательском интерфейсе.

Тень DOM

Набор JavaScript-API для прикрепления изолированного "теневого" дерева DOM к элементу — которое рендерится отдельно от основного DOM документа — и управления связанной функциональностью. Таким образом, вы можете сохранить функции элемента конфиденциальными, чтобы их можно было программировать и стилизовать без опасения столкновений с другими частями документа.

HTML-шаблоны

Элементы <template> и <slot> позволяют вам создавать шаблоны разметки, которые не отображаются на рендеренной странице. Затем их можно многократно использовать в качестве основы структуры пользовательского элемента.

Базовый подход к реализации веб-компонента обычно выглядит примерно так:

  1. Создайте класс, в котором вы определите функциональность вашего веб-компонента, используя синтаксис класса.
  2. Зарегистрируйте ваш новый пользовательский элемент с помощью метода CustomElementRegistry.define(), передав ему имя элемента, который необходимо определить, класс или функцию, в которой определяется его функциональность, и, необязательно, от которого элемента он наследует.
  3. При необходимости прикрепите теневой DOM к пользовательскому элементу с помощью метода Element.attachShadow(). Добавьте дочерние элементы, обработчики событий и т. д. в теневой DOM, используя обычные DOM-методы.
  4. При необходимости определите HTML-шаблон с помощью <template> и <slot>. Снова используйте стандартные DOM-методы для клонирования шаблона и прикрепления его к вашему теневому DOM.
  5. Используйте ваш пользовательский элемент где угодно на вашей странице, как любой другой обычный 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-элемента, который ведет себя как указанный зарегистрированный пользовательский встроенный элемент.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API