elem.style – CSS-Stile mit Javascript ändern

elem.style.property (z.B. elem.style.top, elem.style.opacity) liest und setzt CSS-Stile eines Elements, elem.style hingegen setzt oder überschreibt das style-Attribut eines Elements in gleicher Weise wie elem.setAttribute("style", …). elem.style.property ist sinnvoll für berechnete Werte, aber hat auch seine Tücken.

Javascript dot style – CSS ändern und erzeugen

elem.style.property – CSS dynamisch ändern

CSS kommt aus der CSS-Datei, aus style-Elementen im head der Seite und aus inline-Stilen wie <elem style="background-color: red">. Darüber hinaus setzt Javascript mit elem.style.eigenschaft die Werte von Stilen dynamisch, z.B. als Antwort auf eine Aktion des Benutzers.

elem.style.eigenschaft = "neuer Stil";

Ein kleines Beispiel für den sinnvollen Einsatz von elem.style.property ist ein Drop Down, das CSS kann nicht von height: 0 auf height: auto animieren kann.

<button id="toggle" class="btn">Details</button>
<div id="panel" class="panel">
	<img src="scene7-s.jpg" width="480" height="480">
	<p>Hibiskus</p>
</div>
.panel {
	overflow: hidden;
	height: 0;
	transition: height 300ms ease;
}
Demo-Szene

Hibiskus

const btn = document.getElementById("toggle");
const panel = document.getElementById("panel");

btn.addEventListener("click", () => {
	if (panel.style.height && panel.style.height !== "0px") {
		panel.style.height = "0px";
	} else {
		panel.style.height = panel.scrollHeight + "px";
	}
});

Damit ein eventuell vorhandenes style-Attribut nicht einfach überschrieben wird, fügen Anweisungen wie elem.style.color oder elem.style.width Eigenschaften dynamisch ein, ohne vorhandene Stile zu überschreiben.

Hier lauert eine Fehlerquelle: Die Namen von CSS-Eigenschaften wie background-color müssen in Camel Case geschrieben werden: backgroundColor

const elem = document.querySelector("#myButton");
elem.addEventListener ("click", function () {
	this.style.borderColor = "orange";
	this.style.background = "magenta";
});

CamelCase

elem.style übernimmt CSS-Eigenschaften wie width, border oder color wörtlich: elem.style.width, elem.style.border oder elem.style.color. Das macht das Ändern von CSS-inline-Stilen mit Javascript so schön einfach.

Da Javascript Bindestriche als Minuszeichen interpretiert, müssen die CSS-Eigenschaften bei der Übersetzung in DOM-Eigenschaft als CamelCase geschrieben werden. Das heißt: Bindestrich fallen lassen und den ersten Buchstaben nach dem Bindestrich als Großbuchstabe setzen.

Das sind nur einige Beispiele von style-Eigenschaften, die im Camel Case geschrieben werden.

  • backgroundAttachment
  • backgroundImage
  • borderBottomStyle
  • borderRadius
  • boxShadow
  • flexDirection
  • fontSize
  • justifyContent
  • lineHeight
  • maxWidth
  • paddingBottom
  • textAlign

Als CamelCase werden auch Browser-Präfix-Eigenschaften mit großen Anfangsbuchstaben und ohne Bindestrich geschrieben.

  • webkitHyphens
  • webkitMinDevicePixelRatio

Die CamelCase-Schreibweise kam mit CSS2, war mal raus, ist wieder drin – getPropertyValue () ist also nicht erforderlich.

elem.style.cssText vs elem.style.property

elem.style.property separiert einzelne Stile und setzt sie individuell. Wenn mehr als eine Eigenschaft geändert wird, braucht elem.style.xy viele Zeilen. Dann ist elem.style.cssText effizienter, vor allem, wenn es sich um eine Performance-kritische Initialisierung handelt.

Demo Demo Demo
<img class="gallery" src="cake.webp"  
     width="300" height="300" alt="Demo">
const gallery = document.querySelectorAll (".gallery");
for (const elem of gallery) {
	elem.style.cssText += `border: 1px dotted var(--me-highlight); 
	                       padding: 0.5rem`;
}

Wichtig! Das += in der Zuweisung verhindert, dass der String eines bereits vorhandenen style-Attributs überschrieben wird.

style.property ist die moderne Technik für das User Interface. style.cssText ist eine Low-Level-Abkürzung für Initialisierung oder Reset. Wenig geeignet ist cssText für Aktionen des User Interface wie Slider, Scroll oder Resize, und für Animationen – kurz gesagt für alles, was sich inkrementell ändert.

Kriteriumstyle.propertycssText
Sicherheit✅ hoch❌ niedrig
Lesbarkeit✅ hoch❌ niedrig
Teiländerung✅ ja❌ nein
Performance✅ gut⚠️ nur bei Spezialfällen
UI-State✅ ideal❌ ungeeignet

Beispiel: Javascript style für ein Akkordeon

