Cosa fa overflow
Quando il contenuto è più grande del suo riquadro (un'altezza fissa, una parola lunga, una tabella larga), trabocca. La proprietà overflow decide cosa succede alla parte in eccesso:
| Valore | Cosa vedi | Contenitore di scorrimento |
|---|---|---|
visible (predefinito) | Il contenuto esce dal riquadro e si sovrappone a ciò che segue | No |
hidden | Tagliato al bordo del padding, senza barre di scorrimento (uno script può ancora farlo scorrere) | Sì |
clip | Tagliato, e nessuno scorrimento, nemmeno tramite script | No |
scroll | Mostra sempre le barre di scorrimento, anche se il contenuto ci sta | Sì |
auto | Barre di scorrimento solo quando il contenuto non ci sta | Sì |
Su macOS e sui telefoni le barre di scorrimento stanno sopra il contenuto e svaniscono, quindi scroll e auto possono sembrare uguali finché non scorri.
Creare un riquadro scorrevole
Un riquadro trabocca solo se qualcosa ne limita la dimensione. Un height o un max-height, più overflow-y: auto, trasformano un elenco lungo in un pannello che scorre:
Qui max-height è meglio di height: un elenco corto resta corto e scorre solo un elenco lungo. A un'area scorrevole senza contenuto focalizzabile al suo interno conviene dare tabindex="0", così anche chi usa la tastiera può farla scorrere.
overflow-x e overflow-y
I due assi si possono impostare separatamente. L'uso tipico è una tabella larga che scorre di lato dentro il suo contenitore invece di allargare tutta la pagina:
Una regola da ricordare: se un asse è hidden, scroll o auto, un valore visible sull'altro asse diventa auto. Quindi overflow-x: hidden da solo può darti una barra di scorrimento verticale inattesa. overflow-x: clip non ha questo effetto:
.a { overflow-x: hidden; } /* overflow-y computes to auto */
.b { overflow-x: clip; } /* overflow-y stays visible */
Tagliare il testo con un'ellissi
text-overflow: ellipsis sostituisce la fine tagliata di una riga con "…". Servono tre cose insieme: una larghezza limitata, un testo che non può andare a capo e l'overflow nascosto:
Il line clamp con prefisso -webkit- funziona in Chrome, Firefox e Safari. Gli screen reader leggono comunque il testo completo, quindi per loro le parole tagliate non vanno perse.
Effetti collaterali di overflow
Impostare overflow su un valore diverso da visible o clip cambia più del semplice taglio:
- Contiene i float e i margini dei figli. L'elemento forma un nuovo contesto di formattazione a blocchi, quindi cresce per avvolgere i figli flottanti.
display: flow-rootfa lo stesso senza tagliare niente. - Rompe
position: stickyal suo interno. Un figlio sticky si attacca al contenitore di scorrimento più vicino; se quel contenitore non scorre, non si attacca niente. - Taglia i figli posizionati in modo assoluto (quando l'elemento che trabocca è anche il loro blocco contenitore), compresi menu a tendina e tooltip, e taglia anche le ombre dei figli.
Nascondere la barra di scorrimento
Puoi mantenere un riquadro scorrevole nascondendo la sua barra con scrollbar-width: none. Usalo con moderazione: senza barra di scorrimento, molti lettori non si accorgono che c'è altro contenuto. scrollbar-gutter: stable fa il lavoro opposto: riserva lo spazio della barra, così il contenuto non si sposta quando compare.
Errori comuni
- Aspettarsi un overflow senza limite di dimensione. Un riquadro senza
heightomax-heightcresce invece di traboccare. overflow: hiddensubodyper "sistemare" lo scorrimento orizzontale. Trova invece l'elemento troppo largo (spesso unwidthfisso, un URL lungo o100vwcon una barra di scorrimento).- Ellissi senza
white-space: nowrap. Il testo va a capo, quindi niente trabocca in orizzontale e l'ellissi non compare. overflow-x: hiddenche crea una barra di scorrimento verticale. Usaclip.- Un menu a tendina tagliato dalla sua card. L'
overflow: hiddendella card lo taglia; sposta la regola overflow o disegna il menu fuori dalla card.
Domande frequenti
Cosa fa overflow: hidden?
Taglia il contenuto che non entra nel riquadro di padding dell'elemento, senza barre di scorrimento. La parte nascosta si può comunque raggiungere scorrendo tramite script o mettendo il focus su qualcosa al suo interno.
Qual è la differenza tra overflow auto e scroll?
scroll riserva sempre le barre di scorrimento, anche quando il contenuto ci sta. auto mostra una barra solo quando il contenuto è più grande del riquadro, ed è quello che di solito vuoi.
Come rendo scorrevole un div?
Limita la sua dimensione e consenti lo scorrimento: max-height: 300px; overflow-y: auto;. Senza un limite di altezza o di altezza massima, il div cresce con il suo contenuto e non trabocca mai.
Perché overflow-x: hidden aggiunge anche una barra di scorrimento verticale?
Se un asse è hidden, scroll o auto, un valore visible sull'altro asse viene calcolato come auto. Usa invece overflow-x: clip, che non crea un contenitore di scorrimento e lascia visibile l'altro asse.
Come aggiungo un'ellissi (...) al testo che trabocca?
Per una riga: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; su un elemento con larghezza limitata. Per più righe, usa display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.