attr()

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

* Some parts of this feature may have varying levels of support.

Hinweis: Die attr() Funktion kann mit jeder CSS-Eigenschaft verwendet werden, aber die Unterstützung für Eigenschaften außer content ist experimentell.

Die attr() CSS Funktion wird verwendet, um den Wert eines Attributs des ausgewählten Elements abzurufen und ihn in einem Eigenschaftswert zu verwenden, ähnlich wie die var() Funktion einen benutzerdefinierten Eigenschaftswert ersetzt. Sie kann auch mit Pseudo-Elementen verwendet werden, wobei in diesem Fall der Attributwert des Ursprünglichelements des Pseudo-Elements zurückgegeben wird.

Probieren Sie es aus

Syntax

css
/* Basic usage */
attr(data-count)
attr(href)

/* With type */
attr(data-width px)
attr(data-size rem)
attr(data-name string)
attr(id type(<custom-ident>))
attr(data-count type(<number>))
attr(data-size type(<length> | <percentage>))

/* With fallback */
attr(data-count type(<number>), 0)
attr(data-width px, inherit)
attr(data-something, "default")

Parameter

Die Syntax der attr() Funktion ist wie folgt:

attr(<attr-name> <attr-type>? , <fallback-value>?)

Die Parameter sind:

<attr-name>

Der Attributname, dessen Wert von den ausgewählten HTML-Elementen abgerufen werden soll.

<attr-type>

Gibt an, wie der Attributwert in einen CSS-Wert geparst wird. Dies kann das string-Schlüsselwort, eine type()-Funktion oder eine CSS-Dimensionseinheit sein. Wenn nicht angegeben, wird standardmäßig string verwendet.

  • Das string-Schlüsselwort parst den Wert in einen CSS-String.

    css
    attr(data-name string, "stranger")
    
  • Die type()-Funktion nimmt ein <syntax> als Argument, das angibt, in welchen Datentyp der Wert geparst werden soll. Das <syntax> kann <angle>, <color>, <custom-ident>, <image>, <integer>, <length>, <length-percentage>, <number>, <percentage>, <resolution>, <string>, <time>, <transform-function> oder eine Kombination davon sein.

    css
    attr(id type(<custom-ident>), none)
    attr(data-count type(<number>), 0)
    

    Um mehrere Typen zu akzeptieren, geben Sie alle erlaubten <syntax>e in der type()-Funktion an, getrennt durch ein |.

    css
    attr(data-size type(<length> | <percentage>), 0px)
    

    Aus Sicherheitsgründen ist <url> als <syntax> nicht erlaubt.

  • Der <attr-unit>-Bezeichner gibt die Einheit an, die ein numerischer Wert haben soll (falls vorhanden). Es kann das %-Zeichen (Prozent) oder eine CSS-Streckeneinheit wie px, rem, deg, s usw. sein.

    css
    attr(data-size rem)
    attr(data-width px, inherit)
    attr(data-rotation deg)
    
<fallback-value>

Der Wert, der verwendet werden soll, wenn das angegebene Attribut fehlt oder einen ungültigen Wert enthält.

Rückgabewert

Der Rückgabewert von attr() ist der Wert des HTML-Attributs, dessen Name <attr-name> ist, geparst als der angegebene <attr-type> oder geparst als ein CSS-String.

Wenn ein <attr-type> festgelegt ist, versucht attr(), das Attribut in den angegebenen <attr-type> zu parsen und zurückzugeben. Wenn das Attribut nicht in den angegebenen <attr-type> geparst werden kann, wird stattdessen der <fallback-value> zurückgegeben. Wenn kein <attr-type> festgelegt ist, wird das Attribut in einen CSS-String geparst.

Wenn kein <fallback-value> festgelegt ist, wird der Rückgabewert standardmäßig ein leerer String sein, wenn kein <attr-type> festgelegt ist, oder der garantiert ungültige Wert, wenn ein <attr-type> festgelegt ist.

Beschreibung

Einschränkungen und Sicherheit

Die attr() Funktion kann auf Attribute verweisen, die vom Seitenautor nie für die Verwendung im Styling vorgesehen waren, und könnte sensible Informationen enthalten (zum Beispiel ein Sicherheitstoken, das von Skripten auf der Seite verwendet wird). Im Allgemeinen ist das unproblematisch, aber es kann zu einem Sicherheitsrisiko werden, wenn es in URLs verwendet wird. Daher können Sie attr() nicht verwenden, um URLs dynamisch zu konstruieren.

