Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Serialisierung von CSS-Werten

Einige CSSOM-APIs serialisieren Eigenschaftswerte zu standardisierten Zeichenfolgen, die vom Datentyp des Werts abhängen. Beispielsweise können Sie eine Farbe mit der Syntax hsl(240 100% 50%) festlegen. Wenn Sie den Wert über JavaScript auslesen, wird er jedoch in der gleichwertigen Syntax "rgb(0, 0, 255)" zurückgegeben.

CSS-Datentypen lassen sich häufig in mehreren Syntaxformen ausdrücken. Beispielsweise kann der Datentyp <color> durch benannte Farben (red), hexadezimale Schreibweise (#ff0000), funktionale Schreibweise (rgb(255 0 0)) und weitere Formen dargestellt werden. Diese unterschiedlichen Syntaxformen sind in jeder Phase der Verarbeitung von CSS-Werten vollständig gleichwertig – ähnlich wie in JavaScript dieselbe Zeichenfolge mit einfachen oder doppelten Anführungszeichen oder dieselbe Zahl in verschiedenen Formaten (etwa 16, 16.0 oder 0x10) geschrieben werden kann.

Da CSS all diese Darstellungsformen bei der Wertverarbeitung in denselben zugrunde liegenden Wert umwandelt, lässt sich die ursprüngliche Syntax aus dem bereits geparsten CSSOM häufig nicht mehr rekonstruieren. Außerdem ist eine kanonische Darstellung für Skripte oft nützlicher, weil sie Vergleiche und Berechnungen anhand der Darstellung für die Benutzer ermöglicht statt anhand der ursprünglichen Schreibweise.

Wann und wie Werte serialisiert werden

Die Serialisierung erfolgt immer dann, wenn CSS-Eigenschaftswerte über JavaScript-APIs als Zeichenfolgen ausgelesen werden, beispielsweise durch:

Verschiedene APIs geben CSSStyleDeclaration-Objekte aus unterschiedlichen Phasen der Wertverarbeitung zurück. Ihr Verhalten bei der Serialisierung unterscheidet sich daher geringfügig. Beispielsweise geben Window.getComputedStyle() und HTMLElement.style den aufgelösten Wert von Eigenschaften zurück, während CSSStyleRule.style mehr oder weniger den deklarierten Wert zurückgibt.

Hinweis: Die CSS Typed OM API kann Einheiten und andere CSS-Syntaxformen darstellen. Stildeklarationen, die von einem Element abgerufen werden, sind jedoch bereits verarbeitet und bewahren die ursprüngliche Syntax nicht. Beispielsweise gibt CSS.cm(1).toString() "1cm" zurück, statt den Wert in Pixel zu serialisieren. element.computedStyleMap().get("margin-left").toString() gibt dagegen den aufgelösten Pixelwert zurück.

Für jeden CSS-Werttyp legen die CSS-Spezifikationen ein Serialisierungsformat fest. Einige häufige Regeln sind:

  • Schlüsselwörter (wie auto, block, none) werden vollständig in Kleinbuchstaben serialisiert.
  • <angle>: wird in einer Winkeleinheit serialisiert, die vom Kontext abhängt (nicht genauer festgelegt). Bei element.style und getComputedStyle() ist dies deg.
  • <color>:
    • sRGB-Farben (<named-color>, transparent, <system-color>, <hex-color>, rgb, hsl, hwb): werden in der herkömmlichen, durch Kommas getrennten Syntax rgb(R, G, B) oder rgba(R, G, B, A) serialisiert, wobei alle Argumente Zahlen sind. Die Form rgb wird verwendet, wenn der Alphawert genau 1 ist.
    • Bei Farben mit lab(), lch(), oklab(), oklch() und color() bleibt die Funktionsform mit numerischen Argumenten erhalten.
    • Das Schlüsselwort currentColor wird als currentcolor serialisiert.
  • <percentage>: bleibt als Prozentwert erhalten.
  • <ratio>: wird als zwei Zahlen serialisiert, die durch " / " getrennt sind.
  • <url>: wird als <url> mit Anführungszeichen (url("...")) serialisiert, wobei die URL zu einer absoluten URL aufgelöst wird.

Beachten Sie, dass <percentage>-Werte bei der Wertverarbeitung häufig in absolute Größen (wie <length>) umgerechnet werden. Daher erscheinen sie bei der Serialisierung berechneter Stile möglicherweise nicht mehr als Prozentwerte. Bei Größen mit Einheiten, etwa <frequency>, <length>, <resolution> und <time>, hängt die serialisierte Einheit vom Kontext ab und ist nicht genau spezifiziert. getComputedStyle() und element.style serialisieren diese Werte jeweils in Hz, px, dppx und s.

Bei der Serialisierung des Werts einer Kurzschreibweise werden die zugehörigen Langschreibweise-Eigenschaften serialisiert und nach den Regeln der jeweiligen Kurzschreibweise zusammengeführt.

Hinweis: Die Serialisierung von CSS-Eigenschaften umfasst viele komplexe Details, insbesondere bei komplexen Eigenschaften wie font. Diese Details sind in den Spezifikationen möglicherweise nicht festgelegt oder unterscheiden sich sogar zwischen Browsern. Testen und überprüfen Sie das Verhalten für Ihren konkreten Anwendungsfall.

html
<div>Example Element</div>
css
div {
  position: absolute; /* keyword */
  rotate: 1rad; /* <angle> */
  color: hsl(240 50% 50%); /* <color> */
  background-color: hsl(120 50% 50% / 0.3); /* <color> with alpha */
  border-color: lab(10 -120 -120); /* <color> in non-sRGB space */
  margin: 2em; /* relative <length> */
  padding: 2cm; /* absolute <length> */
  font-size: calc(1em + 2px); /* complex expression */
  left: 50%; /* <percentage> */
  animation-duration: 500ms; /* <time> */
}
js
const element = document.querySelector("div");
const table = document.createElement("table");
const elemStyle = getComputedStyle(element);
const ruleStyle = document.getElementById("css-output").sheet.cssRules[0].style;
const head = table.createTHead().insertRow();
["Property", "getComputedStyle()", "CSSStyleRule"].forEach((text) => {
  const th = document.createElement("th");
  th.textContent = text;
  head.appendChild(th);
});
for (const property of [
  "position",
  "rotate",
  "color",
  "background-color",
  "border-color",
  "margin",
  "padding",
  "font-size",
  "left",
  "animation-duration",
]) {
  const row = document.createElement("tr");
  const propCell = document.createElement("td");
  const valueCell = document.createElement("td");
  const ruleCell = document.createElement("td");
  propCell.textContent = property;
  valueCell.textContent = elemStyle.getPropertyValue(property);
  ruleCell.textContent = ruleStyle.getPropertyValue(property);
  row.appendChild(propCell);
  row.appendChild(valueCell);
  row.appendChild(ruleCell);
  table.appendChild(row);
}
document.body.appendChild(table);

Beispiele

Serialisierung von Farbwerten

Farben gehören zu den häufigsten Werttypen, die von der Serialisierung betroffen sind. Unabhängig davon, ob Sie eine Farbe mit hsl(), hwb(), einem Schlüsselwort oder einem modernen Farbraum definieren, gibt JavaScript sie normalerweise im herkömmlichen Format rgb() oder rgba() zurück.

Die folgenden Beispiele zeigen, wie verschiedene Farbformate beim Zugriff über JavaScript serialisiert werden.

html
<div class="example hsl">HSL Color</div>
<div class="example lab">LAB Color</div>
<div class="example named">Named Color</div>
<div class="example alpha">Transparent Color</div>
<pre id="output"></pre>
css
.example {
  padding: 10px;
  margin: 5px;
  color: white;
}

.hsl {
  background-color: hsl(240 50% 50%);
}

.lab {
  background-color: lab(100% 0 0);
}

.named {
  background-color: blue;
}

.alpha {
  background-color: hsl(120 50% 50% / 0.3);
}
js
const examples = document.querySelectorAll(".example");
const output = document.getElementById("output");

examples.forEach((element) => {
  const style = getComputedStyle(element);
  output.textContent += `${element.className}: ${style.getPropertyValue("background-color")}\n`;
});

Serialisierung von Längenwerten

Längen sind ein weiterer häufiger Fall. Relative Einheiten (wie em und %) werden bei der Serialisierung über JavaScript-APIs häufig in absolute Pixelwerte aufgelöst.

js
element.style.marginLeft = "2em";
console.log(getComputedStyle(element).marginLeft);
// "32px" (depending on font size)

Diese Normalisierung ermöglicht es Skripten, Längen konsistent zu vergleichen oder mit ihnen zu rechnen.

Spezifikationen

Spezifikation
CSS Object Model (CSSOM)
# serialize-a-css-value
CSS Color Module Level 4
# serialization

Siehe auch