API di posizionamento dell'ancoraggio CSS

L'API CSS Anchor Positioning ti consente di posizionare gli elementi rispetto ad altri elementi, noti come ancoraggi. Questa API semplifica i complessi requisiti di layout per molte funzionalità dell'interfaccia come menu e sottomenu, descrizioni comando, selezioni, etichette, schede, finestre di dialogo delle impostazioni e molto altro ancora. Con il posizionamento degli elementi di ancoraggio integrato nel browser, puoi creare interfacce utente a più livelli senza fare affidamento su librerie di terze parti, aprendo un mondo di possibilità creative.

Supporto dei browser

  • Chrome: 125.
  • Bordo: 125.
  • Firefox: non supportato.
  • Safari: non supportato.

Origine

Concetti fondamentali: ancore ed elementi posizionati

Al centro di questa API c'è la relazione tra ancore ed elementi posizionati. Un ancoraggio è un elemento designato come punto di riferimento utilizzando la proprietà anchor-name. Un elemento posizionato è un elemento posizionato rispetto a un ancoraggio utilizzando la proprietà position-anchor o utilizzando esplicitamente anchor-name nella sua logica di posizionamento.

Elementi di ancoraggio ed elementi posizionati.

Imposta gli ancoraggi

Creare un'ancora è semplice. Applica la proprietà anchor-name all'elemento selezionato e assegnagli un identificatore univoco. A questo identificatore univoco deve essere anteposto un doppio trattino, in modo simile a una variabile CSS.

.anchor-button {
    anchor-name: --anchor-el;
}

Dopo aver assegnato un nome di ancoraggio, .anchor-button funge da ancoraggio, pronto a guidare il posizionamento di altri elementi. Puoi collegare questo ancoraggio ad altri elementi in due modi:

Ancoraggi impliciti

Il primo modo per collegare un ancoraggio a un altro elemento è con un ancoraggio implicito, come nel seguente esempio di codice. La proprietà position-anchor viene aggiunta all'elemento che vuoi collegare all'ancoraggio e ha il nome dell'ancoraggio (in questo caso --anchor-el) come valore.

.positioned-notice {
    position-anchor: --anchor-el;
}

Con una relazione di ancoraggio implicita, puoi posizionare gli elementi utilizzando la funzione anchor() senza specificare esplicitamente il nome dell'ancora nel primo argomento.

.positioned-notice {
    position-anchor: --anchor-el;
    top: anchor(bottom);
}

Ancoraggi espliciti

In alternativa, puoi utilizzare il nome dell'anchor direttamente nella funzione di ancoraggio (ad esempio, top: anchor(--anchor-el bottom). Si tratta di un ancoraggio esplicito e può essere utile se vuoi ancorare a più elementi (continua a leggere per un esempio).

.positioned-notice {
    top: anchor(--anchor-el bottom);
}

Posiziona gli elementi rispetto agli ancoraggi

Diagramma del posizionamento di ancoraggio con le proprietà fisiche.

Il posizionamento dell'ancora si basa sul posizionamento assoluto CSS. Per utilizzare i valori di posizionamento, devi aggiungere position: absolute all'elemento posizionato. A questo punto, utilizza la funzione anchor() per applicare i valori di posizionamento. Ad esempio, per posizionare un elemento ancorato in alto a sinistra dell'elemento di ancoraggio, utilizza il seguente posizionamento:

.positioned-notice {
    position-anchor: --anchor-el;
    /* absolutely position the positioned element */
    position: absolute;
    /* position the right of the positioned element at the right edge of the anchor */
    right: anchor(right);
    /* position the bottom of the positioned element at the top edge of the anchor */
    bottom: anchor(top);
}
Diagramma dei bordi di posizionamento sull'elemento posizionato.

Ora hai un elemento ancorato a un altro, in questo modo:

Demo di un'ancora di base.

Screenshot della demo.

Per utilizzare il posizionamento logico per questi valori, gli equivalenti sono i seguenti:

  • top = inset-block-start
  • left= inset-inline-start
  • bottom = inset-block-end
  • right= inset-inline-end

Centra un elemento posizionato con anchor-center

Per semplificare la centratura dell'elemento con posizionamento di ancoraggio rispetto al suo ancoraggio, è disponibile un nuovo valore chiamato anchor-center che può essere utilizzato con le proprietà justify-self, align-self, justify-items e align-items.

Questo esempio modifica quello precedente utilizzando justify-self: anchor-center per centrare l'elemento posizionato sopra l'ancora.

.positioned-notice {
  position: absolute;
  /*  Anchor reference  */
  position-anchor: --anchor-el;
  /*  Position bottom of positioned elem at top of anchor  */
  bottom: anchor(top);
  /*  Center justification to the anchor */
  justify-self: anchor-center;
}
Demo di un ancoraggio centrato con justify-center.

