anchor()

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

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

Die anchor() CSS Funktion kann innerhalb der Werteigenschaften eines ankerpositionierten Elements inset property verwendet werden und gibt einen Längenwert zurück, der relativ zur Position der Kanten des zugehörigen Ankerelements ist.

Syntax

css
/* side or percentage */
top: anchor(bottom);
top: anchor(50%);
top: calc(anchor(bottom) + 10px)
inset-block-end: anchor(start);

/* side of named anchor */
top: anchor(--myAnchor bottom);
inset-block-end: anchor(--myAnchor start);

/* side of named anchor with fallback */
top: anchor(--myAnchor bottom, 50%);
inset-block-end: anchor(--myAnchor start, 200px);
left: calc(anchor(--myAnchor right, 0%) + 10px);

Parameter

Die Syntax der anchor() Funktion ist wie folgt:

anchor( , )

Die Parameter sind:

Optional

Der anchor-name Eigenschaftswert eines Ankerelements, an dem Sie die Seite des Elements relativ positionieren möchten. Dies ist ein Wert. Wenn nicht angegeben, wird der Standardanker des Elements verwendet, der in seiner position-anchor Eigenschaft referenziert oder über das anchor HTML-Attribut mit dem Element assoziiert ist.

Hinweis: Das Angeben eines innerhalb einer anchor() Funktion assoziiert ein Element nicht mit einem Anker; es positioniert das Element nur relativ zu diesem Anker. Die position-anchor CSS-Eigenschaft oder das anchor HTML-Attribut sind weiterhin erforderlich, um die Assoziation zu erstellen.

Gibt die Seite des Ankers an oder die relative Entfernung von der start Seite, zu der das Element relativ positioniert wird. Wenn ein physischer oder logischer Wert verwendet wird, der nicht kompatibel mit der Rand-Eigenschaft ist, auf die anchor() gesetzt ist, wird der Rückfallwert verwendet. Gültige Werte umfassen:

top

Der obere Rand des Ankerelements.

Der rechte Rand des Ankerelements.

bottom

Der untere Rand des Ankerelements.

left

Der linke Rand des Ankerelements.

start

Der logische Anfang des enthaltenen Blocks des Ankerelements entlang der Achse der Rand-Eigenschaft, auf die die anchor() Funktion gesetzt ist.

end

Das logische Ende des enthaltenen Blocks des Ankerelements entlang der Achse der Rand-Eigenschaft, auf die die anchor() Funktion gesetzt ist.

self-start

Der logische Anfang des Inhalts des Ankerelements entlang der Achse der Rand-Eigenschaft, auf die die anchor() Funktion gesetzt ist.

self-end

Das logische Ende des Inhalts des Ankerelements entlang der Achse der Rand-Eigenschaft, auf die die anchor() Funktion gesetzt ist.

center

Die Mitte der Achse der Rand-Eigenschaft, auf die die anchor() Funktion gesetzt ist.

Gibt die Entfernung als Prozentsatz vom Anfang des Inhalts des Elements entlang der Achse der Rand-Eigenschaft an, auf die die anchor() Funktion gesetzt ist.

Das CSS-Anker-Positionierungsmodul spezifiziert zwei zusätzliche Werte, inside und outside, die noch nicht implementiert wurden.

Optional

Gibt einen Rückfallwert an, auf den die Funktion aufgelöst werden soll, wenn die anchor() Funktion ansonsten ungültig wäre.

Rückgabewert

Gibt einen Wert zurück.

Beschreibung

Die anchor() Funktion ermöglicht es, ein Element relativ zu den Kanten eines Ankerelements zu positionieren. Sie ist nur innerhalb von inset property Werten gültig, die auf absolut oder fest positionierten Elementen festgelegt sind.

Sie gibt einen Wert zurück, der den Abstand zwischen der ankerpositionierten Elementseite angibt, die durch den Randwert spezifiziert ist, und der Seite des Ankerelements, die durch den gewählten Wert angegeben ist. Da sie einen zurückgibt, kann sie in anderen CSS-Funktionen verwendet werden, die Längenwerte akzeptieren, einschließlich calc(), clamp(), usw.

Wenn kein Anker mit dem durch den spezifizierten Namen existiert oder das positionierte Element keinen Anker zugeordnet hat (d.h. über die position-anchor Eigenschaft), wird der erste Parameter als ungültig betrachtet und der Rückfallwert wird verwendet, falls vorhanden. Zum Beispiel, wenn top: anchor(bottom, 50px) auf dem positionierten Element spezifiziert wurde, aber kein Anker damit assoziiert war, würde der Rückfallwert verwendet werden, sodass top einen berechneten Wert von 50px erhält.

Für detaillierte Informationen zu Ankerfunktionen und deren Verwendung siehe die CSS anker positionieren Modul-Seite und den Verwendung von CSS-Ankerpositionierung Leitfaden.

Eigenschaften, die anchor() Funktionswerte akzeptieren

Die CSS Rand-Eigenschaften, die eine anchor() Funktion als Wertkomponente akzeptieren, umfassen:

Kompatibilität von Rand-Eigenschaften und Werten

Wenn eine anchor() Funktion innerhalb eines Rand-Eigenschaftswerts verwendet wird, muss der innerhalb der anchor() Funktion spezifizierte Parameter mit der Achse kompatibel sein, auf der die Rand-Eigenschaft liegt.

Das bedeutet, dass physische Werte innerhalb der Werte von physischen Rand-Eigenschaften verwendet werden können, wenn die Eigenschaft dieselbe Achsenrichtung wie der hat. Mit anderen Worten sind die Seiten top und bottom nicht innerhalb der left und right Eigenschaftswerte gültig, und die Seiten left und right sind nicht innerhalb der top und bottom Eigenschaftswerte gültig. Zum Beispiel ist top: anchor(bottom) in Ordnung, da beide vertikale Werte sind, aber top: anchor(left) ist nicht gültig, da left ein horizontaler Wert ist. Wenn top: anchor(left, 50px) angegeben wäre, würde der Rückfallwert verwendet werden, sodass top einen berechneten Wert von 50px erhält. Wenn kein Rückfall vorhanden ist, verhält sich die Rand-Eigenschaft, als wäre sie auf auto gesetzt.

Sie können logische Werte sowohl innerhalb logischer als auch physischer Rand-Eigenschaften verwenden, da logische Werte relativ zur relevanten Achse der Rand-Eigenschaft sind, unabhängig davon, ob die Eigenschaft logisch oder relativ ist. Zum Beispiel funktionieren top: anchor(start), top: anchor(self-end), inset-block-start: anchor(end) und inset-inline-end: anchor(self-start) alle gut.

Die Situation wird komplizierter, wenn physische Parameter innerhalb von logischen Rand-Eigenschaftswerten verwendet werden, da die physische Seite mit der Achse übereinstimmen muss, auf die die Rand-Eigenschaft im aktuellen Schreibmodus relevant ist. Zum Beispiel:

  • In einem horizontalen Schreibmodus ist die Blockrichtung von oben nach unten, daher wird inset-block-end: anchor(bottom) funktionieren, aber inset-block-end: anchor(left) ist nicht kompatibel. Wenn inset-block-end: anchor(left, 50px) gesetzt wäre, würde der berechnete Wert 50px betragen, und das positionierte Element würde 50px vom Blockende (unten) seines nächsten positionierten Vorgängers oder des Viewports, abhängig vom gesetzten position Wert, positioniert.
  • In einem vertikalen Schreibmodus ist die Blockrichtung von rechts nach links oder von links nach rechts, daher wird inset-block-end: anchor(left) funktionieren, aber inset-block-end: anchor(top) ist nicht kompatibel. Wenn inset-block-end: anchor(top, 50px) gesetzt wäre, würde der berechnete Wert 50px betragen, und das positionierte Element würde 50px vom Blockende (links oder rechts, abhängig vom Schreibmodus) seines nächsten positionierten Vorgängers oder des Viewports, abhängig vom gesetzten position Wert, positioniert.

Um das Potenzial für Verwirrung mit diesen Werten zu mindern, wird Ihnen empfohlen, logische Rand-Eigenschaften mit logischen Werten zu verwenden, und physische Rand-Eigenschaften mit physischen Werten. Sie sollten die Verwendung logischer Werte nach Möglichkeit bevorzugen, da diese besser für die Internationalisierung sind.

Die center und Werte sind innerhalb der anchor() Funktion in allen logischen und physischen Rand-Eigenschaften gültig.

Die folgende Tabelle listet die Rand-Eigenschaften und die Parameterwerte auf, die mit ihnen kompatibel sind. Wir haben nur die Langform-Rand-Eigenschaften aufgelistet; diese umfassen die Werte der Kurzform-Rand-Eigenschaften.

Rand-Eigenschaft Kompatibler Wert
Alle center
Alle
top und bottom top, bottom, start, end, self-start, self-end
left und right left, right, start, end, self-start, self-end
inset-block-start und inset-block-end start, end, self-start und self-end
top und bottom in horizontalen Schreibmodi
left und right in vertikalen Schreibmodi
inset-inline-start und inset-inline-end start, end, self-start und self-end
left und right in horizontalen Schreibmodi
top und bottom in vertikalen Schreibmodi

Verwendung von anchor() innerhalb von calc()

