[go: up one dir, main page]

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

View in English Always switch to English

anchor()

Limited availability

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

Die anchor() CSS Funktion kann innerhalb eines ankergedachten Elements bei den Werten der Eckeneigenschaft verwendet werden und gibt einen Längenwert relativ zur Position der Kanten ihres zugehörigen Ankerelements zurück.

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(--my-anchor bottom);
inset-block-end: anchor(--my-anchor start);

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

Parameter

Die Syntax der anchor()-Funktion ist wie folgt:

anchor(<anchor-name> <anchor-side>, <length-percentage>)

Die Parameter sind:

<anchor-name> Optional

Der anchor-name Eigenschaftswert eines Ankerelements, zu dem Sie die Seite des Elements relativ positionieren möchten. Dies ist ein <dashed-ident> Wert. Wenn er weggelassen wird, wird der Standardanker des Elements verwendet, der entweder in seiner position-anchor Eigenschaft referenziert oder über das anchor HTML-Attribut mit dem Element assoziiert wird.

Hinweis: Wenn Sie einen <anchor-name> in einer anchor()-Funktion angeben, wird kein Element mit einem Anker assoziiert; es positioniert lediglich das Element relativ zu diesem Anker. Die position-anchor CSS-Eigenschaft oder das anchor HTML-Attribut ist weiterhin erforderlich, um die Assoziation zu erstellen.

<anchor-side>

Gibt die Seite des Ankers an oder den relativen Abstand von der start-Seite, zu der das Element relativ positioniert ist. Wenn ein physischer oder logischer Wert verwendet wird, der nicht kompatibel mit der Eckeneigenschaft ist, auf der anchor() gesetzt ist, wird der Fallback-Wert verwendet. Gültige Werte sind:

top

Die Oberseite des Ankerelements.

Die rechte Seite des Ankerelements.

bottom

Die Unterseite des Ankerelements.

left

Die linke Seite des Ankerelements.

inside

Die gleiche Seite wie die Eckeneigenschaft.

outside

Die entgegengesetzte Seite der Eckeneigenschaft.

start

Der logische Anfangsbereich des Ankerelements enthält Block entlang der Achse der Eckeneigenschaft, auf der die anchor()-Funktion gesetzt ist.

end

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

self-start

Der logische Beginn des Inhalts des Ankerelements entlang der Achse der Eckeneigenschaft, auf der die anchor()-Funktion gesetzt ist.

self-end

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

center

Das Zentrum der Achse der Eckeneigenschaft, auf der die anchor()-Funktion gesetzt ist.

<percentage>

Gibt den Abstand als Prozentsatz vom Anfang des Inhalts des Elements entlang der Achse der Eckeneigenschaft an, auf der die anchor()-Funktion gesetzt ist.

<length-percentage> Optional

Gibt einen Fallback-Wert an, auf den die Funktion zurückgreifen soll, wenn die anchor()-Funktion andernfalls nicht gültig wäre.

Rückgabewert

Gibt einen <length> Wert zurück.

Beschreibung

Die anchor()-Funktion ermöglicht die Positionierung eines Elements relativ zu den Kanten eines Ankerelements. Sie ist nur innerhalb der Werte von Eckeneigenschaften gültig, die auf absolut oder fix positionierten Elementen gesetzt sind.

Sie gibt einen <length> Wert zurück, der den Abstand zwischen der durch den Eckentwert angegebenen Seite des ankerpositionierten Elements und der durch den gewählten <anchor-side> Wert angegebenen Seite des Ankerelements angibt. Da sie einen <length> zurückgibt, kann sie innerhalb anderer CSS-Funktionen verwendet werden, die Längenwerte akzeptieren, darunter calc(), clamp() usw.

