Web Components/Shadow DOM

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche
Web Components Logo

Moderne Webseiten werden immer komplexer und nehmen Inhalte Dritter, Widgets und Bausteine aus vielen anderen Quellen wie CDNs und Ähnlichem auf. Die Einbindung erfolgt entweder gekapselt innerhalb eines iframe oder optimalerweise per AjaX, um die Webseite einheitlich gestalten zu können. Dabei entsteht die Gefahr, dass sich Markup, Skripte und CSS-Regeln gegenseitg in die Quere kommen, wenn Klassen oder IDs mehrfach vergeben werden oder wenn die Spezifität mehrerer Regeln nicht mehr klar ist und nur noch durch das Schlüsselwort !important erreicht werden kann.

Mit Web Components können Sie im Shadow-DOM eigene wiederverwendbare Bausteine entwerfen, deren HTML-Elemente gekapselt sind und deren CSS nur in diesem Gültigkeitsbereich angewandt wird. Diese werden ins normale DOM der Webseite eingehängt und sind für Debugger und Skripte nicht direkt sicht- und ansprechbar.


Funktionsweise

Die Vorgehensweise hinter dem Shadow-DOM findet sich schon länger bei komplexeren HTML-Elementen wieder. So bestehen Slider, das details-Element mit seinem summary-Marker oder Player wie audio und video nur aus einem Element, das aber aus mehreren „versteckten“ Elementen zusammengebaut ist.

In den Chrome-Developer-Tools können Sie dies unter F12 > Settings > Preferences > Elements > Show User-Agent Shadow DOM anklicken und sichtbar machen.

Das audio-Element besteht in dieser erweiterten Ansicht plötzlich aus mehreren div- und input-Elementen:

Screenshot des Shadow-DOM eines audio-Elements

Diese Elemente können im Allgemeinen weder mit JavaScript angesprochen noch mit CSS formatiert werden.

Shadow-Host & Shadow-Root

  • Shadow Host (englisch für Gastknoten): das DOM-Element, das als Einfügepunkt den Elementenbaum des Shadow-DOM aufnimmt.
  • Shadow Root (englisch für Wurzel): Wurzelelement des Teilbaums des Shadow-DOM. Dies ist ein Knoten, der die Grenze zwischen „normalem“ und „verstecktem“ DOM darstellt. Diese Grenze kapselt die Knoten des Shadow-DOM von Skripten und CSS-Regeln der Webseite.
  • Shadow DOM (englisch für Schatten DOM): „versteckter“ und gekapselter Teilbaum des Elementenbaums, der nicht für andere Skripte und CSS-Regeln zugänglich ist.
  • Shadow Boundary (englisch für Grenze des „versteckten“ DOM)

Verwendung

Das Shadow-DOM kann genauso wie das „normale“ DOM mit den DOM-Methoden erzeugt und manipuliert werden.

attachShadow()

Die Methode attachShadow verlangt zwingend ein Objekt als Parameter und erwartet darin eine mode-Eigenschaft. mode kann den Werte "open" oder "closed" haben, und beschreibt, ob das Shadow DOM über die shadowRoot-Eigenschaft des Elements erreichbar ist ("open") oder nicht ("closed").

Einbinden des Templates ansehen …
<div id="shadowHost"></div>

<script>
  var shadow = document.querySelector('#shadowHost').attachShadow({ mode: "open" });
    shadow.innerHTML = '<p>Dieser Text steht im Shadow-DOM.</p>';
    shadow.innerHTML += '<style>p { color: red; border: 1px dashed; }</style>';
</script>
Im Markup befindet sich ein (leeres) div-Element. Nach dem Laden des Dokuments wird das Div über seine Id selektiert und mit attachShadow() ein Wurzelelement für den anzulegenden Teilbaum erzeugt. In dieses Wurzelelement wird mit innerHTML ein Absatz und eine dazugehörende CSS-Regel hinzugefügt.

Untersuchen Sie die einzelnen Elemente im Seiteninspektor!

Anlegen und Einbinden eines Templates

Einfacher und übersichtlicher ist die Verwendung des im vorigen Kapitel eingeführten Template-Elements:

slot-Element

Ein Template ist nur sinnvoll, wenn es dynamisch mit Inhalt befüllt werden kann. Das Slot-Element (slot (englisch für Steckplatz oder Einschub)) kann über das Name-Attribut angesprochen werden. Ursprünglich war hier ein Content-Element vorgesehen, das jedoch nicht in Version 1 übernommen wurde und bereits wieder obsolet ist.

Siehe auch

CSS-Formatierung des Shadow DOM

Das SVG-Use-Element kann aus beliebig vielen Teil-Elementen bestehen, die im Shadow DOM vorhanden sind, aber nicht durch CSS formatiert werden können. MIt Custom properties können auch einzelne Bestandteile des use-Elements formatiert werden.

Hauptartikel: SVG/Tutorials/Gruppierungen#Styling des use-Elements

Weblinks


deutsch: