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
/* 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-nameEigenschaftswert 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 seinerposition-anchorEigenschaft referenziert oder über dasanchorHTML-Attribut mit dem Element assoziiert wird.Hinweis: Wenn Sie einen
<anchor-name>in eineranchor()-Funktion angeben, wird kein Element mit einem Anker assoziiert; es positioniert lediglich das Element relativ zu diesem Anker. Dieposition-anchorCSS-Eigenschaft oder dasanchorHTML-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 deranchor()gesetzt ist, wird der Fallback-Wert verwendet. Gültige Werte sind:top-
Die Oberseite des Ankerelements.
right-
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:
topleftbottomrightinsetKurzforminset-block-startinset-block-endinset-blockKurzforminset-inline-startinset-inline-endinset-inlineKurzform
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), aberinset-block-end: anchor(left)ist inkompatibel. Wenninset-block-end: anchor(left, 50px)gesetzt wäre, würde der berechnete Wert50pxbetragen, und das positionierte Element würde50pxvom Blockende (unten) seines nächsten positionierten Vorfahren oder des Ansichtsfensters entfernt positioniert sein, abhängig vom gesetztenposition-Wert. - In einem vertikalen Schreibmodus ist die Blockrichtung von rechts nach links oder links nach rechts, daher funktioniert
inset-block-end: anchor(left), aberinset-block-end: anchor(top)ist inkompatibel. Wenninset-block-end: anchor(top, 50px)gesetzt wäre, würde der berechnete Wert50pxbetragen, und das positionierte Element würde50pxvom Blockende (links oder rechts je nach Schreibmodus) seines nächsten positionierten Vorfahren oder des Ansichtsfensters entfernt positioniert sein, abhängig vom gesetztenposition-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-endtop und bottom im horizontalen Schreibmodusleft und right im vertikalen Schreibmodus |
inset-inline-start und inset-inline-end |
start, end, self-start, and self-endleft und right im horizontalen Schreibmodustop 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:
.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:
.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:
.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:
<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.
.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.
<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.
.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.
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.
<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.
.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.
.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
position-anchorposition-areaanchor-size()Funktion- Verwendung von CSS-Ankerpositionierung Leitfaden
- Fallback-Optionen und bedingtes Ausblenden für Overflow Leitfaden
- CSS-Ankerpositionierung Modul