Start · Sprachen · JavaScript · Referenz · CSSPrimitiveValue.getRGBColorValue()

CSSPrimitiveValue.getRGBColorValue()

Methode

Gibt den Farbwert eines <code>CSSPrimitiveValue</code> als <code>RGBColor</code>-Objekt mit den Komponenten <code>red</code>, <code>green</code> und <code>blue</code> zurück.

seit JavaScript DOM Level 2 Style (veraltet, in Chrome und Firefox deprecated seit ja Kategorie: webapi

Signatur

CSSPrimitiveValue.prototype.getRGBColorValue()

Beschreibung

Die Methode getRGBColorValue() gehört zum alten CSS-Objektmodell aus DOM Level 2 Style. Sie liest einen CSS-Farbwert aus einem CSSPrimitiveValue aus. Das zurückgegebene RGBColor-Objekt enthält die Eigenschaften red, green und blue. Jede davon ist selbst wieder ein CSSPrimitiveValue, dessen Zahlenwert man z. B. mit getFloatValue(CSSPrimitiveValue.CSS_NUMBER) abfragt.

An ein CSSPrimitiveValue kommt man normalerweise über CSSStyleDeclaration.getPropertyCSSValue(), zum Beispiel mit getComputedStyle(el).getPropertyCSSValue('color'). Der Aufruf klappt nur, wenn primitiveType den Wert CSSPrimitiveValue.CSS_RGBCOLOR (25) hat. Bei jedem anderen Typ wirft die Methode eine DOMException.

Die Schnittstelle gilt als veraltet. In neuem Code nimmt man stattdessen den Farb-String aus getComputedStyle() (Browser geben ihn als rgb(…) oder rgba(…) zurück) oder die CSS Typed OM mit element.computedStyleMap(). Die Methode ist hier nur dokumentiert, damit man Altcode versteht und pflegen kann.

Rückgabewert

Typ
RGBColor
Beschreibung
Ein RGBColor-Objekt mit den schreibgeschützten Eigenschaften red, green und blue. Jede Eigenschaft ist ein CSSPrimitiveValue. Wirft eine DOMException vom Typ InvalidAccessError, wenn der Wert keine Farbe ist.

Beispiele

Textfarbe eines Elements auslesen (Altcode, mit Funktionsprüfung)

const el = document.body;
const style = getComputedStyle(el);

if (typeof style.getPropertyCSSValue === 'function') {
  const value = style.getPropertyCSSValue('color');
  if (value.primitiveType === CSSPrimitiveValue.CSS_RGBCOLOR) {
    const rgb = value.getRGBColorValue();
    const n = CSSPrimitiveValue.CSS_NUMBER;
    console.log(
      rgb.red.getFloatValue(n),
      rgb.green.getFloatValue(n),
      rgb.blue.getFloatValue(n)
    );
  }
} else {
  console.log('getPropertyCSSValue wird nicht unterstützt');
}
0 0 0 // bei schwarzer Textfarbe (Safari) // bzw. „getPropertyCSSValue wird nicht unterstützt“ in Chrome/Firefox

Moderner Ersatz: Farb-String aus getComputedStyle zerlegen

const parseRGB = (el, prop = 'color') => {
  const str = getComputedStyle(el).getPropertyValue(prop);
  const [r, g, b, a = 1] = str.match(/[\d.]+/g).map(Number);
  return { r, g, b, a };
};

const btn = document.createElement('button');
btn.style.backgroundColor = 'tomato';
document.body.append(btn);

console.log(parseRGB(btn, 'background-color'));
{ r: 255, g: 99, b: 71, a: 1 }

Fehlerbehandlung bei Nicht-Farbwerten

const style = getComputedStyle(document.body);

if (style.getPropertyCSSValue) {
  try {
    // 'margin-top' ist eine Länge, keine Farbe
    style.getPropertyCSSValue('margin-top').getRGBColorValue();
  } catch (err) {
    console.log(err.name);
  }
}
InvalidAccessError

// Wichtig · Fallstricke

  • Veraltet und kaum noch unterstützt: Chrome und Firefox (ab Version 62) haben getPropertyCSSValue() und damit CSSPrimitiveValue entfernt. Nur WebKit/Safari bietet die API noch an. Vor jedem Aufruf deshalb per Funktionsprüfung testen, ob sie vorhanden ist.
  • Die Methode wirft einen InvalidAccessError, wenn primitiveType nicht CSS_RGBCOLOR ist. Das gilt z. B. für Schlüsselwörter wie currentcolor in bestimmten Kontexten und für Längen.
  • RGBColor hat keine Alpha-Komponente. Transparenz geht bei rgba()/hsla() also verloren.
  • Die Komponenten sind CSSPrimitiveValue-Objekte und keine Zahlen. Den Zahlenwert liefert erst getFloatValue(CSSPrimitiveValue.CSS_NUMBER).
  • Als Ersatz dienen getComputedStyle(el).color (String-Format rgb()/rgba()) oder die CSS Typed OM (el.computedStyleMap()). Beachten Sie, dass Farben in der Typed OM je nach Browser nur als CSSStyleValue ohne Farbzerlegung zurückkommen können.