CSS Anchor Positioning: Mehrere Fallback-Positionen verketten
AI generated
{ }
@
CSS · Anchor Positioning · Layout · Popover
Mehrere Fallback-Positionen verketten
Damit Tooltips und Popover am Bildschirmrand automatisch die Seite wechseln

Eine einzelne Fallback-Position reicht bei CSS Anchor Positioning selten aus, sobald ein Anker nah am Bildschirmrand steht. Mit position-try-fallbacks lässt sich eine ganze Kette von Ausweichpositionen definieren, die der Browser der Reihe nach durchprobiert, bis eine passt, komplett ohne JavaScript und ohne Resize- oder Scroll-Listener.

16 Min. Lesezeit position-try-fallbacks · position-try-order Chromium · Progressive Enhancement

1. Anchor Positioning in Kürze: anchor-name, anchor() und position-anchor

CSS Anchor Positioning koppelt ein positioniertes Element an ein beliebiges anderes Element im Dokument, den sogenannten Anker. Der Anker bekommt einen anchor-name wie --trigger, das positionierte Element referenziert ihn über position-anchor und kann dann mit inset-area beziehungsweise der neueren Eigenschaft position-area relativ zum Anker platziert werden, etwa oberhalb, unterhalb oder seitlich davon.

Der entscheidende Unterschied zu klassischer absoluter Positionierung ist, dass der Browser die Beziehung zwischen Anker und positioniertem Element bei jedem Layout-Durchlauf neu auswertet. Bibliotheken wie Floating UI mussten dafür bislang getBoundingClientRect() aufrufen und auf Scroll- sowie Resize-Events lauschen. Mit nativem Anchor Positioning übernimmt die Rendering-Engine diese Berechnung direkt im Layout-Schritt, was Jank durch verspätete JavaScript-Neuberechnungen vermeidet.

2. Warum eine einzelne Fallback-Position selten reicht

Ein Tooltip, das standardmäßig unterhalb seines Ankers erscheint, funktioniert gut, solange der Anker in der oberen Bildschirmhälfte liegt. Steht derselbe Button aber am unteren Rand des Viewports, ragt das Tooltip über den sichtbaren Bereich hinaus oder wird vom Browser abgeschnitten. Eine einzige feste Position deckt also nur einen Teil der möglichen Anker-Positionen im Viewport ab.

Klassisch wurde dieses Problem mit JavaScript gelöst, das die verfügbare Fläche in alle vier Richtungen misst und die Position dynamisch umschaltet. Das funktioniert, bringt aber zusätzlichen Code, zusätzliche Event-Listener und eine Fehlerquelle mehr in jedes Projekt. CSS Anchor Positioning löst genau dieses Problem deklarativ: Statt eine Position hart zu programmieren, beschreibt man eine geordnete Liste von Alternativen, und der Browser wählt selbst die erste passende aus.

3. position-try-fallbacks als geordnete Liste verstehen

Die Eigenschaft position-try-fallbacks akzeptiert eine kommagetrennte Liste von Alternativen. Jeder Eintrag kann eine eingebaute Kurzform wie flip-block, flip-inline oder flip-start sein, ein fertiger position-area-Wert wie bottom span-right, oder der Name einer selbst definierten @position-try-Regel. Der Browser probiert die Liste von links nach rechts durch und verwendet die erste Alternative, bei der das Element vollständig innerhalb des relevanten Containing Blocks Platz findet.

Das Kurzform-Property position-try kombiniert position-try-order und position-try-fallbacks in einer Zeile, ähnlich wie font mehrere Schrift-Eigenschaften bündelt. Für die meisten Projekte reicht die Langform mit position-try-fallbacks aus, weil sie in Kombination mit der Basisposition, die auf dem Element selbst über position-area gesetzt wird, klar erkennbar bleibt, welche Position die bevorzugte ist und welche nur Ausweichlösungen sind.

4. Wie die Rendering-Engine die Reihenfolge auswertet

Die Auswertung folgt strikt der aufgeschriebenen Reihenfolge: Die Basis-Position aus position-area gilt als erster Versuch, danach folgen die Einträge aus position-try-fallbacks in genau der Reihenfolge, in der sie notiert sind. Sobald eine Position ohne Überlauf über den Containing Block passt, stoppt die Suche dort. Das bedeutet in der Praxis: Die gewünschte Standardposition gehört an den Anfang, robuste, aber optisch weniger elegante Ausweichpositionen ans Ende der Kette.

Passt am Ende keine einzige Alternative perfekt, entscheidet die Eigenschaft position-try-order mit Werten wie most-width oder most-height, welche der geprüften Positionen den meisten verfügbaren Platz bietet, und wählt diese als letzten, pragmatischen Kompromiss. Diese zweistufige Logik, zuerst eine perfekt passende Position suchen und erst danach nach der geräumigsten Alternative greifen, verhindert, dass ein Tooltip in einem sehr engen Viewport komplett unsichtbar bleibt.

5. Ein Tooltip mit vier verketteten Fallback-Positionen

In der Praxis reichen meist drei bis vier Alternativen aus, um alle vier Bildschirmränder sauber abzudecken. Das folgende Beispiel zeigt ein Tooltip, das standardmäßig oberhalb seines Ankers erscheint, bei zu wenig Platz nach unten wechselt, danach nach rechts und als letzten Ausweg nach links ausweicht, jeweils mit einem kleinen Sicherheitsabstand über anchor-size().

Wichtig ist, dass jede Alternative in der Kette denselben position-anchor nutzt, aber eine andere position-area oder eine benannte @position-try-Regel mit eigenem Innenabstand referenziert. So bleibt die Beziehung zum Anker über alle vier möglichen Positionen hinweg konsistent, während nur die räumliche Ausrichtung variiert.


.trigger {
  anchor-name: --info-trigger;
}

@position-try --tooltip-right {
  position-area: right;
  margin-inline-start: 0.5rem;
}

@position-try --tooltip-left {
  position-area: left;
  margin-inline-end: 0.5rem;
}

.tooltip {
  position: absolute;
  position-anchor: --info-trigger;
  position-area: top;              /* 1. Versuch: oberhalb des Ankers */
  margin-block-end: 0.5rem;

  position-try-fallbacks:
    flip-block,                    /* 2. Versuch: gespiegelt nach unten */
    --tooltip-right,                /* 3. Versuch: rechts vom Anker */
    --tooltip-left;                 /* 4. Versuch: links vom Anker */
  position-try-order: most-height;  /* letzter Kompromiss, falls nichts passt */
}

6. Dynamisches Verhalten beim Scrollen ohne einen einzigen Event-Listener

Der große praktische Vorteil der verketteten Fallback-Liste zeigt sich beim Scrollen: Bewegt sich der Anker näher an den Bildschirmrand, wechselt der Browser bei Bedarf automatisch zur nächsten passenden Position in der Kette, ganz ohne dass ein Scroll- oder Resize-Listener jemals ausgelöst wird. Die Neubewertung passiert im selben Layout-Schritt, der ohnehin bei jedem Scroll-Frame läuft, und ist dadurch spürbar flüssiger als eine JavaScript-Lösung, die erst asynchron auf ein Event reagiert.

Zusätzlich lässt sich mit position-visibility: no-overflow festlegen, dass das positionierte Element komplett ausgeblendet wird, sobald selbst die geräumigste Fallback-Position nicht mehr ausreicht, statt es abgeschnitten anzuzeigen. Für Tooltips ist das oft die bessere Lösung als ein sichtbares, aber halb verdecktes Element, weil ein fehlendes Tooltip weniger verwirrt als ein kaputt aussehendes.

7. Fallback-Verkettung zusammen mit dem Popover-API

Anchor Positioning entfaltet seine volle Stärke in Kombination mit dem nativen Popover-API. Ein Element mit dem Attribut popover wird beim Öffnen in die Top-Layer-Ebene des Browsers gehoben, was Stacking-Probleme mit z-index und overflow: hidden übergeordneter Container von vornherein umgeht. Die Fallback-Kette aus position-try-fallbacks funktioniert in diesem Kontext identisch, weil sie unabhängig davon arbeitet, in welcher Ebene das Element letztlich gerendert wird.

Für ein Options-Menü, das über popovertarget an einen Button gebunden ist, bedeutet das: Die gleiche Fallback-Kette wie beim einfachen Tooltip lässt sich eins zu eins übernehmen, nur dass zusätzlich popover und popovertarget für das Öffnen, Schließen und die automatische Fokus-Verwaltung sorgen. Die räumliche Positionierung und das Sichtbarkeits-Management bleiben zwei sauber getrennte Zuständigkeiten.

8. Browser-Unterstützung und eine Fallback-Strategie ohne Anchor Positioning

CSS Anchor Positioning ist eine noch junge Spezifikation und aktuell primär in Chromium-basierten Browsern vollständig implementiert, während Firefox und Safari zum Zeitpunkt dieses Artikels noch an einer Umsetzung arbeiten. Wer die Technik heute produktiv einsetzt, sollte deshalb konsequent progressive enhancement betreiben, statt sich auf flächendeckende Unterstützung zu verlassen.

Die Feature-Query @supports(anchor-name: --x) prüft, ob der Browser Anchor Positioning kennt, und liefert innerhalb des Blocks die native Lösung. Außerhalb davon greift eine einfache, statische Fallback-Position per klassischem position: absolute mit festen inset-Werten, die zwar nicht perfekt auf jede Bildschirmgröße reagiert, aber immerhin ein funktionsfähiges, wenn auch weniger elegantes Tooltip zeigt.


/* Statische Basis fuer alle Browser */
.tooltip {
  position: absolute;
  top: 100%;
  left: 0;
  margin-block-start: 0.5rem;
}

/* Verbesserte Version nur dort, wo Anchor Positioning verstanden wird */
@supports (anchor-name: --x) {
  .trigger {
    anchor-name: --info-trigger;
  }

  .tooltip {
    position-anchor: --info-trigger;
    position-area: top;
    position-try-fallbacks: flip-block, flip-inline;
  }
}

9. Praxis-Tipps für robuste, wartbare Fallback-Ketten

Drei bis vier Fallback-Positionen decken in der Praxis fast jeden Anwendungsfall ab; jede weitere Alternative macht die Kette schwerer nachvollziehbar, ohne spürbaren Zusatznutzen zu bringen. Die Reihenfolge sollte der natürlichen Lesefolge und den Nutzererwartungen entsprechen, meist oben vor unten und rechts vor links in Sprachen mit Links-nach-rechts-Leserichtung, damit die bevorzugte Position auch optisch am plausibelsten wirkt.

Die Fallback-Kette verändert ausschließlich die visuelle Position, nicht die Reihenfolge im DOM, wodurch Screenreader und Tastaturnavigation unberührt bleiben. Wichtig bleibt trotzdem, jede neue Kombination direkt an allen vier Bildschirmrändern und in engen mobilen Viewports zu testen, weil sich Fehler in der Reihenfolge oft erst dort zeigen, wo mehrere Fallbacks gleichzeitig knapp scheitern.

Fallback-Typ Wirkung Typischer Einsatz
flip-block Spiegelt die Position auf der Block-Achse (oben/unten) Tooltip springt bei Randnähe von unten nach oben
flip-inline Spiegelt die Position auf der Inline-Achse (links/rechts) Dropdown springt bei Randnähe von rechts nach links
flip-start Spiegelt beide Achsen gleichzeitig Eckfälle, in denen weder oben/unten noch links/rechts passen
Benannte @position-try-Regel Eigene Kombination aus position-area, Margin und Inset Wiederverwendbare, projektspezifische Fallback-Position
position-try-order: most-height Wählt bei mehreren passenden Optionen die mit dem meisten Platz Letzter Kompromiss, falls keine Fallback-Position perfekt passt

Mironsoft

Modernes CSS, Layout-Architektur und Rendering-Performance

CSS, das wartbar bleibt statt mit jeder Änderung zu brechen?

Wir prüfen bestehende Stylesheets auf Spezifitäts-Chaos und Layout-Thrashing und bauen daraus eine CSS-Architektur mit Cascade Layers, Custom Properties und modernen Layout-Primitiven, die auch nach dem zehnten Feature noch verständlich ist.

CSS-Audit

Spezifität, Cascade-Konflikte und ungenutzte Selektoren systematisch aufdecken.

Architektur-Refactoring