Screenshot della demo.

Più ancoraggi

Gli elementi possono essere associati a più di un ancoraggio. Ciò significa che potresti dover impostare valori di posizione relativi a più di un'ancora. Per farlo, utilizza la funzione anchor() e indica esplicitamente a quale ancoraggio fai riferimento nel primo argomento. Nell'esempio seguente, l'angolo in alto a sinistra di un elemento posizionato è ancorato all'angolo in basso a destra di un'ancora e l'angolo in basso a destra dell'elemento posizionato è ancorato all'angolo in alto a sinistra della seconda ancora:

.anchored {
  position: absolute;
  top: anchor(--one bottom);
  left: anchor(--one right);
  right: anchor(--two left);
  bottom: anchor(--two top);
}
Demo che mostra più ancoraggi.

Screenshot della demo.

Posizione con position-area

L'API di ancoraggio include un nuovo meccanismo di layout che utilizza la proprietà position-area.

Questa proprietà ti consente di posizionare gli elementi di ancoraggio rispetto ai rispettivi ancoraggi e funziona su una griglia a 9 celle con l'elemento di ancoraggio al centro.

Per utilizzare position-area anziché il posizionamento assoluto, usa la proprietà position-area, con valori fisici o logici. Ad esempio:

  • In alto al centro: position-area: top o position-area: block-start
  • Centro-sinistra: position-area: left o position-area: inline-start
  • In basso al centro: position-area: bottom o position-area: block-end
  • Centro a destra: position-area: right o position-area: inline-end
Demo che mostra più ancoraggi.

Screenshot della demo.

Per saperne di più su queste posizioni, dai un'occhiata al seguente strumento:

Strumento di ancoraggio per le posizioni dell'area di posizionamento.

Modificare le dimensioni degli elementi con anchor-size()

La funzione anchor-size(), che fa parte anche dell'API di posizionamento dell'ancora, può essere utilizzata per impostare le dimensioni o la posizione di un elemento posizionato in base all'ancora (larghezza, altezza o dimensioni in linea e in blocco).

Il seguente CSS mostra un esempio di utilizzo per l'altezza,utilizzando anchor-size(height) all'interno di una funzione calc() per impostare l'altezza massima della descrizione comando in modo che sia il doppio dell'altezza dell'ancoraggio.

.positioned-notice {
  position-anchor: --question-mark;

  /*  set max height of the tooltip to 2x height of the anchor  */
  max-height: calc(anchor-size(height) * 2);
}
Demo per anchor-size

Screenshot della demo.

Utilizza l'ancoraggio con elementi di livello superiore come popover e finestre di dialogo

Il posizionamento dell'ancora funziona incredibilmente bene con gli elementi di primo livello come popover. e <dialog>. Sebbene questi elementi siano posizionati in un livello separato dal resto del sottoalbero DOM, il posizionamento dell'ancora ti consente di collegarli nuovamente e di scorrere insieme agli elementi non presenti nel livello superiore. Si tratta di un grande vantaggio per le interfacce a più livelli.

Nell'esempio seguente, un insieme di popover di descrizione comando viene attivato utilizzando un pulsante. Il pulsante è l'ancora e la descrizione comando è l'elemento posizionato. Puoi modificare lo stile dell'elemento posizionato come qualsiasi altro elemento ancorato. Per questo esempio specifico, anchor-name e position-anchor sono stili in linea per il pulsante e la descrizione comando. Poiché ogni ancora deve avere un nome univoco, quando generi contenuti dinamici, l'inserimento in linea è il modo più semplice per farlo.

Demo dell'utilizzo di un'ancora con popover

Screenshot della demo.

Modificare le posizioni degli elementi di ancoraggio con @position-try

Una volta stabilita la posizione iniziale dell'ancoraggio, ti consigliamo di regolarla se l'ancoraggio raggiunge i bordi del blocco contenitore. Per creare posizioni di ancoraggio alternative, puoi utilizzare l'istruzione @position-try insieme alla proprietà position-try-fallbacks.

Nell'esempio seguente, un sottomenu viene visualizzato a destra di un menu. Menu e sottomenu sono un ottimo utilizzo dell'API di posizionamento dell'ancoraggio insieme all'attributo popover, in quanto questi menu tendono ad essere ancorati a un pulsante di attivazione.

Se lo spazio in orizzontale di questo sottomenu non è sufficiente, puoi spostarlo sotto il menu. Per farlo, devi prima impostare la posizione iniziale:

#submenu {
  position: absolute;
  position-anchor: --submenu;

  /* initial position */
  margin-left: var(--padding);
  position-area: right span-bottom;
}

A questo punto, configura le posizioni ancorate di riserva utilizzando @position-try:

