Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. Web-APIs
  3. CSS Typed Object Model API
  4. Verwenden des CSS Typed Object Model

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

View in EnglishAlways switch to English

Verwenden des CSS Typed Object Model

DieCSS Typed Object Model API präsentiert CSS-Werte als typisierte JavaScript-Objekte, um deren effiziente Manipulation zu ermöglichen.

Das Umwandeln vonCSS Object Model-Wertzeichenfolgen in sinnvoll typisierte JavaScript-Darstellungen und zurück (überHTMLElement.style) kann einen erheblichen Performance-Overhead verursachen.

Das CSS Typed OM macht die Manipulation von CSS logischer und effizienter, indem es Objektfunktionen (anstatt CSSOM-Stringmanipulation), den Zugriff auf Typen, Methoden und ein Objektmodell für CSS-Werte bereitstellt.

Dieser Artikel bietet eine Einführung in alle seine Hauptfunktionen.

computedStyleMap()

Mit der CSS Typed OM API können wir auf alle CSS-Eigenschaften und -Werte zugreifen – einschließlich benutzerdefinierter Eigenschaften –, die ein Element beeinflussen. Lassen Sie uns sehen, wie das funktioniert, indem wir unser erstes Beispiel erstellen, dascomputedStyleMap() erkundet.

Alle Eigenschaften und Werte abrufen

HTML

Wir beginnen mit etwas HTML: einem Absatz mit einem Link sowie einer Definitionsliste, zu der wir alle CSS-Eigenschafts/Wert-Paare hinzufügen werden.

html
<p>  <a href="https://example.com">Link</a></p><dl></dl>

JavaScript

Wir fügen JavaScript hinzu, um unseren ungestylten Link zu erfassen und eine Definitionsliste aller Standard-CSS-Eigenschaftswerte zurückzugeben, die den Link mithilfe voncomputedStyleMap() beeinflussen.

js
// Get the elementconst myElement = document.querySelector("a");// Get the <dl> we'll be populatingconst stylesList = document.querySelector("#regurgitation");// Retrieve all computed styles with computedStyleMap()const defaultComputedStyles = myElement.computedStyleMap();// Iterate through the map of all the properties and values, adding a <dt> and <dd> for eachfor (const [prop, val] of defaultComputedStyles) {  // properties  const cssProperty = document.createElement("dt");  cssProperty.appendChild(document.createTextNode(prop));  stylesList.appendChild(cssProperty);  // values  const cssValue = document.createElement("dd");  cssValue.appendChild(document.createTextNode(val));  stylesList.appendChild(cssValue);}

DiecomputedStyleMap()-Methode gibt einStylePropertyMapReadOnly-Objekt zurück, das diesize-Eigenschaft enthält, welche anzeigt, wie viele Eigenschaften sich in der Map befinden. Wir iterieren durch die Style-Map und erstellen ein<dt> und ein<dd> für jede Eigenschaft und jeden Wert.

Ergebnis

InBrowsern, diecomputedStyleMap() unterstützen, sehen Sie eine Liste aller CSS-Eigenschaften und -Werte. In anderen Browsern sehen Sie nur einen Link.

Haben Sie bemerkt, wie viele Standard-CSS-Eigenschaften ein Link hatte? Aktualisieren Sie den erstendocument.querySelector-Aufruf, um statt der<a> das<p> auszuwählen. Sie werden einen Unterschied in den standardmäßig berechneten Werten vonmargin-top undmargin-bottom feststellen.

.get() Methode / benutzerdefinierte Eigenschaften

Aktualisieren wir unser Beispiel, um nur ein paar Eigenschaften und Werte abzurufen. Beginnen wir mit dem Hinzufügen einiger CSS-Stile zu unserem Beispiel, einschließlich einer benutzerdefinierten Eigenschaft und einer vererbbaren Eigenschaft:

css
p {  font-weight: bold;}a {  --color: red;  color: var(--color);}

Anstattalle Eigenschaften abzurufen, erstellen wir ein Array von interessanten Eigenschaften und verwenden die MethodeStylePropertyMapReadOnly.get(), um jeden ihrer Werte zu erhalten:

