:host-context()
Veraltet: Diese Funktion wird nicht mehr empfohlen. Obwohl einige Browser sie möglicherweise noch unterstützen, könnte sie bereits aus den relevanten Webstandards entfernt worden sein, in Kürze entfernt werden oder nur noch aus Kompatibilitätsgründen bestehen. Vermeiden Sie die Verwendung und aktualisieren Sie vorhandenen Code, falls möglich; siehe die Kompatibilitätstabelle am Ende dieser Seite, um Ihre Entscheidung zu unterstützen. Beachten Sie, dass diese Funktion jederzeit aufhören könnte zu funktionieren.
Die :host-context() CSS Pseudoklasse ermöglicht es Ihnen, Elemente innerhalb eines Shadow DOM unterschiedlich zu stylen, basierend auf dem Selektor des Shadow-Hosts (dem Element, das den Shadow-Root hat) und seinen DOM-Vorfahren.
Normalerweise sind Elemente innerhalb eines Shadow DOMs vom äußeren DOM isoliert. Die :host-context() erlaubt es, „über den Tellerrand“ des Shadow DOMs hinauszuschauen und zu überprüfen, ob irgendeines der Vorfahr-Elemente des Elements einem bestimmten CSS-Selektor entspricht. Beispielsweise kann eine andere Textfarbe auf Elemente innerhalb eines Shadow Roots angewendet werden, wenn eine .dark-theme Klasse auf <body> angewendet wird.
Stellen Sie sich das so vor: Sie haben ein benutzerdefiniertes <greenhouse>-Element, in dem ein <chameleon> lebt. Hier ist das <greenhouse> der Host des Shadow DOMs und das <chameleon>-Element befindet sich innerhalb des Shadow DOMs. Die :host-context() lässt das <chameleon> sein Aussehen ändern, basierend auf der Umgebung des <greenhouse>. Befindet sich das <greenhouse> an einem sonnigen Ort (hat eine "sunny-theme"-Klasse), wird das <chameleon> gelb. Befindet sich das <greenhouse> an einem schattigen Ort (eine "shady-theme"-Klasse wird stattdessen angewendet), wird das <chameleon> blau.
Dieser Selektor durchdringt alle Shadow-Grenzen. Er wird nach dem sonnigen oder schattigen Thema suchen, das direkt auf das <greenhouse> oder auf eines der Vorfahrer-DOMs des Hosts angewendet wird, bis es die Wurzel des Dokuments erreicht.
Um den Selektor nur auf den <greenhouse>-Host direkt zu begrenzen oder die Auswahl auf das DOM des Hosts zu beschränken, verwenden Sie stattdessen die Pseudoklasse :host oder :host().
Hinweis: Dies hat keine Wirkung, wenn es außerhalb eines Shadow DOMs verwendet wird.
Die Spezifität von :host-context() entspricht der einer Pseudoklasse, plus der Spezifität des Selektors, der als Argument der Funktion übergeben wird.
Probieren Sie es aus
/* Following CSS is being applied inside the shadow DOM. */
:host-context(.container) {
border: 5px dashed green;
}
:host-context(h1) {
color: red;
}
<!-- elements outside shadow dom -->
<div class="container">
<h1 id="shadow-dom-host"></h1>
</div>
const shadowDom = init();
// add a <span> element in the shadow DOM
const span = document.createElement("span");
span.textContent = "Inside shadow DOM";
shadowDom.appendChild(span);
// attach shadow DOM to the #shadow-dom-host element
function init() {
const host = document.getElementById("shadow-dom-host");
const shadowDom = host.attachShadow({ mode: "open" });
const cssTab = document.querySelector("#css-output");
const shadowStyle = document.createElement("style");
shadowStyle.textContent = cssTab.textContent;
shadowDom.appendChild(shadowStyle);
cssTab.addEventListener("change", () => {
shadowStyle.textContent = cssTab.textContent;
});
return shadowDom;
}
/* Selects a shadow root host, only if it is
a descendant of the selector argument given */
:host-context(h1) {
font-weight: bold;
}
/* Changes paragraph text color from black to white when
a .dark-theme class is applied to the document body */
p {
color: black;
}
:host-context(body.dark-theme) p {
color: white;
}
Syntax
:host-context(<compound-selector>) {
/* ... */
}
Beispiele
>Selektives Stylen von Shadow-Hosts
Die folgenden Schnipsel stammen aus unserem host-selectors example (sehen Sie es sich auch live an).
In diesem Beispiel haben wir ein einfaches benutzerdefiniertes Element — <context-span> — das Sie um Text herum verwenden können:
<h1>
Host selectors <a href="#"><context-span>example</context-span></a>
</h1>
Innerhalb des Konstruktors des Elements erstellen wir style- und span-Elemente, füllen das span mit dem Inhalt des benutzerdefinierten Elements und füllen das style-Element mit einigen CSS-Regeln:
const style = document.createElement("style");
const span = document.createElement("span");
span.textContent = this.textContent;
const shadowRoot = this.attachShadow({ mode: "open" });
shadowRoot.appendChild(style);
shadowRoot.appendChild(span);
style.textContent =
"span:hover { text-decoration: underline; }" +
":host-context(h1) { font-style: italic; }" +
':host-context(h1)::after { content: " - no links in headers!" }' +
":host(.footer) { color : red; }" +
":host { background: rgb(0 0 0 / 10%); padding: 2px 5px; }";
Die Regeln :host-context(h1) { font-style: italic; } und :host-context(h1)::after { content: " - no links in headers!" } stylen die Instanz des <context-span>-Elements (den Shadow-Host in diesem Fall) innerhalb des <h1>. Wir haben es verwendet, um deutlich zu machen, dass das benutzerdefinierte Element in unserem Design nicht innerhalb des <h1> erscheinen sollte.
Spezifikationen
| Specification |
|---|
| CSS Scoping Module Level 1> # host-selector> |
Browser-Kompatibilität
Loading…
Siehe auch
- Webkomponenten
- CSS
:hostPseudoklasse - CSS
:host()Pseudoklasse - CSS
:state()Pseudoklasse - CSS
::slottedPseudoelement - HTML
<template>Element - CSS Scoping Modul