Wenn kein Anker mit dem durch <anchor-name> angegebenen Namen existiert oder wenn das positionierte Element keinem Anker zugeordnet ist (d.h. über die position-anchor Eigenschaft), wird der erste Parameter als ungültig betrachtet und der Fallback-<length-percentage> Wert wird verwendet, falls verfügbar. Zum Beispiel, wenn top: anchor(bottom, 50px) auf dem positionierten Element spezifiziert wurde, aber kein Anker damit verknüpft wäre, würde der Fallback-Wert verwendet, so dass top einen berechneten Wert von 50px erhält.

Für detaillierte Informationen zu Ankerfunktionen und deren Verwendung sehen Sie sich das CSS-Ankerpositionierungs Modul und den Verwendung von CSS-Ankerpositionierung Leitfaden an.

Eigenschaften, die anchor()-Funktionswerte akzeptieren

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

Kompatibilität der Eckeneigenschaften und <anchor-side> Werte

Wenn Sie eine anchor()-Funktion in einem Eckeneigenschaftswert verwenden, muss der <anchor-side> Parameter innerhalb der anchor()-Funktion mit der Achse, auf der sich die Eckeneigenschaft befindet, kompatibel sein.

Das bedeutet, dass physische <anchor-side> Werte innerhalb der Werte physischer Eckeneigenschaften verwendet werden können, wenn die Eigenschaft dieselbe Achsrichtung wie der <anchor-side> aufweist. Mit anderen Worten, die top- und bottom-Seiten sind innerhalb der left- und right-Eigenschaftswerte nicht gültig, und die left- und right-Seiten sind innerhalb von top- und bottom-Eigenschaftswerten nicht gültig. Zum Beispiel ist top: anchor(bottom) in Ordnung, da beide senkrechte 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 Fallback-Wert verwendet und top würde einen berechneten Wert von 50px erhalten. Wenn kein Fallback vorhanden ist, verhält sich die Eckeneigenschaft, als wäre sie auf auto gesetzt.

Sie können logische <anchor-side> Werte innerhalb sowohl logischer als auch physischer Eckeneigenschaften verwenden, da logische <anchor-side> Werte relativ zur relevanten Achse der Eckeneigenschaft sind, 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 problemlos.

Die Geschichte wird komplizierter, wenn physische <anchor-side> Parameter innerhalb logischer Eckeneigenschaftswerte verwendet werden, da die physische Seite mit der Achse übereinstimmen muss, zu der die Eckeneigenschaft innerhalb des aktuellen Schreibmodus gehört. Zum Beispiel:

  • In einem horizontalen Schreibmodus ist die Blockrichtung von oben nach unten, daher funktioniert inset-block-end: anchor(bottom), aber inset-block-end: anchor(left) ist inkompatibel. 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 Vorfahren oder des Ansichtsfensters entfernt positioniert sein, abhängig vom gesetzten position-Wert.
  • In einem vertikalen Schreibmodus ist die Blockrichtung von rechts nach links oder links nach rechts, daher funktioniert inset-block-end: anchor(left), aber inset-block-end: anchor(top) ist inkompatibel. 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 je nach Schreibmodus) seines nächsten positionierten Vorfahren oder des Ansichtsfensters entfernt positioniert sein, abhängig vom gesetzten position-Wert.

Um die potenzielle Verwirrung mit diesen Werten zu vermeiden, wird empfohlen, logische Eckeneigenschaften mit logischen <anchor-side> Werten zu verwenden und physische Eckeneigenschaften mit physischen <anchor-side> Werten. Sie sollten logische Werte wann immer möglich bevorzugen, da sie besser für die Internationalisierung geeignet sind.

Die center und <percentage> Werte sind innerhalb der anchor()-Funktion in allen logischen und physischen Eckeneigenschaften gültig.

Die unten stehende Tabelle listet die Eckeneigenschaften auf und die <anchor-side> Parameterwerte, die mit ihnen kompatibel sind. Wir haben nur die Langform-Eckeneigenschaften aufgelistet; diese umfassen die Werte der Kurzform-Eckeneigenschaften.

