:host-context()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Die :host-context()
CSS Pseudoklasse ermöglicht es Ihnen, Elemente innerhalb eines Shadow DOM unterschiedlich zu stylen, basierend auf dem Selektor des Shadow Hosts (das Element, das die Shadow-Root enthält) und dessen DOM-Vorfahren.
Normalerweise sind Elemente innerhalb eines Shadow DOM vom externen DOM isoliert. Die :host-context()
erlaubt es Ihnen, "außerhalb" dieses Shadow DOM zu schauen und zu prüfen, ob eines der Vorfahren des Elements einem bestimmten CSS-Selektor entspricht. Zum Beispiel, um eine andere Textfarbe auf Elemente innerhalb einer Shadow-Root anzuwenden, wenn eine .dark-theme
-Klasse auf angewendet wird.
Denken Sie daran wie folgt: Stellen Sie sich vor, Sie haben ein benutzerdefiniertes
-Element, in dem ein
lebt. Hier ist das
der Shadow DOM Host und das
-Element befindet sich innerhalb des Shadow DOM. Die :host-context()
lässt das
sein Aussehen basierend auf der Umgebung des
ändern. Wenn das
an einem sonnigen Ort steht (hat eine "sunny-theme"-Klasse), wird das
gelb. Wenn das
an einem schattigen Platz steht (eine "shady-theme"-Klasse stattdessen angewendet), wird das
blau.
Dieser Selektor durchdringt alle Schatten-Grenzen. Er sucht nach dem sonnigen oder schattigen Thema, das direkt auf das
oder auf einen der Vorfahren des Hosts und der Vorfahren DOMs angewendet wurde, bis es die Wurzel des Dokuments erreicht.
Um den Selektor nur auf den direkten
Host oder auf das DOM des Hosts zu beschränken, verwenden Sie die :host
oder :host()
Pseudoklasse.
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;
}
const shadowDom = init();
// add a 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: #000;
}
:host-context(body.dark-theme) p {
color: #fff;
}
Syntax
:host-context() {
/* ... */
}
Beispiele
Selektives Stylen von Shadow Hosts
Die folgenden Snippets stammen aus unserem host-selectors Beispiel (siehe es auch live).
In diesem Beispiel haben wir ein einfaches benutzerdefiniertes Element —
— das Sie um Text herumwickeln können:
Host selectors example
Innerhalb des Konstruktors des Elements erstellen wir style
- und span
-Elemente, füllen das span
mit dem Inhalt des benutzerdefinierten Elements und 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 :host-context(h1) { font-style: italic; }
und :host-context(h1):after { content: " - no links in headers!" }
Regeln stylen die Instanz des
-Elements (den Shadow Host in diesem Fall) innerhalb des . Wir haben es verwendet, um klarzumachen, dass das benutzerdefinierte Element nicht innerhalb des
erscheinen sollte in unserem Design.
Spezifikationen
Specification |
---|
CSS Scoping Module Level 1 # host-selector |
Browser-Kompatibilität
Siehe auch
- Webkomponenten
- CSS
:host
Pseudoklasse - CSS
:host()
Pseudoklasse - CSS
:state()
Pseudoklasse - CSS
::slotted
Pseudoelement - HTML
Element
- CSS Scoping Modul