Der Akkordeon-Effekt hier setzt auf CSS max-height: 0; overflow: hidden, um den Inhalt der Tafeln unter den Headern zu verbergen, und das Script setzt einen Inline-Stil mit elem.style.maxHeight, wenn ein Element angezeigt werden soll.

<div class="wrap">
   <div class="accordion">Sesame snaps croissant</div>
   <div class="board">
      <p>Cheesecake cake marshmallow … </p>
   </div>

   <div class="accordion"> Cotton candy powder </div>
   <div class="board">
      <p>Danish cake dragée sesame … </p>
   </div>

   …
</div>

CSS für das Akkordeon

/* Accordion-Blöcke, zu Anfang geschlossen durch max-height: 0 und overflow: hidden */
.board {
   padding: 0 18px;
   background-color: white;
   max-height: 0;
   overflow: hidden;
   transition: 0.5s ease-out;
}
Action und Abenteuer
video-mann-unter-feuer

Der abgewrackte Navy-Soldat Creasy übernimmt einen Bodyguard-Job in Mexiko.

Familie und Kinder
video-peanuts-der-film

Charlie Brown, Snoopy und Lucy haben ihren ersten Auftritt als computeranimierte Helden.

Science Fiction
Video Stargate Origins

1930 kämpfen Professor Langford und seine Tochter noch mit den Rätseln des antiken Artefakts.

document.addEventListener('click', (e) => {
	const trigger = e.target.closest('.accordion');
	if (!trigger) return;

	trigger.classList.toggle('active');

	const panel = trigger.nextElementSibling;
	if (!panel) return;

	const isOpen = panel.style.maxHeight;

	panel.style.maxHeight = isOpen
		? null
		: `${panel.scrollHeight}px`;
});

maxHeight ist die Eigenschaft, die der CSS-Eigenschaft max-height entspricht. Der erste Klick auf eine der Überschriften setzt ein style-Attribut mit einem Wert > 0 für max-height in das HTML-Element.

<div class="board" style="max-height: 223px;">
…
</div>

Javascript classList

Anstelle von langatmigen Ergänzungen von CSS-Stilen ist es fast immer effizienter, CSS-Klassen zu ändern. Das ist oft zugleich die sauberste Methode, weil sie CSS und Logik trennt. Die Methoden des classList-Objekts add(), remove() und toggle() sind elegant und flexibel und classList.contains prüft, ob ein Element eine bestimmte Klasse enthält.

In vielen Fällen – etwa bei Animationen – wird das Script schneller, wenn nicht die Klassen von Elemente hinzugefügt oder entfernt werden, sondern wenn stattdessen mit insertRule und removeRule style-Elemente dynamisch erzeugt und im Seitenkopf eingefügt werden.

style-Attribut und Javascript style

Während elem.style.eigenschaft nur den Wert einer individuellen CSS-Eigenschaft wie width oder borderWidth setzt oder überschreibt, erzeugt elem.style ein style-Attribut oder überschreibt es.

<button id="myButton" style="padding:1em; border-width: 4px">Klick!</button>

Die Anweisung myButton.style="border-color:blue" würde den alten Inhalt des style-Attributs löschen und durch den eigenen neuen Wert ersetzen. Ganz schön gefährlich.

classList vs elem.style

Im Laufe der Zeit sind weitere Methoden hinzugekommen, die individuelle Stile von Elementen ändern oder alle CSS-Eigenschaften manipulieren können.

elem.style
Fügt ein style-Attribut ein oder ersetzt ein evtl. vorhandenes style-Attribut

elem.style = "background-color: blue"; 

Werte von CSS-Eigenschaften ändern
Setzt den Wert einer CSS-Regel, ohne ein evtl. vorhandenes style-Attribute zu ändern

elem.style.backgroundColor = "blue";	

cssText
Fügt mehrere Stile zum CSS eines Elements hinzu, ohne ein evtl. vorhandenes style-Attribute zu ändern

elem.style.cssText = `
	background-color: blue;
	border:2px solid var(--me-dim);
`;

Regeln erweitern oder ersetzen
style-Attribut einfügen oder ein evt. vorhandenes style-Attribut ersetzen und mehrere Stile einfügen

elem.setAttribute ("style", "background: blue; border: 1px solid green");

style-Element erzeugen
Erzeugt ein style-Element, das vollständige CSS-Regeln aufnimmt, setzt auch Breakpoints und @-Regeln

const style = document.createElement ("style");
style.innerHTML = `
@supports ( display: flex ) {
		@media only screen and (max-width:1260px) { 
		h2 { 
			display: flex;
			flex-direction: column;
			height: ${foo}em;
		 } 
	}
}
body.append ("style");
`; 

stylesheets und insertRule, deleteRule
CSS auch in externen CSS-Dateien ändern – z.B. Breakpoints setzen und mit @-Regeln und kann Regeln entfernen

sheets[0].insertRule (`
@supports ( display: flex ) {
	@media only screen and (max-width:1260px) { 
		h2 { 
			display: flex;
			flex-direction: column;
			height: ${foo}em;
		 } 
	}
}
`);
Suchen auf mediaevent.de