Eckeneigentümer Kompatibler <anchor-side> Wert
Alle center
Alle <percentage>
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, and self-end
top und bottom im horizontalen Schreibmodus
left und right im vertikalen Schreibmodus
inset-inline-start und inset-inline-end start, end, self-start, and self-end
left und right im horizontalen Schreibmodus
top und bottom im vertikalen Schreibmodus

Verwendung von anchor() zur Positionierung von Popovers

Wenn Sie anchor() verwenden, um Popovers zu positionieren, beachten Sie, dass die Standardstile für Popovers möglicherweise mit der Position, die Sie erreichen möchten, in Konflikt stehen. Die üblichen Übeltäter sind die Standardstile für margin und inset, daher ist es ratsam, diese zurückzusetzen:

css
.positionedPopover {
  margin: 0;
  inset: auto;
}

Die CSS-Arbeitsgruppe untersucht Möglichkeiten, dieses Workaround zu vermeiden.

Verwendung von anchor() innerhalb calc()

Wenn die anchor()-Funktion auf eine Seite des Standardankers verweist, können Sie einen margin einschließen, um bei Bedarf einen Abstand zwischen den Rändern des Ankers und dem positionierten Element zu erzeugen. Alternativ können Sie die anchor()-Funktion innerhalb einer calc()-Funktion verwenden, um Abstände hinzuzufügen.

Dieses Beispiel positioniert die rechte Kante des positionierten Elements bündig an der linken Kante des Ankerelements und fügt dann einen Rand hinzu, um etwas Abstand zwischen den Kanten zu schaffen:

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

Dieses Beispiel positioniert die logische Blockende-Kante des positionierten Elements 10px von der logischen Blockanfangskante des Ankerelements entfernt:

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

Positionierung eines Elements relativ zu mehreren Ankern

Sie können ein Element relativ zu mehreren Ankern positionieren, indem Sie verschiedene <anchor-name> Werte innerhalb der anchor()-Funktion in verschiedene Eckeneigenschaften desselben Elements spezifizieren (siehe Element, das relativ zu mehreren Ankern positioniert ist unten). Dies kann verwendet werden, um nützliche Funktionalitäten wie Ziehgriffe an den Ecken eines positionierten Elements zu erstellen, mit denen es vergrößert oder verkleinert werden kann.

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

Formale Syntax

<anchor()> = 
anchor( <anchor-name>? &&
<anchor-side> , <length-percentage>? )

<anchor-name> =
<dashed-ident>

<anchor-side> =
inside |
outside |
top |
left |
right |
bottom |
start |
end |
self-start |
self-end |
<percentage> |
center

<length-percentage> =
<length> |
<percentage>

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 festzulegen, indem die unteren und oberen Kanten an die unteren und oberen Kanten des Ankers angepasst 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 <div> Element ein, das wir als unseren Anker festlegen, und ein <p> Element, das wir relativ zu diesem Anker positionieren:

html
<div class="anchor">⚓︎</div>

<p class="positionedElement">This is a positioned element.</p>

CSS

Wir legen den anchor-name Wert des Ankerelements als Wert der position-anchor Eigenschaft des positionierten Elements fest, um die Elemente zu verknüpfen, und setzen dann drei Eckeneigenschaften am ankerpositionierten Element. Die ersten beiden positionieren die obere Kante des Elements bündig mit der oberen Kante des Ankers und die untere Kante bündig mit der unteren Kante des Ankers. In der dritten Eckeneigenschaft 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 mit anchor()-Funktionen definiert sind. Es enthält auch zwei Dropdown-Menüs, die es ermöglichen, die <anchor-side> Werte innerhalb dieser anchor()-Funktionen zu variieren, so dass Sie sehen können, welchen Effekt sie haben.

HTML

Wir spezifizieren zwei <div> Elemente, eines mit einer Klasse anchor und eines mit einer Klasse infobox. Diese sollen das Ankerelement und das zugehörige positionierte Element darstellen.