html
<!-- This won't work! -->
<span data-icon="https://example.org/icons/question-mark.svg">help</span>
<style>
  span[data-icon] {
    background-image: url(attr(data-icon));
  }
</style>

Werte, die attr() verwenden, werden als "attr()-verunreinigt" markiert. Die Verwendung eines attr()-verunreinigten Wertes als oder in einem <url> macht eine Deklaration "invalid at computed value time" oder IACVT".

Rückwärtskompatibilität

Im Allgemeinen ist die moderne attr() Syntax rückwärtskompatibel, da die alte Verwendungsmethode — ohne Angabe eines <attr-type> — sich genauso verhält wie vorher. Das Vorhandensein von attr(data-attr) in Ihrem Code ist dasselbe wie das Schreiben von attr(data-attr type(<string>)) oder das einfachere attr(data-attr string).

Es gibt jedoch zwei Sonderfälle, in denen sich die moderne attr() Syntax anders verhält als die alte Syntax.

Im folgenden Snippet werden Browser, die die moderne attr() Syntax nicht unterstützen, die zweite Deklaration verwerfen, weil sie diese nicht parsen können. Das Ergebnis in diesen Browsern ist "Hello World".

html
<div text="Hello"></div>
css
div::before {
  content: attr(text) " World";
}
div::before {
  content: attr(text) 1px;
}

In Browsern mit Unterstützung für die moderne Syntax wird die Ausgabe … nichts sein. Diese Browser werden die zweite Deklaration erfolgreich parsen, aber weil es ungültiger Inhalt für die content Eigenschaft ist, wird die Deklaration "invalid at computed value time" oder IACVT".

Um diese Art von Situation zu verhindern, wird Feature-Erkennung empfohlen.

Ein zweiter Sonderfall ist der folgende:

html
<div id="parent"><div id="child" data-attr="foo"></div></div>
css
#parent {
  --x: attr(data-attr);
}
#child::before {
  content: var(--x);
}

Browser ohne Unterstützung für moderne Syntax zeigen den Text "foo". In Browsern mit moderner attr() Unterstützung gibt es keine Ausgabe.

Dies ist, weil attr() — ähnlich wie benutzerdefinierte Eigenschaften, die die var() Funktion verwenden — bei Berechnungszeitpunkt ersetzt werden. Mit dem modernen Verhalten versucht --x zuerst, das data-attr Attribut vom #parent Element zu lesen, was zu einem leeren String führt, da es kein solches Attribut auf #parent gibt. Dieser leere String wird dann vom #child Element geerbt, was zu einer content: ; Deklaration führt.

Um diese Art von Situation zu verhindern, sollten Sie keine geerbten attr() Werte an Kinder weitergeben, es sei denn, Sie möchten dies ausdrücklich.

Feature-Erkennung

Sie können die Unterstützung für moderne attr() Syntax mit der @supports at-rule erkennen. Im Test versuchen Sie, erweitertes attr() einer (nicht benutzerdefinierten) CSS-Eigenschaft zuzuweisen.

Zum Beispiel:

css
@supports (x: attr(x type(*))) {
  /* Browser has modern attr() support */
}

@supports not (x: attr(x type(*))) {
  /* Browser does not have modern attr() support */
}

Wir können denselben Check in JavaScript mit CSS.supports() durchführen:

js
if (CSS.supports("x: attr(x type(*))")) {
  /* Browser has modern attr() support */
}

if (!CSS.supports("x: attr(x type(*))")) {
  /* Browser does not have modern attr() support */
}

Formale Syntax

<attr()> = 
attr( <attr-name> <attr-type>? , <declaration-value>? )

<attr-name> =
[ <ident-token>? '|' ]? <ident-token>

<attr-type> =
type( <syntax> ) |
string |
<attr-unit>

<syntax> =
'*' |
<syntax-component> [ <syntax-combinator> <syntax-component> ]* |
<syntax-string>

<syntax-component> =
<syntax-single-component> <syntax-multiplier>? |
'<' transform-list '>'

<syntax-combinator> =
'|'

<syntax-string> =
<string>

<syntax-single-component> =
'<' <syntax-type-name> '>' |
<ident>

<syntax-multiplier> =
'#' |
'+'

