Web Components
Web Components ist eine Suite verschiedener Technologien, die es Ihnen ermöglicht, wiederverwendbare benutzerdefinierte Elemente zu erstellen, deren Funktionalität von Ihrem restlichen Code gekapselt ist, und sie in Ihren Webanwendungen zu nutzen.
Konzepte und Nutzung
Als Entwickler wissen wir alle, dass es eine gute Idee ist, Code so oft wie möglich wiederzuverwenden. Dies war traditionell nicht so einfach für benutzerdefinierte Markup-Strukturen — denken Sie an die komplexe HTML (und die dazugehörigen Stile und Skripte), die Sie manchmal schreiben mussten, um benutzerdefinierte UI-Kontrollen darzustellen, und wie die mehrfache Verwendung dieser Strukturen Ihre Seite in ein Chaos verwandeln kann, wenn Sie nicht vorsichtig sind.
Web Components zielt darauf ab, solche Probleme zu lösen — es besteht aus drei Haupttechnologien, die zusammen verwendet werden können, um vielseitige benutzerdefinierte Elemente mit gekapselter Funktionalität zu erstellen, die Sie überall ohne Bedenken über Code-Kollisionen wiederverwenden können.
- Benutzerdefinierte Elemente
-
Eine Reihe von JavaScript-APIs, die es Ihnen erlaubt, benutzerdefinierte Elemente und deren Verhalten zu definieren, die dann in Ihrer Benutzeroberfläche nach Belieben verwendet werden können.
- Shadow DOM
-
Eine Reihe von JavaScript-APIs zum Anhängen eines gekapselten "Schatten"-DOM-Baums an ein Element — der getrennt vom Haupdokument-DOM gerendert wird — und zur Steuerung der damit verbundenen Funktionalität. Auf diese Weise können Sie die Funktionen eines Elements privat halten, sodass sie gescriptet und gestylt werden können, ohne dass es zu Kollisionen mit anderen Teilen des Dokuments kommt.
- HTML-Templates
-
Die
<template>
- und<slot>
-Elemente ermöglichen es Ihnen, Markup-Templates zu schreiben, die nicht auf der gerenderten Seite angezeigt werden. Diese können dann mehrfach als Grundlage der Struktur eines benutzerdefinierten Elements verwendet werden.
Der grundlegende Ansatz zur Implementierung eines Webkomponenten sieht in der Regel etwa wie folgt aus:
- Erstellen Sie eine Klasse, in der Sie die Funktionalität Ihrer Webkomponente mit der class-Syntax festlegen.
- Registrieren Sie Ihr neues benutzerdefiniertes Element mit der Methode
CustomElementRegistry.define()
, indem Sie den zu definierenden Elementnamen übergeben, die Klasse oder Funktion, in der die Funktionalität festgelegt ist, und optional das Element, von dem es erbt. - Falls erforderlich, fügen Sie dem benutzerdefinierten Element ein Shadow DOM hinzu, indem Sie die Methode
Element.attachShadow()
verwenden. Fügen Sie Kind-Elemente, Event-Listener usw. mithilfe regulärer DOM-Methoden dem Shadow DOM hinzu. - Falls erforderlich, definieren Sie ein HTML-Template mithilfe von
<template>
und<slot>
. Verwenden Sie erneut reguläre DOM-Methoden, um das Template zu klonen und an Ihr Shadow DOM anzuhängen. - Verwenden Sie Ihr benutzerdefiniertes Element überall auf Ihrer Seite, so wie Sie es mit jedem regulären HTML-Element tun würden.
Leitfäden
- Verwendung benutzerdefinierter Elemente
-
Ein Leitfaden, der zeigt, wie Sie die Funktionen von benutzerdefinierten Elementen nutzen, um einfache Webkomponenten zu erstellen, sowie auf Lebenszyklus-Callbacks und einige weitere fortgeschrittene Funktionen eingeht.
- Verwendung von Shadow DOM
-
Ein Leitfaden, der die Grundlagen von Shadow DOM behandelt und zeigt, wie Sie ein Shadow DOM an ein Element anhängen, den Shadow DOM-Baum hinzufügen, stylen und mehr.
- Verwendung von Templates und Slots
-
Ein Leitfaden, der zeigt, wie Sie mit den Elementen
<template>
und<slot>
eine wiederverwendbare HTML-Struktur definieren und diese dann in Ihren Webkomponenten verwenden.
Referenz
Benutzerdefinierte Elemente
CustomElementRegistry
-
Beinhaltet Funktionen im Zusammenhang mit benutzerdefinierten Elementen, insbesondere die Methode
CustomElementRegistry.define()
, die zur Registrierung neuer benutzerdefinierter Elemente verwendet wird, damit sie anschließend in Ihrem Dokument genutzt werden können. Window.customElements
-
Gibt eine Referenz auf das
CustomElementRegistry
-Objekt zurück. - Lebenszyklus-Callbacks
-
Spezielle Callback-Funktionen, die innerhalb der Klassendefinition eines benutzerdefinierten Elements definiert werden und dessen Verhalten beeinflussen:
connectedCallback()
-
Wird aufgerufen, wenn das benutzerdefinierte Element zum ersten Mal mit dem DOM des Dokuments verbunden wird.
disconnectedCallback()
-
Wird aufgerufen, wenn das benutzerdefinierte Element vom DOM des Dokuments getrennt wird.
adoptedCallback()
-
Wird aufgerufen, wenn das benutzerdefinierte Element in ein neues Dokument verschoben wird.
attributeChangedCallback()
-
Wird aufgerufen, wenn eines der Attribute des benutzerdefinierten Elements hinzugefügt, entfernt oder geändert wird.
- Erweiterungen zur Erstellung benutzerdefinierter eingebauter Elemente
-
Die folgenden Erweiterungen sind definiert:
- Das globale HTML-Attribut
is
-
Erlaubt Ihnen, zu spezifizieren, dass ein Standard-HTML-Element wie ein registriertes benutzerdefiniertes eingebautes Element verhalten soll.
- Die "is"-Option der Methode
Document.createElement()
-
Ermöglicht Ihnen die Erstellung einer Instanz eines Standard-HTML-Elements, das sich wie ein gegebenes registriertes benutzerdefiniertes eingebautes Element verhält.
- Das globale HTML-Attribut
- CSS-Pseudoklassen
-
Pseudoklassen, die speziell für benutzerdefinierte Elemente gelten:
:defined
-
Passt auf jedes Element, das definiert ist, einschließlich eingebauter Elemente und benutzerdefinierter Elemente, die mit
CustomElementRegistry.define()
definiert wurden. :host
-
Wählt den Schatten-Host des Shadow DOM aus, das das CSS enthält, in dem es verwendet wird.
:host()
-
Wählt den Schatten-Host des Shadow DOM aus, das das CSS enthält, in dem es verwendet wird (so dass Sie ein benutzerdefiniertes Element von innerhalb seines Shadow DOM auswählen können) — aber nur, wenn der als Parameter der Funktion angegebene Selektor mit dem Schatten-Host übereinstimmt.
:host-context()
-
Wählt den Schatten-Host des Shadow DOM aus, das das CSS enthält, in dem es verwendet wird (so dass Sie ein benutzerdefiniertes Element von innerhalb seines Shadow DOM auswählen können) — aber nur, wenn der als Parameter der Funktion angegebene Selektor mit den Vorfahren des Schatten-Hosts in der DOM-Hierarchie übereinstimmt, wo er sich befindet.
:state()
-
Passt auf benutzerdefinierte Elemente, die sich in einem bestimmten benutzerdefinierten Zustand befinden. Genauer gesagt, es passt auf anonyme benutzerdefinierte Elemente, bei denen der angegebene Zustand im
CustomStateSet
des Elements vorhanden ist.
- CSS-Pseudoelemente
-
Pseudoelemente, die speziell für benutzerdefinierte Elemente gelten:
::part
-
Repräsentiert ein Element innerhalb eines Schattenbaums, das ein passendes
part
-Attribut hat.
Shadow DOM
ShadowRoot
-
Repräsentiert den Wurzelknoten eines Shadow DOM-Teilbaums.
- Erweiterungen des
Element
-
Erweiterungen der
Element
-Schnittstelle, die sich auf Shadow DOM beziehen:- Die Methode
Element.attachShadow()
hängt einen Shadow DOM-Baum an das angegebene Element an. - Die Eigenschaft
Element.shadowRoot
gibt die an das angegebene Element angehängte Shadow-Root zurück odernull
, wenn kein Shadow-Root angehängt ist.
- Die Methode
- Relevante Ergänzungen des
Node
-
Ergänzungen der
Node
-Schnittstelle, die sich auf Shadow DOM beziehen:- Die Methode
Node.getRootNode()
gibt die Wurzel des Kontextobjekts zurück, welche optional das Shadow Root einschließt, wenn es verfügbar ist. - Die Eigenschaft
Node.isConnected
gibt einen Boolean-Wert zurück, der angibt, ob der Knoten direkt oder indirekt mit dem Kontextobjekt verbunden ist, z. B. dasDocument
-Objekt im Fall des normalen DOM oder dasShadowRoot
im Fall eines Shadow DOM.
- Die Methode
- Erweiterungen des
Event
-
Erweiterungen der
Event
-Schnittstelle bezüglich Shadow DOM:Event.composed
-
Gibt
true
zurück, wenn das Ereignis die Shadow-DOM-Grenze in das Standard-DOM überschreiten wird, ansonstenfalse
. Event.composedPath
-
Gibt den Pfad des Ereignisses zurück (Objekte, bei denen Listener aufgerufen werden). Dies schließt keine Knoten in Schattenbäumen ein, wenn der Schatten-Root mit
ShadowRoot.mode
geschlossen erstellt wurde.
HTML-Templates
<template>
-
Enthält ein HTML-Fragment, das nicht gerendert wird, wenn ein enthaltendes Dokument initial geladen wird, aber zur Laufzeit mit JavaScript angezeigt werden kann, hauptsächlich als Grundlage von benutzerdefinierten Elementstrukturen verwendet. Die zugehörige DOM-Schnittstelle ist
HTMLTemplateElement
. <slot>
-
Ein Platzhalter innerhalb einer Webkomponente, den Sie mit Ihrem eigenen Markup füllen können, wodurch Sie separate DOM-Bäume erstellen und zusammen präsentieren können. Die zugehörige DOM-Schnittstelle ist
HTMLSlotElement
. - Das globale HTML-Attribut
slot
-
Weist einem Element einen Slot in einem Schatten-DOM-Schattenbaum zu.
Element.assignedSlot
-
Ein schreibgeschütztes Attribut, das eine Referenz auf den
<slot>
zurückgibt, in den dieses Element eingefügt wird. Text.assignedSlot
-
Ein schreibgeschütztes Attribut, das eine Referenz auf den
<slot>
zurückgibt, in den dieser Textknoten eingefügt wird. - Erweiterungen des
Element
-
Erweiterungen der
Element
-Schnittstelle, die sich auf Slots beziehen:Element.slot
-
Gibt den Namen des Shadow-DOM-Slots zurück, der an das Element angehängt ist.
- CSS-Pseudoelemente
-
Pseudoelemente, die speziell für Slots gelten:
::slotted
-
Passt auf jeden Inhalt, der in einen Slot eingefügt wird.
- Das
slotchange
-Ereignis -
Wird auf einer Instanz von
HTMLSlotElement
(<slot>
-Element) ausgelöst, wenn das/Node(s), die in diesem Slot enthalten sind, sich ändern.
Beispiele
Wir bauen derzeit eine Reihe von Beispielen in unserem web-components-examples GitHub-Repository auf. Weitere werden im Laufe der Zeit hinzugefügt.
Spezifikationen
Specification |
---|
HTML # the-template-element |
DOM # interface-shadowroot |