<p>  <a href="https://example.com">Link</a></p><dl></dl>
js
// Get the elementconst myElement = document.querySelector("a");// Get the <dl> we'll be populatingconst stylesList = document.querySelector("#regurgitation");// Retrieve all computed styles with computedStyleMap()const allComputedStyles = myElement.computedStyleMap();// Array of properties we're interested inconst ofInterest = ["font-weight", "border-left-color", "color", "--color"];// iterate through our properties of interestfor (const value of ofInterest) {  // Properties  const cssProperty = document.createElement("dt");  cssProperty.appendChild(document.createTextNode(value));  stylesList.appendChild(cssProperty);  // Values  const cssValue = document.createElement("dd");  cssValue.appendChild(document.createTextNode(allComputedStyles.get(value)));  stylesList.appendChild(cssValue);}

Wir habenborder-left-color aufgenommen, um zu zeigen, dass, wenn wir alle Eigenschaften aufgenommen hätten, jeder Wert, der aufcurrentColor standardmäßig festgelegt ist (einschließlichcaret-color,outline-color,text-decoration-color,column-rule-color, usw.),rgb(255 0 0) zurückgeben würde. Der Link hatfont-weight: bold; von den Absatzstilen geerbt und zeigt es alsfont-weight: 700. Benutzerdefinierte Eigenschaften, wie unser--color: red, sind Eigenschaften. Daher sind sie überget() zugänglich.

Sie werden feststellen, dass benutzerdefinierte Eigenschaften den Wert so beibehalten, wie er im Stylesheet geschrieben wurde, während berechnete Stile als der berechnete Wert angezeigt werden –color wurde als einrgb() Wert aufgelistet und der zurückgegebene Wert vonfont-weight war700, obwohl wir einebenannte Farbe und dasbold Schlüsselwort verwenden.

CSSUnitValue und CSSKeywordValue

Die Stärke des CSS Typed OM besteht darin, dass Werte von Einheiten getrennt sind; das Parsen und Verketteten von String-Werten könnte der Vergangenheit angehören. Jede CSS-Eigenschaft in einer Style-Map hat einen Wert. Wenn der Wert ein Schlüsselwort ist, ist das zurückgegebene Objekt einCSSKeywordValue. Wenn der Wert numerisch ist, wird einCSSUnitValue zurückgegeben.

CSSKeywordValue ist eine Klasse, die Schlüsselwörter wieinherit,initial,unset und andere Zeichenfolgen definiert, die Sie nicht in Anführungszeichen setzen, wieauto undgrid. Diese Unterklasse gibt Ihnen einevalue-Eigenschaft übercssKeywordValue.value.

CSSUnitValue wird zurückgegeben, wenn der Wert ein Einheitentyp ist. Es ist eine Klasse, die Zahlen mit Maßeinheiten wie20px,40%,200ms oder7 definiert. Sie wird mit zwei Eigenschaften zurückgegeben: einemvalue und einerunit. Mit diesem Typ können wir auf den numerischen Wert —cssUnitValue.value — und seine Einheit —cssUnitValue.unit zugreifen.

Lassen Sie uns einen einfachen Absatz schreiben, keine Stile anwenden und einige seiner CSS-Eigenschaften inspizieren, indem wir eine Tabelle mit Einheit und Wert zurückgeben:

html
<p>  This is a paragraph with some content. Open up this example in CodePen or  JSFiddle, and change some features. Try adding some CSS, such as a width for  this paragraph, or adding a CSS property to the ofInterest array.</p><table>  <thead>    <tr>      <th>Property</th>      <th>Value</th>      <th>Unit</th>    </tr>  </thead></table>

Für jede interessante Eigenschaft listen wir den Namen der Eigenschaft auf, verwenden.get(propertyName).value, um den Wert zurückzugeben, und wenn das vonget() zurückgegebene Objekt einCSSUnitValue ist, listen wir den Einheitstyp auf, den wir mit.get(propertyName).unit abrufen.

js
// Get the element we're inspectingconst myElement = document.querySelector("p");// Get the table we'll be populatingconst stylesTable = document.querySelector("#regurgitation");// Retrieve all computed styles with computedStyleMap()const allComputedStyles = myElement.computedStyleMap();// Array of properties we're interested inconst ofInterest = [  "padding-top",  "margin-bottom",  "font-size",  "font-stretch",  "animation-duration",  "animation-iteration-count",  "width",  "height",];// Iterate through our properties of interestfor (const value of ofInterest) {  // Create a row  const row = document.createElement("tr");  // Add the name of the property  const cssProperty = document.createElement("td");  cssProperty.appendChild(document.createTextNode(value));  row.appendChild(cssProperty);  // Add the unitless value  const cssValue = document.createElement("td");  // Shrink long floats to 1 decimal point  let propVal = allComputedStyles.get(value).value;  propVal = propVal % 1 ? propVal.toFixed(1) : propVal;  cssValue.appendChild(document.createTextNode(propVal));  row.appendChild(cssValue);  // Add the type of unit  const cssUnit = document.createElement("td");  cssUnit.appendChild(    document.createTextNode(allComputedStyles.get(value).unit),  );  row.appendChild(cssUnit);  // Add the row to the table  stylesTable.appendChild(row);}

