Javascript: CSS Àndern mit styleSheets und insertRule
insertRule() und deleteRule() sind deutlich weniger verbreitet als die direkte CSS-Manipulation ĂŒber style-Eigenschaften oder das HinzufĂŒgen/Entfernen von CSS-Klassen. Aber das styleSheet-Objekt gibt Zugriff auf alle CSS-Regeln, kann Breakpoints setzen, liefert die bessere Performance und trennt Logik und Styling.
Mit Javascript styleSheets auf CSS-Dateien und Regeln zugreifen
styleSheet gibt eine Liste der CSS-Dateien und style-Elemente im Seitenkopf zurĂŒck. insertRule und removeRule fĂŒgen neue CSS-Stile in ein Stylesheet ein und entfernen sie wieder. Das Verfahren ist ĂŒbersichtlicher als das wiederholte EinfĂŒgen langer Strings mit style-Attributen.
document.styleSheets gibt eine aufklappbare Liste der Stylesheets der Seite zurĂŒck. Das styleSheets-Objekt enthĂ€lt alle Stylesheets der Seite â sowohl Styleheets, die mit <style> notiert sind als auch diejenigen, die als externe CSS-Datei mit <link rel="stylesheet"> eingebunden sind.
Der RĂŒckgabewert von document.styleSheets sieht aus wie ein Array, ist aber eine nodeList. Der Zugriff erfolgt ĂŒber den Index.
const sheets = document.styleSheets;
for (const item of sheets ) {
console.log (item)
}
âž CSSStyleSheet âž CSSStyleSheet âž CSSStyleSheet
⟠CSSStyleSheet
⟠cssRules: CSSRuleList
âž 0:CSSSupportsRule {conditionText: '( display: flex )', cssRules: CSSRuleList, type: 12, cssText: '@supports ( display: flex ) {\n @media only screenâŠund-color: rgb(235, 245, 255); height: 4em; }\n}\n}', parentRule: null, âŠ}
âž 1:CSSStyleRule {selectorText: '.skip-link', style: CSSStyleDeclaration, styleMap: StylePropertyMap, type: 1, cssText: '.skip-link { display: none; }', âŠ}
âž 2:CSSStyleRule {selectorText: 'html', style: CSSStyleDeclaration, styleMap: StylePropertyMap, type: 1, cssText: 'html { scroll-behavior: smooth; }', âŠ}
âž 4:CSSMediaRule {media: MediaList, conditionText: 'only screen', cssRules: CSSRuleList, type: 4, cssText: '@media only screen {\n body { font-family: -apple-âŠ3); color: rgb(85, 85, 85); font-weight: 300; }\n}', âŠ}
âŠ
âž CSSStyleSheet
âž CSSStyleSheet
Eine Array-Notation gibt direkten Zugriff auf die Elemente der Liste.
const rules = document.styleSheets[0].cssRules;
- â insertRule() ist nicht empfehlenswert fĂŒr einfache CSS-Ănderungen. classList.add() oder element.style sind effektiver und besser lesbar.
- â Sinnvoll ist insertRule() nur fĂŒr Performance-optimierte CSS-Ănderungen, die sehr viele Elemente betreffen.
insertRule
Stylesheets haben eine Methode insertRule, die CSS-Regeln auf dieselbe Weise einfĂŒgt wie die Notation in der CSS-Datei oder in style-Elementen im Kopf der Seite.
GegenĂŒber CSS im style-Attribut von HTML-Elementen oder elem.style.cssText setzt insertRule auch Breakpoints und verzweigt das CSS im style-Tag mit der @supports-Regel. Die Notation ist dieselbe wie im CSS â gut lesbar und nachvollziehbar.
sheets[0].insertRule (`
@supports ( display: flex ) {
@media only screen and (max-width:1260px) {
h2 {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #EBF5FF;
height: ${foo}em;
}
}
}
`);
Per Vorgabe werden neue Regeln am Ende des Stylesheets eingefĂŒgt. Das optionale zweite Argument ist der Index, an dem die Regel eingefĂŒgt wird. Dieser Index darf nicht gröĂer sein als die Zahl der Regeln im Style-Element und reagiert ausgesprochen sensibel, wenn der Index auĂer Kontrolle gerĂ€t. In Ă€lteren Implementierungen war der Index noch erforderlich
IndexSizeError: DOM Exception 1: Index or size was negative, or greater than the allowed value.
styleSheets identifizieren
Das styleSheet-Objekt unterstĂŒtzt nur den Zugriff durch den Index, also ĂŒber die Position des styleSheets im Dokument. Zur Identifikation kann aber auch die href-Eigenschaft herangezogen werden, wenn das Stylesheet durch ein <link>-Tag in das Dokument eingebunden wurde oder das title-Attribut (sofern title gesetzt ist und die title-Attribute eindeutig sind).
function getStyleSheet(unique_title) {
for (const item of document.styleSheets) {
if (item.title == unique_title) {
return item;
}
}
}
Quelle Dynamic style - manipulating CSS with JavaScript auf www.w3.org
Ein gleichlautendes title-Attribut erlaubt das Zusammenfassen von zwei oder mehr Style Sheets zu einer Gruppe, die gemeinsam auĂer Kraft gesetzt oder deaktiviert werden können.
Stylesheet mit Javascript erzeugen
Statt Blöcke immer wieder mit elem.style oder setAttribute() und removeAttribute() zu Àndern, initialisiert ein dynamisch erzeugtes StyleSheet alle Blöcke.
- Liquorice wafer lollipop sesame
- snaps gummi bears. Wafer jelly beans chupa chups cotton candy
- caramels carrot cake topping oat cake.
- Cake carrot cake marshmallow cheesecake cake lemon drops pudding apple pie.
Fruitcake marshmallow sugar plum soufflé biscuit.
Sesame snaps pie lemon drops.
Zuerst: Die maximale Höhe des Accordion-Elements berechnen, damit der Inhalt, der dem Accordion folgt, beim Ăffnen und SchlieĂen der Stufen nicht auf- und abtanzt.
const acco = document.querySelectorAll (".accordion>div");
let maxHeight = 0;
for (const item of acco) {
if (item.clientHeight > maxHeight) {
maxHeight = item.clientHeight;
}
}
const style = getStyleSheet ("accordion");
style.insertRule (`
.wrap {
height: ${maxHeight + labelTotal}px }
`);
stylesheets disabled
Die Liste kann nicht geÀndert werden, aber disabled deaktiviert einzelne Stylesheets. disabled ist ein boole'scher Wert und gibt an, ob ein styleSheet in Kraft ist (disabled = false) oder nicht. Default ist false.
<link rel="stylesheet" href="dom-stylesheets.css" title="extra" />
const sheets = document.styleSheets;
for (const item of sheets) {
if (item.title && item.title == 'extra') {
item.disabled = true;
}
}
Mal diese Seite ohne die CSS-Datei? Aber Achtung! Kann zu leichten bis schweren ErschĂŒtterungen der CSS-Macht fĂŒhren (Wiederherstellen der CSS-Macht mit Reload).
Weitere Eigenschaften von styleSheets
- ownerNode
- gibt einen Verweis auf den Knoten zurĂŒck, der das aktuelle styleSheet enthĂ€lt. Gibt in regulĂ€ren HTML-Seiten i.d.R. ein LINK- oder STYLE-Element zurĂŒck. In XML-Dokumenten kann dies die linkende ProcessingInstruction sein.
- parentStyleSheet
- Verweis auf das Top-Level-Stylesheet bei Style Sheets, die durch die @page-Regel eingebunden sind. Bei Style Sheets, die durch LINK- oder STYLE eingebunden sind, wird null zurĂŒckgegeben.
- media
- Gibt das media-Objekt des styleSheets als Liste zurĂŒck. Die Eigenschaft mediaText gibt den Medientyp als String zurĂŒck. Default ist screen.