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.

Javascript insertRule removeRule

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.
Suchen auf mediaevent.de