Wenn sich die anchor() Funktion auf eine Seite des Standardankers bezieht, können Sie einen margin einfügen, um bei Bedarf einen Abstand zwischen den Kanten des Ankers und des positionierten Elements zu schaffen. Alternativ können Sie die anchor() Funktion in eine calc() Funktion einfügen, um den Abstand hinzuzufügen.

Dieses Beispiel positioniert die rechte Kante des positionierten Elements bündig an der linken Kante des Ankerelements und fügt dann eine Margin ein, um etwas Platz zwischen den Kanten zu schaffen:

css
.positionedElement {
  right: anchor(left);
  margin-left: 10px;
}

Dieses Beispiel positioniert die logische Block-Endkante des positionierten Elements 10px von der logischen Block-Startkante des Ankerelements entfernt:

css
.positionedElement {
  inset-block-end: calc(anchor(start) + 10px);
}

Positionieren eines Elements relativ zu mehreren Ankern

Sie können ein Element relativ zu mehreren Ankern positionieren, indem Sie verschiedene Werte innerhalb der anchor() Funktion verschiedener Rand-Eigenschaften desselben Elements angeben (siehe Element positioniert relativ zu mehreren Ankern unten). Dies kann verwendet werden, um nützliche Funktionen wie Ziehgriffe an den Ecken eines positionierten Elements zu erstellen, die verwendet werden können, um seine Größe zu ändern.

Während ein positioniertes Element relativ zu mehr als einem Ankerelement positioniert werden kann, ist es immer nur mit dem einzigen Anker, der über seine position-anchor Eigenschaft (oder das anchor HTML-Attribut) definiert ist, assoziiert. Dies ist der Anker, mit dem das Element scrollt, wenn die Seite scrollt; er kann auch verwendet werden, um zu steuern, wann das Element bedingt versteckt wird.

Formale Syntax

 = 
anchor( ? &&
, ? )

=


=
inside |
outside |
top |
left |
right |
bottom |
start |
end |
self-start |
self-end |
|
center

=
|


Beispiele

Häufige Verwendung

In diesem Beispiel wird die anchor() Funktion verwendet, um die Höhe eines ankerpositionierten Elements auf die Höhe seines Ankers zu setzen, indem die unteren und oberen Kanten auf die unteren und oberen Kanten des Ankers gesetzt werden. Die anchor() Funktion innerhalb einer calc() Funktion wird dann verwendet, um das ankerpositionierte Element von seinem Anker zu versetzen.

HTML

Wir fügen ein

Element ein, das wir als unseren Anker festlegen, und ein

Element, das wir relativ zu diesem Anker positionieren:

html
⚓︎

This is a positioned element.

CSS

Wir setzen den anchor-name Wert des Ankerelements als den Wert der position-anchor Eigenschaft des positionierten Elements, um die Elemente zu assoziieren, und setzen dann drei Rand-Eigenschaften auf dem ankerpositionierten Element. Die ersten beiden positionieren die obere Kante des Elements bündig an der oberen Kante des Ankers und die untere Kante bündig an der unteren Kante des Ankers. In der dritten Rand-Eigenschaft wird die anchor() Funktion innerhalb einer calc() Funktion verwendet, um die linke Kante des Elements 10px zur rechten Kante des Ankers zu positionieren.

css
.anchor {
  anchor-name: --infobox;
  background: palegoldenrod;
  font-size: 3em;
  width: fit-content;
  border: 1px solid goldenrod;
}

.positionedElement {
  position: absolute;
  position-anchor: --infobox;
  margin: 0;
  top: anchor(top);
  left: calc(anchor(right) + 10px);
  bottom: anchor(bottom);
  background-color: olive;
  border: 1px solid darkolivegreen;
}

Ergebnisse

Vergleich verschiedener anchor-side Werte

Dieses Beispiel zeigt ein Element, das relativ zu einem Anker über seine top und left Eigenschaften positioniert ist, die unter Verwendung von anchor() Funktionen definiert sind. Es enthält auch zwei Dropdown-Menüs, mit denen Sie die Werte innerhalb dieser anchor() Funktionen variieren können, um zu sehen, welche Auswirkungen sie haben.

HTML

Wir spezifizieren zwei

Elemente, eines mit einer Klasse von anchor und eines mit einer Klasse von infobox. Diese sind als das Ankerelement und das positionierte Element gedacht, das wir damit assoziieren werden.

Wir fügen auch etwas Fülltext um die beiden

Elemente hinzu, um den höher zu machen, sodass er scrollen kann. Dieses Beispiel enthält auch zwei Elemente aus Gründen der Kürze ausgeblendet.

html
⚓︎

This is an information box.

CSS

Wir erklären das anchor

