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, bevor Sie diese produktiv verwenden.
Die anchor()
-CSS-Funktion kann innerhalb der Werte der inset property eines Anker-positionierten Elements verwendet werden. Sie gibt einen Längenwert relativ zur Position der Kanten des 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(--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(<anchor-name> <anchor-side>, <length-percentage>)
Die Parameter sind:
<anchor-name>
Optional-
Der Wert der
anchor-name
-Eigenschaft eines Ankerelements, zu dem Sie die Seite des Elements relativ positionieren möchten. Dies ist ein<dashed-ident>
-Wert. Wenn dieser Wert weggelassen wird, wird der Standardanker des Elements verwendet, der in seinerposition-anchor
-Eigenschaft referenziert oder dem Element über dasanchor
-HTML-Attribut zugeordnet ist.Hinweis: Das Angeben eines
<anchor-name>
innerhalb eineranchor()
-Funktion verbindet kein Element mit einem Anker; es positioniert nur das Element relativ zu diesem Anker. Dieposition-anchor
-CSS-Eigenschaft oder dasanchor
-HTML-Attribut ist weiterhin erforderlich, um die Verbindung herzustellen. <anchor-side>
-
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 Inset-Eigenschaft 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
start
-
Der logische Anfang des containing block des Ankerelements entlang der Achse der Inset-Eigenschaft, auf der die
anchor()
-Funktion gesetzt ist. end
-
Das logische Ende des Containing Block des Ankerelements entlang der Achse der Inset-Eigenschaft, auf der die
anchor()
-Funktion gesetzt ist. self-start
-
Der logische Anfang des Inhalts des Ankerelements entlang der Achse der Inset-Eigenschaft, auf der die
anchor()
-Funktion gesetzt ist. self-end
-
Das logische Ende des Inhalts des Ankerelements entlang der Achse der Inset-Eigenschaft, auf der die
anchor()
-Funktion gesetzt ist. center
-
Die Mitte der Achse der Inset-Eigenschaft, auf der die
anchor()
-Funktion gesetzt ist. <percentage>
-
Gibt die Distanz, als Prozentsatz, vom Anfang des Inhalts des Elements entlang der Achse der Inset-Eigenschaft an, auf der die
anchor()
-Funktion gesetzt ist.
Das CSS-Ankerpositionierungsmodul spezifiziert zwei zusätzliche
<anchor-side>
-Werte,inside
undoutside
, welche noch nicht implementiert sind. <length-percentage>
Optional-
Gibt einen Fallback-Wert an, zu dem die Funktion aufgelöst werden sollte, falls die
anchor()
-Funktion sonst nicht gültig wäre.
Rückgabewert
Gibt einen <length>
-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 absolute oder fixierte Positionselemente gesetzt sind.
Sie gibt einen <length>
-Wert an, der den Abstand zwischen der durch den Inset-Wert spezifizierten Ankerpositionierten Elementseite und der durch den gewählten <anchor-side>
-Wert spezifizierten Ankerelementseite angibt. Da sie einen <length>
zurückgibt, kann sie innerhalb anderer CSS-Funktionen verwendet werden, die Längenwerte akzeptieren, einschließlich calc()
, clamp()
, usw.
Existiert kein Anker mit dem durch <anchor-name>
spezifizierten Namen oder ist dem positionierten Element kein Anker zugeordnet (z.B. über die position-anchor
-Eigenschaft), wird der erste Parameter als ungültig betrachtet und der Fallback-<length-percentage>
-Wert verwendet, sofern einer verfügbar ist. Wenn beispielsweise top: anchor(bottom, 50px)
auf dem positionierten Element spezifiziert wurde, aber kein Anker zugeordnet war, würde der Fallback-Wert verwendet, sodass top
einen berechneten Wert von 50px
erhalten würde.
Für detaillierte Informationen zu Ankerfunktionen und deren Verwendung, siehe die CSS anchor positioning-Modulseite und den Ankerpositionierung mit CSS verwenden-Leitfaden.
Eigenschaften, die anchor()
-Funktionswerte akzeptieren
Die CSS-inset properties, die anchor()
-Funktionen als Wertkomponente akzeptieren, sind:
top
left
bottom
right
inset
Shorthandinset-block-start
inset-block-end
inset-block
Shorthandinset-inline-start
inset-inline-end
inset-inline
Shorthand
Kompatibilität von Inset-Eigenschaften und <anchor-side>
-Werten
Beim Verwenden einer anchor()
-Funktion innerhalb eines Inset-Eigenschaftswertes muss der innerhalb der anchor()
-Funktion angegebene <anchor-side>
-Parameter mit der Achse kompatibel sein, auf der sich die Inset-Eigenschaft befindet.
Dies bedeutet, dass physische <anchor-side>
-Werte innerhalb der Werte physischer Inset-Eigenschaften verwendet werden können, wenn die Eigenschaft die gleiche Achsenrichtung wie <anchor-side>
hat. 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 top
- und bottom
-Eigenschaftswerte nicht gültig. Beispielsweise 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 wird, würde der Fallback-Wert verwendet, sodass top
einen berechneten Wert von 50px
erhalten würde. Ist kein Fallback vorhanden, verhält sich die Inset-Eigenschaft, als wäre sie auf auto
gesetzt.
Sie können logische <anchor-side>
-Werte sowohl innerhalb logischer als auch physischer Inset-Eigenschaften verwenden, da logische <anchor-side>
-Werte relativ zur relevanten Achse der Inset-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 einwandfrei.
Die Situation wird komplizierter, wenn physische <anchor-side>
-Parameter innerhalb logischer Inset-Eigenschaftswerte verwendet werden, da die physische Seite mit der Achse übereinstimmen muss, die für die Inset-Eigenschaft im aktuellen Schreibmodus relevant ist. Zum Beispiel:
- In einem horizontalen Schreibmodus verläuft die Blockrichtung von oben nach unten, daher funktioniert
inset-block-end: anchor(bottom)
, aberinset-block-end: anchor(left)
ist unvereinbar. Wenninset-block-end: anchor(left, 50px)
gesetzt ist, würde der berechnete Wert50px
betragen, und das positionierte Element würde50px
vom Blockende (untere Seite) seines nächsten positionierten Vorfahren oder des Viewports entfernt positioniert werden, abhängig vom gesetztenposition
-Wert. - In einem vertikalen Schreibmodus verläuft die Blockrichtung von rechts nach links oder von links nach rechts, daher funktioniert
inset-block-end: anchor(left)
, aberinset-block-end: anchor(top)
ist unvereinbar. Wenninset-block-end: anchor(top, 50px)
gesetzt ist, würde der berechnete Wert50px
betragen, und das positionierte Element würde50px
vom Blockende (linke oder rechte Seite, abhängig vom Schreibmodus) seines nächsten positionierten Vorfahren oder des Viewports entfernt positioniert werden, abhängig vom gesetztenposition
-Wert.
Um das Potenzial für Verwirrung mit diesen Werten zu mindern, wird empfohlen, logische Inset-Eigenschaften mit logischen <anchor-side>
-Werten und physische Inset-Eigenschaften mit physischen <anchor-side>
-Werten zu verwenden. Sie sollten die Verwendung logischer 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 Inset-Eigenschaften gültig.
Die folgende Tabelle listet die Inset-Eigenschaften und die <anchor-side>
-Parameterwerte auf, die mit ihnen kompatibel sind. Wir haben nur die einzelnen Inset-Eigenschaftswerte aufgelistet; diese umfassen die Werte der Shorthand-Inset-Eigenschaften.
Inset-Eigenschaft | 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 , und self-end top und bottom in horizontalen Schreibmodileft und right in vertikalen Schreibmodi |
inset-inline-start und inset-inline-end |
start , end , self-start , und self-end left und right in horizontalen Schreibmoditop und bottom in vertikalen Schreibmodi |
Verwendung von anchor()
innerhalb von calc()
Wenn die anchor()
-Funktion sich auf eine Seite des Standardankers bezieht, können Sie eine margin
hinzufügen, um bei Bedarf einen Abstand zwischen den Kanten des Ankers und des positionierten Elements zu schaffen. Alternativ können Sie die anchor()
-Funktion innerhalb einer calc()
-Funktion verwenden, um einen Abstand hinzuzufügen.
Dieses Beispiel positioniert die rechte Kante des positionierten Elements bündig zur linken Kante des Ankerelements und fügt dann einen Rand hinzu, um etwas Platz zwischen den Kanten zu schaffen:
.positionedElement {
right: anchor(left);
margin-left: 10px;
}
Dieses Beispiel positioniert die logische Blockendkante des positionierten Elements 10px
von der logischen Blockstartkante 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 innerhalb der anchor()
-Funktion in verschiedenen Inset-Eigenschaften auf demselben Element unterschiedliche <anchor-name>
-Werte angeben (siehe Element positioniert relativ zu mehreren Ankern unten). Dies kann verwendet werden, um nützliche Funktionen wie Ziehpunkte an den Ecken eines positionierten Elements zu erstellen, die verwendet werden können, um es zu skalieren.
Während ein positioniertes Element relativ zu mehr als einem Ankerelement positioniert werden kann, ist es immer nur mit dem einzelnen Anker verbunden, der über seine position-anchor
-Eigenschaft (oder das anchor
-HTML-Attribut) definiert ist. Dies ist der Anker, mit dem das Element beim Scrollen der Seite scrollen wird; es kann auch verwendet werden, um zu kontrollieren, wann das Element bedingt ausgeblendet wird.
Formale Syntax
Beispiele
Häufige Verwendung
In diesem Beispiel wird die anchor()
-Funktion verwendet, um die Höhe eines Anker-positionierten Elements auf die Höhe seines Ankers zu setzen, indem die untere und obere Kante auf die untere und obere Kante des Ankers gesetzt werden. Die anchor()
-Funktion wird dann innerhalb einer calc()
-Funktion verwendet, um das Anker-positionierte Element von seinem Anker abzusetzen.
HTML
Wir fügen ein <div>
-Element ein, welches wir als unseren Anker festlegen, und ein <p>
-Element, das wir relativ zu diesem Anker positionieren werden:
<div class="anchor">⚓︎</div>
<p class="positionedElement">This is a positioned element.</p>
CSS
Wir setzen den anchor-name
-Wert des Ankerelements als den Wert der position-anchor
-Eigenschaft des positionierten Elements, um die Elemente zu verknüpfen, und setzen dann drei Inset-Eigenschaften auf das Anker-positionierte 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 Inset-Eigenschaft 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 mithilfe von anchor()
-Funktionen definiert sind. Es enthält auch zwei Dropdown-Menüs, die es Ihnen ermöglichen, die <anchor-side>
-Werte innerhalb dieser anchor()
-Funktionen zu variieren, sodass Sie sehen können, welche Auswirkungen sie haben.
HTML
Wir spezifizieren zwei <div>
-Elemente, eines mit einer Klasse von anchor
und eines mit einer Klasse von infobox
. Diese sind dazu gedacht, das Ankerelement und das positionierte Element zu sein, die wir damit verknüpfen werden.
Wir fügen auch etwas Fülltext um die beiden <div>
-Elemente herum hinzu, um den <body>
höher zu machen, sodass er scrollen kann. Dieses Beispiel enthält auch zwei <select>
-Elemente, um die Dropdown-Menüs zu erstellen, die die Auswahl verschiedener <anchor-side>
-Werte ermöglichen, mit denen das positionierte Element platziert wird. 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 ein Ankerelement, indem wir einen Ankernamen darauf über die anchor-name
-Eigenschaft setzen. Wir assoziieren es dann mit dem positionierten Element, indem wir denselben Wert für seine position-anchor
-Eigenschaft setzen. top: anchor(--myAnchor bottom)
positioniert die Oberkante der Infobox bündig an der Unterkante ihres Ankers, während left: anchor(right)
die linke Kante der Infobox bündig an der rechten Kante ihres Ankers positioniert. Dies bietet eine Ausgangsposition, die überschrieben wird, wenn unterschiedliche Werte aus den Dropdown-Menüs ausgewählt werden.
.anchor {
anchor-name: --myAnchor;
}
.infobox {
position: fixed;
position-anchor: --myAnchor;
top: anchor(--myAnchor bottom);
left: anchor(right);
}
JavaScript
Wir lauschen dem change
-Ereignis, das auftritt, wenn ein neuer <anchor-side>
-Wert ausgewählt wird, und legen den ausgewählten Wert als <anchor-side>
in der anchor()
-Funktion innerhalb der relevanten Inset-Eigenschaft (top
oder left
) der Infobox fest.
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 Anker-positionierten Elements festzulegen. Die Anker können über Tastatursteuerungen oder durch Ziehen bewegt werden und ändern dadurch die Größe des positionierten Elements.
HTML
Wir spezifizieren insgesamt drei <div>
-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 zu geben. Das letzte <div>
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.
<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 unterschiedliche anchor-name
-Werte, einen position
-Wert von absolute
und unterschiedliche Inset-Werte, um die Anker in einer Rechteckformation zu positionieren.
.anchor {
position: absolute;
}
#anchor1 {
anchor-name: --myAnchor1;
top: 50px;
left: 100px;
}
#anchor2 {
anchor-name: --myAnchor2;
top: 200px;
left: 350px;
}
Das Anker-positionierte Element, dessen position
auf fixed
gesetzt ist, wird über seine position-anchor
-Eigenschaft mit einem Anker verknüpft. Es wird relativ zu zwei Ankern positioniert, indem zwei verschiedene <anchor-name>
-Werte mit den anchor()
-Funktionen festgesetzt werden, die auf seinen Inset-Eigenschaften gesetzt sind. In diesem Fall haben wir <percentage>
-Werte für den <anchor-side>
-Parameter verwendet und geben die Distanz vom Anfang der Achse der Inset-Eigenschaft an, auf der die Funktion gesetzt ist.
.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 wird relativ zu beiden Ankerelementen positioniert. Ziehen Sie sie mit der Maus oder wechseln Sie zu ihnen mit der Tabulatortaste und verwenden Sie die Tasten W, A, S und D, um sie nach oben, unten, links, und rechts zu bewegen. Sehen Sie, wie sich ihre Position und als Konsequenz der Bereich des positionierten Elements ändert. 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 vorgesehen. Zu seinen Schwächen gehört, dass das Beispiel bricht, wenn Sie versuchen, die Anker horizontal oder vertikal aneinander vorbei zu bewegen.
Spezifikationen
Specification |
---|
CSS Anchor Positioning # anchor-pos |
Browser-Kompatibilität
BCD tables only load in the browser