<syntax-type-name> =
angle |
color |
custom-ident |
image |
integer |
length |
length-percentage |
number |
percentage |
resolution |
string |
time |
url |
transform-function

Beispiele

content Eigenschaft

In diesem Beispiel fügen wir den Wert des data-foo data-* globalen Attributs zum Inhalt des <p> Elements hinzu.

HTML

html
<p data-foo="hello">world</p>

CSS

css
[data-foo]::before {
  content: attr(data-foo) " ";
}

Ergebnis

Verwenden eines Fallback-Werts

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

In diesem Beispiel fügen wir den Wert des data-browser data-* globalen Attributs zum <p> Element hinzu. Wenn das data-browser Attribut auf dem <p> Element fehlt, fügen wir den Fallback-Wert "Unknown" hinzu.

HTML

html
<p data-browser="Firefox">My favorite browser is:</p>
<p>Your favorite browser is:</p>

CSS

css
p::after {
  content: " " attr(data-browser, "Unknown");
  color: tomato;
}

Ergebnis

Farbwert

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

In diesem Beispiel setzen wir den CSS-Wert von background-color auf den Wert des data-background data-* globalen Attributs, das dem <div> Element zugewiesen ist.

HTML

html
<div class="background" data-background="lime">
  background expected to be red if your browser does not support advanced usage
  of attr()
</div>

CSS

css
.background {
  background-color: red;
}

.background[data-background] {
  background-color: attr(data-background type(<color>), red);
}

Ergebnis

Verwenden von Dimensions-Einheiten

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

In diesem Beispiel wird das data-rotation Attribut in eine deg Einheit geparst, die die Rotation des Elements angibt.

HTML

html
<div data-rotation="-3">I am rotated by -3 degrees</div>
<div data-rotation="2">And I by 2 degrees</div>
<div>And so am I, using the fallback value of 1.5deg</div>

CSS

css
div {
  width: fit-content;
  transform-origin: 50% 50%;
  rotate: attr(data-rotation deg, 1.5deg);
}

Ergebnis

Parsen von attr() Werten als <custom-ident>s

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

In diesem Beispiel werden die Werte für die view-transition-name Eigenschaft aus dem id Attribut des Elements abgeleitet. Das Attribut wird in ein <custom-ident> geparst, welches von view-transition-name als Wert akzeptiert wird.

Die resultierenden Werte für view-transition-name sind card-1, card-2, card-3 usw.

HTML

Das HTML enthält vier Karten mit unterschiedlichen id Attributen und einen "Shuffle cards" <button>, der die Karten mischt.

html
<div class="cards">
  <div class="card" id="card-1">1</div>
  <div class="card" id="card-2">2</div>
  <div class="card" id="card-3">3</div>
  <div class="card" id="card-4">4</div>
</div>
<button>Shuffle cards</button>

CSS

Die Karten sind in einem Flex-Container angeordnet:

css
.cards {
  display: flex;
  flex-direction: row;
  gap: 1em;
  padding: 1em;
}

Auf jeder Karte ruft die attr() Funktion das id Attribut ab und parst es in ein <custom-ident>, das als Wert für die view-transition-name Eigenschaft verwendet wird. Wenn kein id auf einer Karte festgelegt ist, wird stattdessen der Fallback-Wert none verwendet.

css
.card {
  view-transition-name: attr(id type(<custom-ident>), none);
  view-transition-class: card;
}

JavaScript

Wenn der <button> gedrückt wird, werden die Karten gemischt. Dies geschieht durch Zufallsanordnung der Reihenfolge eines Arrays, das Verweise auf alle Karten enthält, und dann Aktualisieren der order Eigenschaft jeder Karte auf ihre neue Array-Indexposition.

Um jede Karte zu ihrem neuen Standort zu animieren, werden View Transitions verwendet. Dies erfolgt durch das Einhüllen des order Updates in einen Anruf bei document.startViewTransition.

js
const shuffle = (array) => {
  for (let i = array.length - 1; i >= 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
};

document.querySelector("button").addEventListener("click", (e) => {
  const $cards = Array.from(document.querySelectorAll(".card"));
  shuffle($cards);
  document.startViewTransition(() => {
    $cards.forEach(($card, i) => {
      $card.style.setProperty("order", i);
    });
  });
});

Ergebnis

Spezifikationen

Specification
CSS Values and Units Module Level 5
# attr-notation

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch