---
title: Веб-компоненты
slug: Web/Web_Components
translation_of: Web/Web_Components
---
{{DefaultAPISidebar("Веб-компоненты")}}
Веб-компоненты - это набор различных технологий, позволяющих создавать повторно используемые настраиваемые элементы с их функциональностью, инкапсулированной отдельно от остальной части вашего кода - и использовать их в ваших веб-приложениях.
Понятия и использование
Как разработчики, все мы знаем, что как можно больше повторного использования кода - хорошая идея. Традиционно это было не так просто для пользовательских структур разметки - подумайте о сложном HTML (и связанном с ним стиле и сценарии), которые вам иногда приходилось писать для визуализации пользовательских элементов управления UI, и о том, как их многократное использование может превратить вашу страницу в беспорядок если вы не будете осторожны.
Веб-компоненты направлены на решение таких проблем - они состоят из трех основных технологий, которые можно использовать вместе для создания универсальных настраиваемых элементов с инкапсулированной функциональностью, которые можно повторно использовать где угодно, не опасаясь коллизий кода.
- Пользовательские элементы: набор API-интерфейсов JavaScript, позволяющих определять пользовательские элементы и их поведение, которые затем можно использовать по желанию в пользовательском интерфейсе.
- Shadow DOM: набор API-интерфейсов JavaScript для прикрепления инкапсулированного «теневого» дерева DOM к элементу, который отображается отдельно от DOM основного документа, и управления соответствующими функциями. Таким образом, вы можете сохранить функции элемента в секрете, поэтому для них можно создавать сценарии и стили, не опасаясь коллизий с другими частями документа.
- HTML templates: элементы {{HTMLElement("template")}} и {{HTMLElement("slot")}} позволяют создавать шаблоны разметки, которых не видно на отображаемой странице. Затем их можно многократно использовать в качестве основы структуры настраиваемого элемента.
Базовый подход к реализации веб-компонента обычно выглядит примерно так:
- Создайте класс, в котором вы указываете функциональность своего веб-компонента, используя синтаксис классов ECMAScript 2015 (дополнительную информацию см. в разделе Классы).
- Зарегистрируйте свой новый настраиваемый элемент с помощью метода {{domxref("CustomElementRegistry.define()")}}, передав ему имя элемента, который будет определен, класс или функцию, в которых указана его функциональность, и, необязательно, от какого элемента он наследуется.
- При необходимости прикрепите теневую DOM к настраиваемому элементу с помощью метода {{domxref("Element.attachShadow()")}}. Добавьте дочерние элементы, прослушиватели событий и т.д. в теневой DOM, используя обычные методы DOM.
- При необходимости определите HTML template, используя {{htmlelement("template")}} и {{htmlelement("slot")}}. Снова используйте обычные методы DOM, чтобы клонировать шаблон и прикрепить его к вашей теневой DOM.
- Используйте свой настраиваемый элемент везде, где хотите, на своей странице, как и любой обычный элемент HTML.
Учебники
- Использование пользовательских элементов
- Руководство, показывающее, как использовать функции настраиваемых элементов для создания простых веб-компонентов, а также рассказывает про обратные вызовы жизненного цикла и некоторые другие более сложные функции.
- Использование shadow DOM
- Руководство, которое рассматривает основы теневой DOM, показывает, как прикрепить теневую DOM к элементу, добавлять к теневому дереву DOM, стилизовать его и многое другое.
- Использование шаблонов и слотов
- Руководство, показывающее, как определить повторно используемую структуру HTML с помощью элементов {{htmlelement("template")}} и {{htmlelement ("slot")}}, а затем использовать эту структуру внутри ваших веб-компонентов.
Справка
Пользовательские элементы
- {{domxref("CustomElementRegistry")}}
- Содержит функции, связанные с настраиваемыми элементами, в первую очередь с методом {{domxref("CustomElementRegistry.define()")}}, используемым для регистрации новых настраиваемых элементов, чтобы их можно было затем использовать в вашем документе.
- {{domxref("Window.customElements")}}
- Возвращает ссылку на объект
CustomElementRegistry
.
- Обратные вызовы жизненного цикла
- Специальные функции обратного вызова, определенные внутри определения класса настраиваемого элемента, которые влияют на его поведение:
connectedCallback
: вызывается, когда настраиваемый элемент впервые подключается к DOM документа.
disconnectedCallback
: вызывается, когда пользовательский элемент отключается от DOM документа.
adoptedCallback
: вызывается, когда настраиваемый элемент перемещается в новый документ.
attributeChangedCallback
: вызывается при добавлении, удалении или изменении одного из атрибутов настраиваемого элемента.
- Расширения для создания пользовательских встроенных элементов
-
- Глобальный атрибут HTML {{htmlattrxref("is")}}: позволяет указать, что стандартный элемент HTML должен вести себя как зарегистрированный встроенный пользовательский элемент.
- Параметр «is» метода {{domxref("Document.createElement()")}}: позволяет создать экземпляр стандартного HTML-элемента, который ведет себя как заданный зарегистрированный настраиваемый встроенный элемент.
- Псевдоклассы CSS
- Псевдоклассы, относящиеся конкретно к настраиваемым элементам:
- {{cssxref(":defined")}}: Соответствует любому заданному элементу, включая встроенные элементы и настраиваемые элементы, определенные с помощью
CustomElementRegistry.define()
.
- {{cssxref(":host")}}: Выбирает теневой хост теневого DOM, содержащего CSS, внутри которого он используется.
- {{cssxref(":host()")}}: Выбирает теневой хост теневой DOM, содержащий CSS, внутри которого он используется (так что вы можете выбрать пользовательский элемент изнутри его теневой DOM) - но только если селектор, указанный в качестве параметра функции, совпадает с теневым хостом.
- {{cssxref(":host-context()")}}: Выбирает теневой хост теневой DOM, содержащий CSS, внутри которого он используется (так что вы можете выбрать пользовательский элемент изнутри его теневой DOM) - но только если селектор, указанный в качестве параметра функции, совпадает с предком(-ами) теневого хоста в том месте, где он находится внутри иерархии DOM.
- Псевдоэлементы CSS
- Псевдоэлементы, относящиеся конкретно к настраиваемым элементам:
- {{cssxref("::part")}}: Представляет любой элемент в теневом дереве, имеющий соответствующий атрибут {{HTMLAttrxRef("part")}}.
Shadow DOM
- {{domxref("ShadowRoot")}}
- Представляет корневой узел поддерева теневой модели DOM.
- {{domxref("DocumentOrShadowRoot")}}
- Миксин, определяющий функции, доступные для всех документов и теневых корневых узлов.
- Расширения {{domxref("Element")}}
- Расширения интерфейса
Element
, связанные с теневой DOM:
- Метод {{domxref("Element.attachShadow()")}} прикрепляет теневое дерево DOM к указанному элементу.
- Свойство {{domxref ("Element.shadowRoot")}} возвращает теневой корневой узел, прикрепленный к указанному элементу, или значение
null
, если корневой узел не прикреплен.
- Соответствующие дополнения {{domxref("Node")}}
- Дополнения к интерфейсу
Node
, относящиеся к теневой DOM:
- Метод {{domxref("Node.getRootNode()")}} возвращает корень объекта контекста, который необязательно включает теневой корневой узел, если он доступен.
- Свойство {{domxref("Node.isConnected")}} возвращает логическое значение, указывающее, подключен ли узел (прямо или косвенно) к объекту контекста, например объект {{domxref("Document")}} в случае обычного DOM или {{domxref("ShadowRoot")}} в случае теневого DOM.
- Расширения {{domxref("Event")}}
- Расширения интерфейса
Event
, относящиеся к теневой модели DOM:
- {{domxref("Event.composed")}}: возвращает {{jsxref("Boolean")}}, который указывает, будет ли событие распространяться через границу теневой DOM в стандартную DOM (
true
) или нет (false
).
- {{domxref ("Event.composedPath")}}: возвращает путь к событию (объекты, для которых будут вызваны слушатели). Это не включает узлы в теневых деревьях, если теневой корневой узел был создан с закрытым {{domxref("ShadowRoot.mode")}}.
HTML templates
- {{htmlelement("template")}}
- Содержит фрагмент HTML, который не отображается при первоначальной загрузке содержащего документа, но может отображаться во время выполнения с помощью JavaScript, который в основном используется в качестве основы для структур настраиваемых элементов. Связанный интерфейс DOM - {{domxref("HTMLTemplateElement")}}.
- {{htmlelement("slot")}}
- Заполнитель внутри веб-компонента, который можно заполнить собственной разметкой, что позволяет создавать отдельные деревья DOM и представлять их вместе. Связанный интерфейс DOM - {{domxref("HTMLSlotElement")}}.
- Глобальный HTML атрибут
slot
- Назначает слот элементу в теневом дереве теневого DOM.
- {{domxref("Slotable")}}
- Миксин, реализованный как узлами {{domxref("Element")}}, так и {{domxref("Text")}}, определяющий функции, которые позволяют им стать содержимым элемента {{htmlelement("slot")}}. Миксин определяет один атрибут, {{domxref("Slotable.assignedSlot")}}, который возвращает ссылку на слот, в который вставлен узел.
- {{domxref("Element")}} extensions
- Расширения интерфейса
Element
, относящиеся к слотам:
- {{domxref("Element.slot")}}: Возвращает имя слота теневого DOM, прикрепленного к элементу.
- Псевдоэлементы CSS
- Псевдоэлементы, относящиеся конкретно к слотам:
- {{cssxref("::slotted")}}: Соответствует любому содержимому, вставленному в слот.
- Событие {{event("slotchange")}}
- Вызывается для экземпляра {{domxref("HTMLSlotElement")}} (элемент {{htmlelement("slot")}}) при изменении узла(-ов), содержащихся в этом слоте.
Примеры
Мы создаем ряд примеров в репозитории GitHub с примерами веб-компонентов. Со временем будет добавлено больше.
Спецификации
Спецификация |
Статус |
Комментарии |
{{SpecName("HTML WHATWG","scripting.html#the-template-element","<template> element")}} |
{{Spec2("HTML WHATWG")}} |
Определение {{HTMLElement("template")}}. |
{{SpecName("HTML WHATWG","custom-elements.html#custom-elements","custom elements")}} |
{{Spec2("HTML WHATWG")}} |
Определение пользовательских HTML элементов |
{{SpecName("DOM WHATWG","#shadow-trees","shadow trees")}} |
{{Spec2("DOM WHATWG")}} |
Определение Shadow DOM |
{{SpecName("HTML Imports", "", "")}} |
{{Spec2("HTML Imports")}} |
Начальное определение HTML импорта |
{{SpecName("Shadow DOM", "", "")}} |
{{Spec2("Shadow DOM")}} |
Начальное определение Shadow DOM |
Совместимость с браузерами
В основном:
- Веб-компоненты по умолчанию поддерживаются в Firefox (версия 63), Chrome и Opera.
- Safari поддерживает ряд функций веб-компонентов, но меньше, чем указанные выше браузеры.
- Edge работает над реализацией.
Для получения подробной информации о поддержке определенных функций браузером обратитесь к перечисленным выше справочным страницам.
Смотрите также
- webcomponents.org - сайт с примерами веб-компонентов, учебными пособиями и другой информацией.
- FAST - это библиотека веб-компонентов, созданная Microsoft, которая предлагает несколько пакетов для использования в зависимости от потребностей вашего проекта. Fast Element - это легкое средство для простого создания производительных, эффективных с точки зрения памяти и совместимых со стандартами веб-компонентов. Fast Foundation - это библиотека классов, шаблонов и других утилит веб-компонентов, построенная на основе fast-element, предназначенная для создания зарегистрированных веб-компонентов.
- Hybrids - библиотека веб-компонентов с открытым исходным кодом, которая предпочитает простые объекты и чистые функции
class
и this
синтаксису. Он предоставляет простой и функциональный API для создания пользовательских элементов.
- Polymer - каркас веб-компонентов Google - набор полифилов, улучшений и примеров. На данный момент самый простой способ кроссбраузерно использовать веб-компоненты.
- Snuggsi - Простые веб-компоненты размером ~ 1 КБ, включая полифил - Все, что вам нужно, это браузер и базовое понимание классов HTML, CSS и JavaScript для продуктивной работы.
- Slim.js - библиотека веб-компонентов с открытым исходным кодом - высокопроизводительная библиотека для быстрой и простой разработки компонентов; расширяемая, подключаемая и кросс-платформенная.
- Stencil - набор инструментов для создания многоразовых масштабируемых систем проектирования в веб-компонентах.