/* alternate position */
@position-try --bottom {
  margin: var(--padding) 0 0 var(--padding);
  posotion-area: bottom;
}

Infine, collega i due elementi con position-try-fallbacks. L'insieme mostra il seguente aspetto:

#submenu {
  position: absolute;
  position-anchor: --submenu;
  /* initial position */
  margin-left: var(--padding);
  position-area: right span-bottom;
  */ connect with position-try-fallbacks */
  position-try-fallbacks: --bottom;
}

/* alternate position */
@position-try --bottom {
  margin: var(--padding) 0 0 var(--padding);
  position-area: bottom;
}
Demo sull'uso dell'anchor con popover

Parole chiave per l'inversione automatica della posizione di ancoraggio

Se hai bisogno di un aggiustamento di base, ad esempio la rotazione dall'alto verso il basso o da sinistra verso destra (o entrambe), puoi anche saltare il passaggio di creazione delle dichiarazioni @position-try personalizzate e utilizzare le parole chiave di rotazione integrate supportate dal browser, come flip-block e flip-inline. Questi valori sostituiscono le dichiarazioni @position-try personalizzate e possono essere utilizzati in combinazione tra loro:

position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;

Le parole chiave invertite possono semplificare notevolmente il codice di ancoraggio. Con poche righe, puoi creare un'ancora completamente funzionale con posizioni alternative:

#my-tooltip {
  position-anchor: --question-mark;
  position-area: top;
  position-try-fallbacks: flip-block;
}
Utilizzare la rotazione automatica con position-try-fallbacks: flip-block

position-visibility per le ancore nei sottomenu

In alcuni casi potresti voler ancorare un elemento all'interno di uno scorrimento secondario della pagina. In questi casi, puoi controllare la visibilità dell'ancoraggio utilizzando position-visibility. Quando rimane visibile l'ancoraggio? Quando scompare? Con questa funzionalità puoi controllare queste opzioni. Utilizza position-visibility: anchors-visible quando vuoi che l'elemento posizionato rimanga visibile finché l'ancora non è fuori visuale:

#tooltip {
  position: fixed;
  position-anchor: --anchor-top-anchor;
  position-visibility: anchors-visible;
  bottom: anchor(top);
}
Demo di position-visibility: anchors-visible

In alternativa, puoi utilizzare position-visibility: no-overflow per impedire all'ancora di fuoriuscire dal contenitore.

#tooltip {
  position: absolute;
  position-anchor: --anchor-top-anchor;
  position-visibility: no-overflow;
  bottom: anchor(top);
}
Demo di position-visibility: no-overflow

Rilevamento delle funzionalità e polyfilling

Poiché al momento il supporto dei browser è limitato, ti consigliamo di utilizzare questa API con alcune precauzioni. Innanzitutto, puoi verificare l'assistenza direttamente in CSS utilizzando la query sulla funzionalità @supports. Per farlo, inserisci gli stili degli ancoraggi nel seguente modo:

@supports (anchor-name: --myanchor) {

  /* Anchor styles here */

}

Inoltre, puoi eseguire il polyfill della funzionalità di posizionamento dell'ancora con il polyfill di posizionamento dell'ancora CSS di Oddbird, che funziona da Firefox 54, Chrome 51, Edge 79 e Safari 10. Questo polyfill supporta la maggior parte delle funzionalità di base della posizione dell'ancora, anche se l'implementazione attuale non è completa e contiene sintassi obsolete. Puoi utilizzare il link unpkg o importarlo direttamente in un gestore di pacchetti.

Una nota sull'accessibilità

Sebbene l'API di posizionamento dell'ancora consenta di posizionare un elemento rispetto ad altri, non crea intrinsecamente alcuna relazione semantica significativa tra di loro. Se esiste una relazione semantica tra l'elemento anchor e l'elemento posizionato (ad esempio, l'elemento posizionato è un commento nella barra laterale sull'anchor text), un modo per farlo è utilizzare aria-details per puntare dall'elemento di ancoraggio agli elementi posizionati. Il software per screen reader sta ancora imparando a gestire i dettagli ARIA, ma il supporto sta migliorando.

<div class="anchor" aria-details="sidebar-comment">Main content</div>
<div class="positioned" id="sidebar-comment">Sidebar content</div>
.anchor {
  anchor-name: --anchor;
}

.positioned {
  position: fixed;
  position-anchor: --anchor;
}

Se utilizzi il posizionamento di ancoraggio con l'attributo popover o con un elemento <dialog>, il browser gestirà le correzioni della navigazione dello stato attivo per una corretta accessibilità, quindi non è necessario avere popover o finestre di dialogo in ordine DOM. Scopri di più sulla nota sull'accessibilità nelle specifiche.

Per approfondire