als ein Ankerelement, indem wir einen Ankernamen über die anchor-name Eigenschaft darauf setzen. Dann assoziieren wir es mit dem positionierten Element, indem wir denselben Wert für seine position-anchor Eigenschaft festlegen. top: anchor(--myAnchor bottom) positioniert die obere Kante der Infobox bündig an der unteren Kante ihres Ankers, während left: anchor(right) die linke Kante der Infobox bündig an der rechten Kante ihres Ankers positioniert. Dies liefert eine Anfangsposition, die überschrieben wird, wenn verschiedene Werte aus den Dropdown-Menüs ausgewählt werden.

css
.anchor {
  anchor-name: --myAnchor;
}

.infobox {
  position: fixed;
  position-anchor: --myAnchor;
  top: anchor(--myAnchor bottom);
  left: anchor(right);
}

JavaScript

Wir lauschen auf das change Ereignis, das auftritt, wenn ein neuer Wert ausgewählt wird, und setzen den ausgewählten Wert als in der anchor() Funktion innerhalb des relevanten Rand-Eigenschaftswerts (top oder left) der Infobox.

js
const infobox = document.querySelector(".infobox");
const topSelect = document.querySelector("#top-anchor-side");
const leftSelect = document.querySelector("#left-anchor-side");

topSelect.addEventListener("change", (e) => {
  const anchorSide = e.target.value;
  infobox.style.top = `anchor(--myAnchor ${anchorSide})`;
});

leftSelect.addEventListener("change", (e) => {
  const anchorSide = e.target.value;
  infobox.style.left = `anchor(${anchorSide})`;
});

Ergebnis

Wählen Sie verschiedene Werte aus den Dropdown-Menüs, um zu sehen, wie sie die Positionierung der Infobox beeinflussen.

Element positioniert relativ zu mehreren Ankern

Dieses Beispiel positioniert ein Element relativ zu zwei verschiedenen Ankern, die verwendet werden, um die Position der oberen linken und unteren rechten Ecken des ankerpositionierten Elements festzulegen. Die Anker können über Tastatursteuerungen oder per Drag-and-Drop bewegt werden, um die Größe des positionierten Elements zu ändern.

HTML

Wir spezifizieren insgesamt drei

Elemente. Die ersten beiden haben eine Klasse von anchor und werden als Anker definiert; jedes hat eine individuelle id, die verwendet wird, um ihnen unterschiedliche Positionierungsinformationen bereitzustellen. Das letzte
hat eine Klasse von infobox und wird als das positionierte Element definiert. Wir fügen das tabindex Attribut hinzu, um ihnen Tastaturfokus zu ermöglichen.

html
⚓︎1
⚓︎2

This is an information box.

CSS

Die Anker sind jeweils mit einem anderen anchor-name Wert, einem position Wert von absolute und unterschiedlichen Randwerten versehen, um die Anker in einer Rechteckform zu positionieren.

css
.anchor {
  position: absolute;
}

#anchor1 {
  anchor-name: --myAnchor1;
  top: 50px;
  left: 100px;
}

#anchor2 {
  anchor-name: --myAnchor2;
  top: 200px;
  left: 350px;
}

Das ankerpositionierte Element, dessen position auf fixed gesetzt ist, ist mit einem Anker über seine position-anchor Eigenschaft assoziiert. Es ist relativ zu zwei Ankern positioniert, indem zwei verschiedene Werte mit den anchor() Funktionen auf seinen Rand-Eigenschaften gesetzt werden. In diesem Fall haben wir Werte für den Parameter verwendet, der die Entfernung vom Anfang der Achse der Rand-Eigenschaft angibt, auf die die Funktion gesetzt ist.

css
.infobox {
  position-anchor: --myAnchor1;
  position: fixed;
  top: anchor(--myAnchor1 100%);
  left: anchor(--myAnchor1 100%);
  bottom: anchor(--myAnchor2 0%);
  right: anchor(--myAnchor2 0%);
}

Ergebnis

Das positionierte Element ist relativ zu beiden Ankerelementen positioniert. Ziehen Sie sie mit der Maus, oder drücken Sie die Tabulatortaste, um zu ihnen zu gelangen und verwenden Sie die W, A, S, und D Tasten, um sie nach oben, unten, links und rechts zu bewegen. Beobachten Sie, wie sich deren Position verändert und infolgedessen der Bereich des positionierten Elements. Scrollen Sie, um zu sehen, wie die Positionen aller Elemente beibehalten werden.

Hinweis: Dieses Beispiel ist ein Konzeptnachweis und nicht für den Einsatz in Produktionscode gedacht. Zu den Mängeln gehört, dass das Beispiel zusammenbricht, wenn Sie versuchen, die Anker horizontal oder vertikal aneinander vorbeizubewegen.

Spezifikationen

Specification
CSS Anchor Positioning
# anchor-pos

Browser-Kompatibilität

Siehe auch