Verwenden von CSS-Ankerpositionierung
Das CSS-Ankerpositionierungsmodul definiert Funktionen, die es ermöglichen, Elemente miteinander zu verbinden. Elemente können als Ankerelemente und ankerpositionierte Elemente definiert werden. Ankerpositionierte Elemente können an Ankerelemente gebunden werden. Die ankerpositionierten Elemente können dann in ihrer Größe und Position im Verhältnis zur Größe und Position der Ankerelemente, an die sie gebunden sind, eingestellt werden.
Die CSS-Ankerpositionierung bietet auch CSS-exklusive Mechanismen, um mehrere alternative Positionen für ein ankerpositioniertes Element zu spezifizieren. Zum Beispiel, wenn ein Tooltip an ein Formularfeld verankert ist, aber der Tooltip ansonsten außerhalb des Bildschirms in seinen Standardpositionseinstellungen dargestellt würde, kann der Browser versuchen, ihn in einer anderen vorgeschlagenen Position zu rendern, sodass er auf dem Bildschirm platziert wird, oder ihn alternativ verbergen, wenn gewünscht.
Dieser Artikel erklärt die grundlegenden Konzepte der Ankerpositionierung und wie man die Assoziations-, Positionierungs- und Größeneinstellungen auf einer grundlegenden Ebene verwendet. Wir haben Links zu Referenzseiten mit zusätzlichen Beispielen und Syntaxdetails für jedes hier diskutierte Konzept beigefügt. Informationen zum Festlegen alternativer Positionen und Ausblenden von ankerpositionierten Elementen finden Sie im Leitfaden für Fallback-Optionen und bedingtes Verbergen bei Überlauf.
Grundlegende Konzepte
Es ist sehr üblich, dass man ein Element an ein anderes anbinden oder befestigen möchte. Beispielsweise:
- Fehlermeldungen, die neben Formularelementen angezeigt werden.
- Tooltips oder Infoboxen, die neben einem UI-Element erscheinen, um mehr Informationen darüber zu liefern.
- Einstellungs- oder Optionsdialoge, die aufgerufen werden können, um UI-Elemente schnell zu konfigurieren.
- Dropdown- oder Popover-Menüs, die neben einer zugehörigen Navigationsleiste oder Schaltfläche erscheinen.
Moderne Schnittstellen erfordern häufig, dass einige Inhalte – oft wiederverwendbar und dynamisch generiert – relativ zu einem Ankerelement positioniert sind. Solche Anwendungsfälle zu erstellen, wäre relativ einfach, wenn das zu bindende Element (auch bekannt als Ankerelement) immer am gleichen Ort in der Benutzeroberfläche wäre und das angebundene Element (auch bekannt als ankerpositioniertes Element oder einfach positioniertes Element) immer unmittelbar davor oder danach in der Quellreihenfolge platziert werden könnte. Allerdings ist dies selten so einfach.
Die Position der positionierten Elemente relativ zu ihrem Ankerelement muss beibehalten und angepasst werden, wenn das Ankerelement sich bewegt oder seine Konfiguration ändert (z. B. durch Scrollen, Ändern der Viewport-Größe, Drag-and-Drop usw.). Zum Beispiel, wenn ein Element wie ein Formularfeld in die Nähe des Viewport-Randes gerät, kann sein Tooltip sich außerhalb des Bildschirms befinden. Im Allgemeinen wollen Sie, dass der Tooltip an sein Formularelement gebunden ist und sicherstellen, dass der Tooltip so lange vollständig sichtbar auf dem Bildschirm bleibt, wie das Formularfeld sichtbar ist, indem der Tooltip bei Bedarf automatisch verschoben wird. Dies haben Sie möglicherweise als Standardverhalten in Ihrem Betriebssystem bemerkt, wenn Sie Kontextmenüs mit einem Rechtsklick (Strg + Klick) auf Ihrem Desktop oder Laptop öffnen.
Historisch gesehen erforderte das Verknüpfen eines Elements mit einem anderen Element und das dynamische Ändern der Position und Größe eines positionierten Elements basierend auf der Position eines Ankers JavaScript, was Komplexität und Leistungsprobleme hinzufügte. Es war zudem nicht garantiert, dass es in allen Situationen funktioniert. Die im CSS-Ankerpositionierungsmodul definierten Funktionen ermöglichen die Implementierung solcher Anwendungsfälle leistungsfähig und deklarativ mit CSS (und HTML) statt mit JavaScript.
Verknüpfung von Anker- und positionierten Elementen
Um ein Element mit einem Anker zu verknüpfen, müssen Sie zuerst deklarieren, welches Element der Anker ist, und dann angeben, welche positionierten Elemente mit diesem Anker verknüpft werden sollen. Dies schafft eine Ankerreferenz zwischen den beiden. Diese Verknüpfung kann explizit über CSS oder implizit erstellt werden.
Explizite CSS-Ankerverknüpfung
Um ein Element mit CSS als Anker zu deklarieren, müssen Sie einen Ankernamen über die anchor-name
-Eigenschaft darauf setzen. Der Ankername muss ein <dashed-ident>
sein. In diesem Beispiel setzen wir auch die width
des Ankers auf fit-content
, um einen kleinen quadratischen Anker zu erhalten, der den Verankerungseffekt besser demonstriert.
.anchor {
anchor-name: --my-anchor;
width: fit-content;
}
Um ein Element in ein ankerpositioniertes Element zu konvertieren, sind zwei Schritte erforderlich: Es muss absolut oder fest positioniert werden, indem die position
-Eigenschaft verwendet wird. Das positionierte Element hat dann seine position-anchor
-Eigenschaft auf den Wert der anchor-name
-Eigenschaft des Ankerelements gesetzt, um die beiden zu verknüpfen:
.infobox {
position: fixed;
position-anchor: --my-anchor;
}
Wir werden das obige CSS auf das folgende HTML anwenden:
<div class="anchor">⚓︎</div>
<div class="infobox">
<p>This is an information box.</p>
</div>
Dies wird wie folgt gerendert:
Der Anker und die Infobox sind jetzt verknüpft, aber im Moment müssen Sie uns dies glauben. Sie sind noch nicht miteinander verbunden — wenn Sie den Anker positionieren und an eine andere Stelle auf der Seite verschieben würden, würde er sich alleine verschieben und die Infobox an derselben Stelle belassen. Sie werden die tatsächliche Verbindung in Aktion sehen, wenn wir uns mit dem Positionieren von Elementen basierend auf der Ankerposition befassen.
Implizite Ankerverknüpfung
In einigen Fällen wird eine implizite Ankerreferenz zwischen zwei Elementen aufgrund der semantischen Natur ihrer Beziehung hergestellt. Zum Beispiel, wenn Sie die Popover API verwenden, um ein Popover mit einem Bedienelement zu verknüpfen, wird eine implizite Ankerreferenz zwischen den beiden hergestellt. Dies kann auftreten, wenn:
- Sie ein Popover deklarativ mit einem Bedienelement verknüpfen, indem Sie die
popovertarget
undid
Attribute verwenden. - Sie eine Popover-Aktion wie
showPopover()
mit einem Bedienelement programmgesteuert verknüpfen, indem Sie diesource
-Option verwenden. - Ein
<select>
-Element und sein Dropdown-Auswahlwerkzeug in die Funktionalität einer anpassbaren Auswahlelement über dieappearance
-Eigenschaftbase-select
-Wert eingebunden sind. In diesem Fall wird eine implizite Popover-Aufrufer-Beziehung zwischen den beiden hergestellt, was auch bedeutet, dass sie eine implizite Ankerreferenz haben werden.
Hinweis: Die oben genannten Methoden verknüpfen einen Anker mit einem Element, aber sie sind noch nicht miteinander verbunden. Um sie miteinander zu verbinden, muss das positionierte Element relativ zu seinem Anker positioniert werden, was mit CSS geschieht.
Positionierung von Elementen relativ zu ihrem Anker
Wie oben zu sehen war, ist die Verknüpfung eines positionierten Elements mit einem Anker allein nicht sehr nützlich. Unser Ziel ist es, das positionierte Element relativ zu seinem zugehörigen Ankerelement zu platzieren. Dies geschieht entweder durch Setzen eines CSS anchor()
-Funktion-Werts auf einer Einfügeeigenschaft, Spezifizieren eines position-area
oder durch Zentrieren des positionierten Elements mit dem anchor-center
-Platzierungswert.
Hinweis:
Das Ankerelement muss ein sichtbarer DOM-Knoten sein, damit die Verknüpfung und Positionierung funktioniert. Wenn es versteckt ist (zum Beispiel über display: none
), wird das positionierte Element relativ zu seinem nächstgelegenen positionierten Vorfahren positioniert. Wir erörtern, wie man ein ankerpositioniertes Element ausblendet, wenn sein Anker in Bedingtes Verbergen mit position-visibility
verschwindet.
Verwenden von Einfügeeigenschaften mit anchor()
-Funktionswerten
Konventionelle absolut und fest positionierte Elemente werden explizit positioniert, indem man Länge
oder Prozentsatz
-Werte auf Einfügeeigenschaften setzt. Mit position: absolute
ist dieser Einfügepositionierungswert eine absolute Entfernung relativ zu den Rändern des nächstgelegenen positionierten Vorfahren. Mit position: fixed
ist der Einfügepositionierungswert eine absolute Entfernung relativ zum Viewport.
Die CSS-Ankerpositionierung ändert dieses Paradigma, indem ankerpositionierten Elementen die Möglichkeit gegeben wird, relativ zu den Rändern ihrer zugehörigen Anker platziert zu werden. Das Modul definiert die anchor()
-Funktion, die ein gültiger Wert für jede der Einfügeeigenschaften ist. Wenn sie verwendet wird, setzt die Funktion den Einfügepositionierungswert als absolute Entfernung relativ zum Ankerelement, indem sie das Ankerelement, die Seite des Ankerelements, zu der das positionierte Element relativ positioniert wird, und die Entfernung von dieser Seite definiert.
Die Funktionskomponenten sehen so aus:
anchor(<anchor-name> <anchor-side>, <fallback>)
<anchor-name>
-
Der
anchor-name
-Eigenschaftswert des Ankerelements, zu dem Sie das Element positionieren möchten. Dies ist ein<dashed-ident>
-Wert. Wenn ausgelassen, wird der Standardanker des Elements verwendet. Dies ist der Anker, der in seinerposition-anchor
-Eigenschaft referenziert wird oder über das nicht-standardmäßigeanchor
-HTML-Attribut mit dem Element verknüpft ist.Hinweis: Das Spezifizieren eines
<anchor-name>
positioniert das Element relativ zu diesem Anker, bietet jedoch keine Elementverknüpfung. Obwohl Sie die Seiten eines Elements relativ zu mehreren Ankern positionieren können, indem Sie verschiedene<anchor-name>
-Werte innerhalb verschiedeneranchor()
-Funktionen auf demselben Element spezifizieren, ist das positionierte Element nur mit einem einzelnen Anker verknüpft. <anchor-side>
-
Gibt die Position relativ zu einer Seite oder Seiten des Ankers an. Gültige Werte sind die
Mitte
des Ankers, physische (oben
,links
, usw.) oder logische (start
,self-end
, usw.) Seiten des Ankers oder ein<percentage>
zwischen dem Start (0%
) und Ende (100%
) der Achse der Einfügeeigenschaft, auf deranchor()
gesetzt ist. Wenn ein Wert verwendet wird, der nicht kompatibel mit der Einfügeeigenschaft ist, auf der dieanchor()
-Funktion gesetzt ist, wird der Fallback-Wert verwendet. <fallback>
-
Ein
<length-percentage>
, der die Entfernung definiert, die als Fallback-Wert zu verwenden ist, wenn das Element nicht absolut oder fest positioniert ist, wenn der verwendete<anchor-side>
-Wert nicht kompatibel mit der Einfügeeigenschaft ist, auf der dieanchor()
-Funktion gesetzt ist, oder wenn das Ankerelement nicht existiert.
Der Rückgabewert der anchor()
-Funktion ist ein Längenwert, der basierend auf der Position des Ankers berechnet wird. Wenn Sie eine Länge oder einen Prozentsatz direkt auf eine Einfügeeigenschaft eines ankerpositionierten Elements setzen, wird es positioniert, als wäre es nicht mit dem Ankerelement verbunden. Dies ist das gleiche Verhalten, das zu sehen ist, wenn der <anchor-side>
-Wert nicht kompatibel mit der Einfügeeigenschaft ist, auf der er gesetzt ist, und der Fallback verwendet wird. Diese beiden Deklarationen sind gleichwertig:
bottom: anchor(right, 50px);
bottom: 50px;
Beide platzieren das positionierte Element 50px
über dem unteren Rand des nächsten positionierten Vorfahren des Elements (falls vorhanden) oder des initialen Begrenzungsblocks.
Die häufigsten anchor()
-Parameter, die Sie verwenden werden, beziehen sich auf eine Seite des Standardankers. Sie werden auch oft entweder einen margin
hinzufügen, um einen Abstand zwischen dem Rand des Ankers und dem positionierten Element zu schaffen, oder anchor()
innerhalb einer calc()
-Funktion verwenden, um diesen Abstand zu addieren.
Zum Beispiel positioniert diese Regel den rechten Rand des positionierten Elements bündig mit dem linken Rand des Ankerelements und fügt dann etwas margin-left
hinzu, um Platz zwischen den Rändern zu schaffen:
.positionedElement {
right: anchor(left);
margin-left: 10px;
}
Der Rückgabewert einer anchor()
-Funktion ist eine Länge. Das bedeutet, dass Sie ihn innerhalb einer calc()
-Funktion verwenden können. Diese Regel positioniert den logischen Block-Endrand des positionierten Elements 10px
vom logischen Block-Startrand des Ankerelements, indem der Abstand mit der calc()
-Funktion hinzugefügt wird, sodass wir keine Margin hinzufügen müssen:
.positionedElement {
inset-block-end: calc(anchor(start) + 10px);
}
anchor()
-Beispiel
Schauen wir uns ein Beispiel an, in dem anchor()
in Aktion ist. Wir haben denselben HTML-Code wie in den vorherigen Beispielen verwendet, aber mit etwas Fülltext darunter und darüber, um den Inhalt seines Containers überlaufen und scrollen zu lassen. Wir geben dem Ankerelement auch denselben anchor-name
wie in den vorherigen Beispielen:
.anchor {
anchor-name: --my-anchor;
}
Die Infobox ist mit dem Anker über den Ankernamen verknüpft und hat eine feste Positionierung. Indem wir die inset-block-start
und inset-inline-start
Eigenschaften einschließen (die in horizontalen Links-nach-Rechts-Schreibmodi äquivalent zu top
und left
sind), haben wir sie an den Anker gebunden. Wir fügen der Infobox eine margin
hinzu, um Platz zwischen dem positionierten Element und seinem Anker zu schaffen:
.infobox {
position-anchor: --my-anchor;
position: fixed;
inset-block-start: anchor(end);
inset-inline-start: anchor(self-end);
margin: 5px 0 0 5px;
}
Schauen wir uns die Positionierungsdeklarationen der Einfügeeigenschaft genauer an:
inset-block-start: anchor(end)
: Dies setzt den Block-Start-Rand des positionierten Elements auf den Block-End-Rand des Ankers, berechnet mit deranchor(end)
-Funktion.inset-inline-start: anchor(self-end)
: Dies setzt den Inline-Start-Rand des positionierten Elements auf den Inline-End-Rand des Ankers, berechnet mit deranchor(self-end)
-Funktion.
Das ergibt folgendes Ergebnis:
Das positionierte Element ist 5px
unterhalb und 5px
rechts vom Ankerelement. Wenn Sie das Dokument nach oben und unten scrollen, bleibt das positionierte Element relativ zum Ankerelement positioniert – es ist am Ankerelement fixiert, nicht am Viewport.
Setzen eines position-area
Die position-area
-Eigenschaft bietet eine Alternative zur anchor()
-Funktion, um Elemente relativ zu Ankern zu positionieren. Die position-area
-Eigenschaft basiert auf dem Konzept eines 3x3 Gitters aus Kacheln, wobei das Ankerelement die mittlere Kachel ist. Die position-area
-Eigenschaft kann verwendet werden, um das ankerpositionierte Element in einer der neun Kacheln zu positionieren oder es über zwei oder drei Kacheln zu spannen.
Die Gitterkacheln sind in Reihen und Spalten unterteilt:
- Die drei Reihen werden durch die physischen Werte
oben
,mitte
undunten
repräsentiert. Sie haben auch logische Entsprechungen wiestart
,center
undend
, sowie Koordinatenäquivalente wiey-start
,center
undy-end
. - Die drei Spalten werden durch die physischen Werte
links
,mitte
undrechts
repräsentiert. Sie haben auch logische Entsprechungen wiestart
,center
undend
, sowie Koordinatenäquivalente wiex-start
,center
undx-end
.
Die Dimensionen der mittleren Kachel werden durch den enthältenden Block des Ankerelements definiert, während der Abstand zwischen der mittleren Kachel und dem äußeren Rand des Gitters durch den enthaltenden Block des positionierten Elements definiert wird.
Die Werte der position-area
-Eigenschaft bestehen aus einem oder zwei Werten basierend auf den oben beschriebenen Reihen- und Spaltenwerten, mit Spannungsoptionen, die den Bereich des Gitters definieren, in dem das Element positioniert werden soll.
Beispielsweise:
Sie können zwei Werte angeben, um das positionierte Element in einem bestimmten Gitterquadrat zu platzieren. Zum Beispiel:
oben links
(logische Entsprechungstart start
) platziert das positionierte Element im obersten linken Quadrat.unten mitte
(logische Entsprechungend center
) platziert das positionierte Element im unteren mittleren Quadrat.
Sie können einen Reihen- oder Spaltenwert plus einen span-*
-Wert angeben. Der erste Wert gibt die Reihe oder Spalte an, in die das positionierte Element platziert werden soll, es wird zunächst in der Mitte platziert, und der andere gibt die Menge dieser Spalte an, die überspannt werden soll. Zum Beispiel:
oben span-links
bewirkt, dass das positionierte Element in der oberen Reihe platziert und über die mittlere und linke Kachel dieser Reihe gespannt wird.y-end span-x-end
bewirkt, dass das positionierte Element am Ende der y-Spalte platziert und über die Mitte und x-end Kacheln dieser Spalte gespannt wird.block-end span-all
bewirkt, dass das positionierte Element in der block-end Reihe platziert und über die inline-start, Mitte und inline-end Kacheln dieser Reihe gespannt wird.
Wenn Sie nur einen Wert angeben, ist die Wirkung unterschiedlich je nachdem, welcher Wert gesetzt ist:
- Ein physischer Seitenwert (
oben
,unten
,links
oderrechts
) oder Koordinatenwert (y-start
,y-end
,x-start
,x-end
) wirkt, als ob der andere Wertspan-all
ist. Zum Beispiel gibtoben
denselben Effekt wieoben span-all
. - Ein logischer Seitenwert (
start
oderend
) wirkt, als ob der andere Wert auf denselben Wert gesetzt wäre; zum Beispiel gibtstart
denselben Effekt wiestart start
. - Ein
center
-Wert wirkt, als ob beide Werte aufcenter
gesetzt wären (alsocenter center
).
Hinweis:
Siehe die <position-area>
-Wertreferenzseite für eine detaillierte Beschreibung aller verfügbaren Werte. Das Mischen eines logischen Wertes mit einem physischen Wert macht die Deklaration ungültig.
Demonstrieren wir einige dieser Werte; dieses Beispiel verwendet den gleichen HTML- und Basis-CSS-Stil wie das vorherige Beispiel, außer dass wir ein <select>
-Element eingefügt haben, um das Ändern des position-area
-Werts des positionierten Elements zu ermöglichen.
Die Infobox erhält eine feste Positionierung und ist mit dem Anker über CSS verknüpft. Beim Laden ist sie so eingestellt, dass sie mit position-area: oben;
an den Anker gebunden ist, was bewirkt, dass sie am oberen Rand des position-area Gitters positioniert wird. Dies wird überschrieben, sobald Sie andere Werte aus dem <select>
-Menü auswählen.
.infobox {
position: fixed;
position-anchor: --my-anchor;
position-area: top;
}
Wir fügen auch ein kurzes Skript ein, um neue position-area
-Werte, die aus dem <select>
-Menü ausgewählt werden, auf die Infobox anzuwenden:
const infobox = document.querySelector(".infobox");
const selectElem = document.querySelector("select");
selectElem.addEventListener("change", () => {
const area = selectElem.value;
// Set the position-area to the value chosen in the select box
infobox.style.positionArea = area;
});
Versuchen Sie, neue position-area
-Werte aus dem <select>
-Menü auszuwählen, um den Effekt zu sehen, den sie auf die Position der Infobox haben:
Breite des positionierten Elements
Im obigen Beispiel haben wir das positionierte Element nicht explizit in einer der Dimensionen dimensioniert. Wir haben die Größenangabe absichtlich weggelassen, um Ihnen das Verhalten zu zeigen, das dies verursacht.
Wenn ein positioniertes Element ohne explizite Größenangabe in die position-area
-Gitternetzfelder platziert wird, richtet es sich mit dem angegebenen Gitterbereich aus und verhält sich, als wäre width
auf max-content
gesetzt. Es wird entsprechend seiner enthältender Block-Größe dimensioniert, was die Breite seines Inhalts ist. Diese Größe wurde durch das Setzen von position: fixed
erzwungen. Automatisch dimensionierte absolut und fest positionierte Elemente werden automatisch dimensioniert, sodass sie sich so breit dehnen, wie nötig, um den Textinhalt anzupassen, während sie durch den Rand des Viewports eingeschränkt werden. In diesem Fall, wenn sie auf der linken Seite des Gitters mit einem left
- oder inline-start
-Wert platziert werden, wird der Text umgebrochen. Wenn die max-content
-Größe des Ankerelements schmaler oder kürzer ist als sein Anker, wachsen sie nicht, um die Größe des Ankers anzupassen.
Wenn das positionierte Element vertikal zentriert ist, zum Beispiel mit position-area: unten mitte
, richtet es sich mit dem angegebenen Gitterfeld aus und die Breite entspricht der des Ankerelements. In diesem Fall ist seine minimale Höhe die Größe des enthältenden Blocks des Ankerelements. Es wird nicht überlaufen, da der min-width
min-content
ist, was bedeutet, dass es mindestens so breit wie sein längstes Wort sein wird.
Zentrieren auf dem Anker mit anchor-center
Während Sie das ankerpositionierte Element mit den center
-Werten der position-area
zentrieren können, bieten Einfügeeigenschaften in Kombination mit der anchor()
-Funktion mehr Kontrolle über die genaue Position. Die CSS-Ankerpositionierung bietet eine Möglichkeit, ein ankerpositioniertes Element relativ zu seinem Anker zu zentrieren, wenn Einfügeeigenschaften verwendet werden, um es zu verbinden, anstatt position-area
.
Die Eigenschaften justify-self
, align-self
, justify-items
und align-items
(und ihre Abkürzungen place-items
und place-self
) bestehen, um Entwicklern zu ermöglichen, Elemente einfach in Inline- oder Blockrichtung innerhalb verschiedener Layoutsysteme auszurichten, zum Beispiel entlang der Haupt- oder Kreuzachse im Fall von Flexkindern. Die CSS-Ankerpositionierung bietet einen zusätzlichen Wert für diese Eigenschaften, anchor-center
, der ein positioniertes Element mit dem Zentrum seines Standardankers ausrichtet.
Dieses Beispiel verwendet dieselben HTML- und Basis-CSS wie das vorherige Beispiel. Die Infobox erhält eine feste Positionierung und ist an der unteren Kante des Ankers verankert. justify-self: anchor-center
wird dann verwendet, um sicherzustellen, dass es horizontal auf dem Zentrum des Ankers zentriert ist:
.infobox {
position: fixed;
position-anchor: --my-anchor;
top: calc(anchor(bottom) + 5px);
justify-self: anchor-center;
}
Dies zentriert das ankerpositionierte Element am unteren Rand seines Ankers:
Dimensionierung von Elementen basierend auf der Ankergröße
Neben der Positionierung eines Elements relativ zur Position seines Ankers können Sie auch ein Element im Verhältnis zur Größe seines Ankers dimensionieren, indem Sie die anchor-size()
-Funktion innerhalb eines Größeneigenschaftswerts verwenden.
Größeneigenschaften, die einen anchor-size()
-Wert akzeptieren können, umfassen:
width
height
min-width
min-height
max-width
max-height
block-size
inline-size
min-block-size
min-inline-size
max-block-size
max-inline-size
anchor-size()
-Funktionen werden zu Länge
-Werten aufgelöst. Ihre Syntax sieht folgendermaßen aus:
anchor-size(<anchor-name> <anchor-size>, <length-percentage>)
<anchor-name>
-
Der
<dashed-ident>
-Name, der als Wert deranchor-name
-Eigenschaft des Ankerelements gesetzt ist, zu dem Sie die Größe des Elements relativ setzen möchten. Wenn weggelassen, wird der Standardanker des Elements verwendet, der der Anker ist, der in derposition-anchor
-Eigenschaft referenziert wird. <anchor-size>
-
Gibt die Dimension des Ankerelements an, zu der das positionierte Element relativ dimensioniert wird. Dies kann mit physischen (
width
oderheight
) oder logischen (inline
,block
,self-inline
oderself-block
) Werten ausgedrückt werden. Länge-Prozentsatz
-
Gibt die Größe an, die als Fallback-Wert verwendet werden soll, wenn das Element nicht absolut oder fest positioniert ist oder das Ankerelement nicht existiert.
Die häufigsten anchor-size()
-Funktionen, die Sie verwenden werden, beziehen sich nur auf eine Dimension des Standardankers. Sie können sie auch innerhalb von calc()
-Funktionen verwenden, um die auf das positionierte Element angewendete Größe zu modifizieren.
Zum Beispiel dimensioniert diese Regel die Breite des positionierten Elements gleich der Breite des Standardankers:
.elem {
width: anchor-size(width);
}
Diese Regel dimensioniert die Inline-Größe des positionierten Elements auf das Vierfache der Inline-Größe des Ankerelements, wobei die Multiplikation innerhalb einer calc()
-Funktion erfolgt:
.elem {
inline-size: calc(anchor-size(self-inline) * 4);
}
Schauen wir uns ein Beispiel an. Das HTML und das Basis-CSS sind dieselben wie in den vorherigen Beispielen, außer dass das Ankerelement ein tabindex="0"
-Attribut erhält, um es fokussierbar zu machen. Die Infobox erhält feste Positionierung und ist mit dem Anker auf die gleiche Weise wie zuvor verknüpft. Diesmal binden wir es jedoch auf der rechten Seite des Ankers mit einem position-area
und geben ihm eine Breite, die fünfmal so groß ist wie die Breite des Ankers:
.infobox {
position: fixed;
position-anchor: --my-anchor;
position-area: right;
margin-left: 5px;
width: calc(anchor-size(width) * 5);
}
Darüber hinaus erhöhen wir die width
des Ankerelements bei :hover
und :focus
, und geben ihm eine transition
, sodass es animiert, wenn sich der Zustand ändert.
.anchor {
text-align: center;
width: 30px;
transition: 1s width;
}
.anchor:hover,
.anchor:focus {
width: 50px;
}
Fahren Sie mit der Maus über das Ankerelement oder verwenden Sie die Tabulatortaste darauf — das positionierte Element wächst, wenn der Anker wächst, was demonstriert, dass die Größe des ankerpositionierten Elements relativ zu seinem Anker ist:
Weitere Verwendungen von anchor-size()
Sie können anchor-size()
auch in physischen und logischen Einfügungen und Margeneigenschaften verwenden. Die folgenden Abschnitte untersuchen diese Verwendungen detaillierter, bevor sie ein Anwendungsbeispiel liefern.
Festlegen der Elementposition basierend auf der Ankergröße
Sie können die anchor-size()
-Funktion innerhalb eines Einfügeeigenschafts-Werts verwenden, um Elemente basierend auf der Größe ihres Ankerelements zu positionieren, zum Beispiel:
left: anchor-size(width);
inset-inline-end: anchor-size(--my-anchor height, 100px);
Dies positioniert ein Element nicht relativ zur Position seines Ankers wie die anchor()
-Funktion oder die position-area
-Eigenschaft (siehe Positionierung von Elementen relativ zu ihrem Anker, oben); das Element wird seine Position nicht ändern, wenn sein Anker dies tut. Stattdessen wird das Element gemäß den normalen Regeln der absolute
- oder fixed
-Positionierung positioniert.
Dies kann in einigen Situationen nützlich sein. Zum Beispiel, wenn sich Ihr Ankerelement nur vertikal bewegen kann und immer neben dem Rand seines nächstgelegenen positionierten Vorfahren horizontal bleibt, könnten Sie left: anchor-size(width)
verwenden, um das ankerpositionierte Element immer rechts von seinem Anker zu positionieren, auch wenn sich die Breite des Ankers ändert.
Festlegen des Elementabstandes basierend auf der Ankergröße
Sie können die anchor-size()
-Funktion innerhalb eines margin-*
-Eigenschaftswerts verwenden, um Elementabstände basierend auf der Größe ihres Ankerelements festzulegen, zum Beispiel:
margin-left: calc(anchor-size(width) / 4);
margin-block-start: anchor-size(--my-anchor self-block, 20px);
Dies kann nützlich sein in Fällen, in denen Sie den Abstand eines ankerpositionierten Elements immer gleich dem gleichen Prozentsatz der Breite des Ankerelements festlegen möchten, auch wenn sich dessen Breite ändert.
anchor-size()
-Position und Margenbeispiel
Schauen wir uns ein Beispiel an, in dem wir den Abstand und die Position eines ankerpositionierten Elements relativ zur Breite des Ankerelements festlegen.
Im HTML spezifizieren wir zwei <div>
-Elemente, ein anker
-Element und ein infobox
-Element, das wir relativ zum Anker positionieren werden. Wir geben dem Ankerelement ein tabindex
-Attribut, sodass es über die Tastatur fokussiert werden kann. Wir fügen auch Fülltext hinzu, um den <body>
so groß zu machen, dass ein Scroll erforderlich ist, aber dies wurde der Kürze halber ausgeblendet.
<div class="anchor" tabindex="0">⚓︎</div>
<div class="infobox">
<p>Infobox.</p>
</div>
Im CSS deklarieren wir zuerst das anker
-<div>
als Ankerelement, indem wir ihm einen anchor-name
geben. Das positionierte Element hat seine position
-Eigenschaft auf absolute
gesetzt und ist mit dem Ankerelement über seine position-anchor
-Eigenschaft verknüpft. Wir setzen auch absolute height
- und width
-Dimensionen auf dem Anker und der Infobox und fügen eine transition
auf den Anker ein, sodass Breitenänderungen sanft animiert werden, wenn sich sein Zustand ändert:
.anchor {
anchor-name: --my-anchor;
width: 100px;
height: 100px;
transition: 1s all;
}
.infobox {
position-anchor: --my-anchor;
position: absolute;
height: 100px;
width: 100px;
}
Nun zum interessantesten Teil. Hier setzen wir die Breite des Ankers auf 300px
, wenn es schwebend oder fokussiert ist. Dann legen wir die infobox
's:
top
Wert aufanchor(top)
. Dies bewirkt, dass die Oberseite der Infobox immer mit der Oberseite des Ankers in einer Linie bleibt.left
Wert aufanchor-size(width)
. Dies bewirkt, dass die linke Seite der Infobox die angegebene Entfernung von der linken Kante ihres nächstgelegenen positionierten Vorfahren entfernt ist. In diesem Fall entspricht die angegebene Entfernung der Breite des Ankerelements und der nächstgelegene positionierte Vorfahre ist das<body>
-Element, sodass die Infobox rechts vom Anker erscheint.margin-left
Wert aufcalc(anchor-size(width)/4)
. Dies bewirkt, dass die Infobox immer einen linken Abstand hat, der sie und den Anker trennt, gleich einem Viertel der Ankerbreite.
.anchor:hover,
.anchor:focus {
width: 300px;
}
.infobox {
top: anchor(top);
left: anchor-size(width);
margin-left: calc(anchor-size(width) / 4);
}
Das gerenderte Ergebnis sieht folgendermaßen aus:
Versuchen Sie, den Anker mit der Tabulatortaste zu fokussieren oder mit der Maus darüber zu schweben und beachten Sie, wie sich die Position und der linke Abstand der Infobox im Verhältnis zur Breite des Ankerelements vergrößern.