Cascade Layers, Custom Properties und Design Tokens sauber einführen.

Performance-Tuning

Layout-Thrashing, teure Selektoren und Rendering-Engpässe gezielt beheben.

10. Zusammenfassung

Verkettete Fallback-Positionen: Das Wichtigste auf einen Blick

Grundprinzip

position-try-fallbacks probiert eine geordnete, kommagetrennte Liste von Alternativpositionen durch, bis eine ohne Überlauf passt.

Reihenfolge zählt

Der Browser wertet von links nach rechts aus, die bevorzugte Position gehört an den Anfang der Kette, robuste Notlösungen ans Ende.

Kein JavaScript nötig

Neubewertung passiert im nativen Layout-Schritt, ohne Scroll- oder Resize-Listener und ohne asynchronen Nachlauf.

Progressive Enhancement

@supports(anchor-name: --x) liefert Anchor Positioning nur dort, wo der Browser es bereits versteht, mit statischem Fallback davor.

11. FAQ: Verkettete Fallback-Positionen: Das Wichtigste auf einen Blick

1Was ist der Unterschied zwischen position-try-fallbacks und position-try-order?
position-try-fallbacks definiert die geordnete Liste der Ausweichpositionen selbst. position-try-order bestimmt nur, welche dieser Optionen als letzter Kompromiss gewählt wird, wenn keine davon perfekt ohne Überlauf passt.
2Wie viele Fallback-Positionen sollte eine Kette haben?
Drei bis vier reichen in der Praxis fast immer aus, um alle vier Bildschirmränder abzudecken. Mehr Einträge machen die Kette unübersichtlich, ohne spürbaren Zusatznutzen zu bringen.
3Muss ich für jede Fallback-Position eine eigene @position-try-Regel schreiben?
Nein. Für einfache Fälle reichen die eingebauten Kurzformen flip-block, flip-inline und flip-start. Eigene @position-try-Regeln lohnen sich erst, wenn eine Fallback-Position zusätzliche Werte wie eigene Margins braucht.
4Was passiert, wenn keine der Fallback-Positionen passt?
Dann greift position-try-order und wählt unter den geprüften Optionen die mit dem meisten verfügbaren Platz. Mit position-visibility: no-overflow lässt sich das Element stattdessen ganz ausblenden, statt es abgeschnitten zu zeigen.
5Reagiert die Fallback-Kette auf Scrollen ohne eigenen Code?
Ja. Die Neubewertung läuft im nativen Layout-Schritt der Rendering-Engine und wird bei jedem Scroll- oder Resize-Frame automatisch aktualisiert, ganz ohne eigene Event-Listener.
6Kann ich Anchor Positioning mit dem Popover-API kombinieren?
Ja, und das ist ein sehr verbreiteter Anwendungsfall. Ein Element mit dem Attribut popover nutzt dieselbe Fallback-Kette wie ein einfaches Tooltip, zusätzlich übernimmt das Popover-API Top-Layer-Rendering und Fokus-Verwaltung.
7Welche Browser unterstützen position-try-fallbacks bereits?
Aktuell vor allem Chromium-basierte Browser vollständig. Firefox und Safari arbeiten an eigenen Implementierungen, weshalb produktiver Einsatz derzeit eine @supports-Abfrage mit statischem Fallback benötigt.
8Verändert die Fallback-Kette die Reihenfolge im DOM?
Nein. Nur die visuelle Position ändert sich, die DOM-Reihenfolge und damit die Reihenfolge für Screenreader und Tastaturnavigation bleibt unverändert.
9Wie teste ich eine Fallback-Kette zuverlässig?
Am besten den Anker manuell an alle vier Bildschirmränder verschieben und zusätzlich einen schmalen mobilen Viewport testen. Fehler in der Reihenfolge zeigen sich meist erst dort, wo mehrere Fallbacks gleichzeitig knapp scheitern.
10Lohnt sich Anchor Positioning gegenüber Floating UI oder Popper.js?
Für neue Projekte, die primär Chromium-Nutzer erreichen oder progressive enhancement akzeptieren, spart die native Lösung ein komplettes JavaScript-Bundle und vermeidet Jank durch asynchrone Neuberechnung.