Für diejenigen, die einen nicht unterstützenden Browser verwenden, sollte die obige Ausgabe ungefähr so aussehen:

EigenschaftWertEinheit
padding-top0px
margin-bottom16px
font-size16px
font-stretch100%
animation-duration0px
animation-iteration-count1number
widthautoundefined
heightautoundefined

Sie werden feststellen, dass die Einheit<length> alspx zurückgegeben wird, die Einheit<percentage> alspercent, die Einheit<time> alss für 'Sekunden' und die einheitenlose Einheit<number> alsnumber.

Wir haben keinewidth oderheight für den Absatz deklariert, die beide aufauto standardmäßig festgelegt sind und daher einCSSKeywordValue anstelle einesCSSUnitValue zurückgegeben.CSSKeywordValue-Werte haben keine Einheitseigenschaft, daher gibt unserget().unit in diesen Fällenundefined zurück.

Wärenwidth oderheight als <length> oder <percent> definiert, wäre dieCSSUnitValue-Einheit entsprechendpx oderpercent gewesen.

Es gibt andere verfügbare Typen:

Sie können einCSSUnitValue oderCSSKeywordValue verwenden, um andere Objekte zu erstellen.

CSSStyleValue

DasCSSStyleValue-Interface desCSS Typed Object Model API ist die Basisklasse aller durch die Typed OM API zugänglichen CSS-Werte, einschließlichCSSImageValue,CSSKeywordValue,CSSNumericValue,CSSPositionValue,CSSTransformValue undCSSUnparsedValue.

Es hat zwei Methoden:

Wie oben erwähnt, gibtStylePropertyMapReadOnly.get('--customProperty') einCSSUnparsedValue zurück. Wir könnenCSSUnparsedValue-Objektinstanzen mit den geerbten MethodenCSSStyleValue.parse() undCSSStyleValue.parseAll() parsen.

Untersuchen wir ein CSS-Beispiel mit mehreren benutzerdefinierten Eigenschaften, Transformationen,calc()-Funktionen und anderen Features. Wir betrachten, welche Typen sie haben, indem wir kurze JavaScript-Snippets verwenden, die anconsole.log() ausgeben:

css
:root {  --main-color: hsl(198 43% 42%);  --black: hsl(0 0% 16%);  --white: hsl(0 0% 97%);  --unit: 1.2rem;}button {  --main-color: hsl(198 100% 66%);  display: inline-block;  padding: var(--unit) calc(var(--unit) * 2);  width: calc(30% + 20px);  background: no-repeat 5% center url("magic-wand.png") var(--main-color);  border: 4px solid var(--main-color);  border-radius: 2px;  font-size: calc(var(--unit) * 2);  color: var(--white);  cursor: pointer;  transform: scale(0.95);}

Fügen wir die Klasse zu einem Button hinzu (einem Button, der nichts tut).

html
<button>Styled Button</button>
<p>  There is nothing to see here. Please open your browser console to see the  output!</p>

Wir erfassen unsereStylePropertyMapReadOnly mit dem folgenden #"button").computedStyleMap();

Die folgenden Beispiele beziehen sich aufallComputedStyles:

CSSUnparsedValue

DasCSSUnparsedValue repräsentiertbenutzerdefinierte Eigenschaften:

js
// CSSUnparsedValueconst unit = allComputedStyles.get("--unit");console.log(unit); // CSSUnparsedValue {0: " 1.2rem", length: 1}console.log(unit[0]); // " 1.2rem"

Wenn wirget() aufrufen, wird eine benutzerdefinierte Eigenschaft vom TypCSSUnparsedValue zurückgegeben. Beachten Sie den Leerraum vor1.2rem. Um eine Einheit und einen Wert zu erhalten, benötigen wir einCSSUnitValue, das wir mittels der MethodeCSSStyleValue.parse() auf demCSSUnparsedValue abrufen können.