Wir fügen auch Some-Text als Füller rund um die beiden <div> Elemente hinzu, um den <body> höher zu machen, damit er scrollt. Dieses Beispiel enthält auch zwei <select> Elemente, um die Dropdown-Menüs zu erstellen, mit denen verschiedene <anchor-side> Werte zur Platzierung des positionierten Elements ausgewählt werden können. Wir haben den Fülltext und die <select> Elemente der Kürze halber ausgeblendet.

html
<div class="anchor">⚓︎</div>

<div class="infobox">
  <p>This is an information box.</p>
</div>

CSS

Wir deklarieren das anchor <div> als Ankerelement, indem wir einen Ankernamen über die anchor-name Eigenschaft darauf setzen. Wir verbinden es dann mit dem positionierten Element, indem wir denselben Wert für seine position-anchor Eigenschaft setzen. top: anchor(--my-anchor bottom) positioniert die obere Kante der Infobox bündig zur unteren Kante ihres Ankers, während left: anchor(right) die linke Kante der Infobox bündig zur rechten Kante ihres Ankers positioniert. Dies bietet eine erste Position, die überschrieben wird, wenn unterschiedliche Werte aus den Dropdown-Menüs ausgewählt werden.

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

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

JavaScript

Wir horchen auf das change-Ereignis, das auftritt, wenn ein neuer <anchor-side> Wert ausgewählt wird, und setzen den ausgewählten Wert als <anchor-side> in der anchor()-Funktion innerhalb des relevanten Eckeneigenschaftswerts (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(--my-anchor ${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 sich auf die Positionierung der Infobox auswirken.

Element, das relativ zu mehreren Ankern positioniert ist

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 bewegt oder gezogen werden, wodurch das positionierte Element neu dimensioniert wird.

HTML

Wir spezifizieren insgesamt drei <div> Elemente. Die ersten beiden haben eine Klasse anchor und werden als Anker definiert; jedes hat eine individuelle id, die verwendet wird, um ihnen unterschiedliche Positionsinformationen bereitzustellen. Das letzte <div> hat eine Klasse infobox und wird als positioniertes Element definiert. Wir fügen das tabindex Attribut hinzu, um ihnen zu ermöglichen, Tastaturfokus zu empfangen.

html
<div id="anchor1" class="anchor" tabindex="0">⚓︎1</div>

<div id="anchor2" class="anchor" tabindex="0">⚓︎2</div>

<div class="infobox">
  <p>This is an information box.</p>
</div>

CSS

Die Anker erhalten jeweils einen unterschiedlichen anchor-name Wert, einen position Wert von absolute und unterschiedliche Eckeneigenschaftswerte, um die Anker in einer Rechteckformation zu positionieren.

css
.anchor {
  position: absolute;
}

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

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

Das ankerpositionierte Element, dessen position auf fixed eingestellt ist, ist mit einem Anker über seine position-anchor Eigenschaft assoziiert. Es wird relativ zu zwei Ankern positioniert, indem zwei verschiedene <anchor-name> Werte mit den anchor()-Funktionen auf seinen Eckeneigenschaften gesetzt werden. In diesem Fall haben wir <percentage> Werte für den <anchor-side> Parameter verwendet, der den Abstand vom Anfang der Achse der Eckeneigenschaft angibt, an der die Funktion festgelegt ist.

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

Ergebnis

Das positionierte Element ist relativ zu beiden Ankerelementen positioniert. Ziehen Sie sie mit der Maus oder tabben Sie zu ihnen und verwenden Sie die W, A, S und D Tasten, um sie nach oben, unten, links und rechts zu bewegen. Sehen Sie, wie sich dies auf ihre Position auswirkt und infolgedessen auf den 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 die Verwendung in Produktivcode gedacht. Zu seinen Mängeln gehört, dass das Beispiel nicht funktioniert, wenn Sie versuchen, die Anker horizontal oder vertikal aneinander vorbei zu bewegen.

Spezifikationen

Specification
CSS Anchor Positioning
# anchor-pos

Browser-Kompatibilität

Siehe auch