js
const parsedUnit = CSSNumericValue.parse(unit);console.log(parsedUnit); // CSSUnitValue {value: 1.2, unit: "rem"}console.log(parsedUnit.unit); // "rem"console.log(parsedUnit.value); // 1.2

CSSMathSum

Obwohl das<button>-Element standardmäßig ein Inline-Element ist, haben wirdisplay: inline-block; hinzugefügt, um Größenänderungen zu ermöglichen. In unserem CSS haben wirwidth: calc(30% + 20px);, welches einecalc()-Funktion ist, um die Breite zu definieren.

Wenn wir diewidth abrufen, wird einCSSMathSum zurückgegeben.CSSMathSum.values ist einCSSNumericArray mit 2CSSUnitValues.

Der Wert vonCSSMathValue.operator istsum:

js
const btnWidth = allComputedStyles.get("width");console.log(btnWidth); // CSSMathSumconsole.log(btnWidth.values); // CSSNumericArray {0: CSSUnitValue, 1: CSSUnitValue, length: 2}console.log(btnWidth.operator); // 'sum'

CSSTransformValue mit CSSScale

Dasdisplay: inline-block; ermöglicht auch die Transformation. In unserem CSS haben wirtransform: scale(0.95);, welches einetransform-Funktion ist.

js
const transform = allComputedStyles.get("transform");console.log(transform); // CSSTransformValue {0: CSSScale, 1: CSSTranslate, length: 2, is2D: true}console.log(transform.length); // 1console.log(transform[0]); // CSSScale {x: CSSUnitValue, y: CSSUnitValue, z: CSSUnitValue, is2D: true}console.log(transform[0].x); // CSSUnitValue {value: 0.95, unit: "number"}console.log(transform[0].y); // CSSUnitValue {value: 0.95, unit: "number"}console.log(transform[0].z); // CSSUnitValue {value: 1, unit: "number"}console.log(transform.is2D); // true

Wenn wir dietransform-Eigenschaft abrufen, erhalten wir einenCSSTransformValue. Wir können die Länge (oder Anzahl) der Transformationsfunktionen mit derlength-Eigenschaft abfragen.

Da wir eine Länge von1 haben, die eine einzelne Transformationsfunktion repräsentiert, loggen wir das erste Objekt und erhalten einCSSScale-Objekt. Wir erhaltenCSSUnitValues, wenn wir diex,y undz Skalierung abfragen. Die schreibgeschützteCSSScale.is2D-Eigenschaft ist in diesem Szenariotrue.

Hätten wirtranslate(),skew() undrotate() Transformationsfunktionen hinzugefügt, wäre die Länge4 gewesen, jede mit ihren eigenenx,y,z Werten und jeweils mit einer.is2D-Eigenschaft. Hätten wir zum Beispieltransform: translate3d(1px, 1px, 3px) inkludiert, hätte.get('transform') einCSSTranslate mitCSSUnitValues fürx,y undz zurückgegeben, und die schreibgeschützte.is2D-Eigenschaft wärefalse gewesen.

CSSImageValue

Unser Button hat ein Hintergrundbild: einen Zauberstab.

js
const bgImage = allComputedStyles.get("background-image");console.log(bgImage); // CSSImageValueconsole.log(bgImage.toString()); // url("magic-wand.png")

Wenn wir die'background-image' abrufen, wird einCSSImageValue zurückgegeben. Obwohl wir die CSSbackground-Kurzform-Eigenschaft verwendet haben, zeigt die geerbte MethodeObject.prototype.toString(), dass wir nur das Bild zurückgegeben haben,'url("magic-wand.png")'.

Beachten Sie, dass der zurückgegebene Wert der absolute Pfad zum Bild ist – dies wird auch dann zurückgegeben, wenn der ursprünglicheurl()-Wert relativ war. Wäre das Hintergrundbild ein Verlauf oder mehrere Hintergrundbilder gewesen, hätte.get('background-image') einCSSStyleValue zurückgegeben. DasCSSImageValue wird nur dann zurückgegeben, wenn es ein einzelnes Bild gibt und nur wenn diese einzelne Bilddeklaration eine URL ist.

Zum Schluss fügen wir alles in einem Live-Beispiel zusammen. Denken Sie daran, die Konsole Ihres Browsers zu verwenden, um die Ausgabe zu inspizieren.

Zusammenfassung

Das sollte Ihnen den Einstieg in das CSS Typed OM erleichtern. Schauen Sie sich alleCSS Typed OM-Schnittstellen an, um mehr zu erfahren.

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp