Impostare width e height
width e height impostano la dimensione del content box di un elemento. Di default, padding e bordo si aggiungono all'esterno di quella dimensione.
Il box misura 260 per 100 pixel: 240 per 80 di contenuto più 10px di padding su ogni lato. Con box-sizing: border-box misurerebbe esattamente 240 per 80; la pagina sul box model spiega entrambi i casi.
Valori
| Valore | Esempio | Significato |
|---|---|---|
auto | width: auto | Il valore predefinito. I blocchi riempiono la larghezza del contenitore; l'altezza si adatta al contenuto |
| Lunghezza | 300px, 20rem | Una dimensione fissa |
| Percentuale | 50% | Della larghezza del blocco contenitore (per width) o della sua altezza (per height) |
| Unità viewport | 100vh, 50vw, 100dvh | Della finestra del browser |
min-content | width: min-content | Il più stretto possibile, decide la parola più lunga |
max-content | width: max-content | Largo quanto il contenuto su una sola riga |
fit-content | width: fit-content | Come max-content, ma mai più largo del contenitore |
Perché height: 100% non fa nulla
Una height in percentuale ha bisogno di un genitore con un'altezza definita di cui essere la percentuale. Quando l'altezza del genitore è auto, che è il caso normale, anche height: 100% del figlio si comporta come auto.
Il primo figlio è alto solo quanto il suo testo. Il secondo riempie il genitore perché il genitore ha un'altezza. Per far funzionare un'intera pagina con le percentuali, ogni antenato fino a html e body ha bisogno di un'altezza, ed è per questo che la maggior parte dei layout usa invece flexbox o grid: i loro figli si allungano per riempire lo spazio senza alcuna percentuale.
min-height e max-width: dimensioni che si adattano
Le dimensioni fisse si rompono facilmente: un'altezza fissa straborda quando il testo è più lungo del previsto, e una larghezza fissa è troppo larga per un telefono. Le proprietà min- e max- impostano dei limiti invece di dimensioni esatte.
| Proprietà | Significato |
|---|---|
min-width | Mai più stretto di così |
max-width | Mai più largo di così |
min-height | Mai più basso di così, ma può crescere |
max-height | Mai più alto di così (il contenuto in più straborda) |
Su uno schermo più stretto di 360px, come quello di un telefono, le card si restringono insieme a lui, perché max-width è solo un tetto.
Quando si applicano insieme una dimensione e un limite, vincono i limiti: max-width batte width, e min-width batte max-width.
width: auto vs width: 100%
Per un elemento di blocco, lasciare width su auto è quasi sempre quello che vuoi. auto fa stare l'intero box, padding e bordo inclusi, nel contenitore. 100% rende il contenuto largo quanto il contenitore e poi aggiunge sopra padding e bordo:
width: 100% resta utile sugli elementi che di default non sono blocchi (un <input>, un <img>, un inline-block), idealmente insieme a box-sizing: border-box.
Adattare la dimensione al contenuto: fit-content
Per rendere un blocco largo solo quanto il suo testo, senza trasformarlo in inline-block, usa fit-content:
fit-content con margin-inline: auto centra un'etichetta o un blocco simile a un pulsante che resta largo esattamente quanto il suo testo.
Sezioni ad altezza piena e unità viewport
vh è l'1% dell'altezza del viewport e vw l'1% della sua larghezza. Sui telefoni, la barra degli indirizzi del browser si allarga e si restringe mentre scorri, quindi 100vh può essere più alto di quello che vedi. L'unità dinamica dvh segue l'area visibile, e svh usa l'altezza visibile più piccola:
.hero {
min-height: 100vh; /* fallback */
min-height: 100dvh; /* follows mobile toolbars */
}
Usa min-height, non height, per le sezioni a schermo intero, così anche uno schermo piccolo con molto testo ha una sezione che cresce. Un'altezza fissa con un contenuto che non ci sta lo fa strabordare, ed è di questo che si occupa la pagina su overflow in CSS.
Errori comuni
height: 100%dentro un genitore senza altezza. Si comporta comeauto. Dai un'altezza al genitore o usa flex o grid.width: 100%più padding. L'elemento esce dal suo contenitore. Lascia le larghezze dei blocchi suauto, oppure usabox-sizing: border-box.- Altezze fisse sui contenitori di testo. Usa
min-heightcosì un testo più lungo o un font più grande non straborda. widthsu un elemento inline.<span>e<a>ignoranowidtheheight; rendiliinline-blockoblock.width: 1200pxsul contenitore della pagina. Scorre di lato su ogni telefono. Usa invecemax-width: 1200px.
Domande frequenti
Perché height: 100% non funziona?
Un'altezza in percentuale è una percentuale dell'altezza del genitore, e funziona solo quando quell'altezza è definita. Se l'altezza del genitore è auto (dipende dal suo contenuto), la percentuale viene trattata come auto. Dai un'altezza al genitore, oppure usa flexbox o grid, che allungano i figli senza percentuali.
Che differenza c'è tra width: 100% e width: auto?
Per un elemento di blocco, auto riempie il contenitore includendo padding e bordo. width: 100% rende la larghezza del contenuto uguale a quella del contenitore, quindi con il box-sizing: content-box predefinito qualsiasi padding o bordo fa strabordare l'elemento.
Cosa fa min-height in CSS?
Imposta l'altezza minima che un elemento può avere, lasciandolo comunque crescere con il suo contenuto. min-height: 200px dà 200px a una card vuota, e una card con più testo diventa più alta invece di strabordare, cosa che una height fissa non permetterebbe.
Che differenza c'è tra width e max-width?
width imposta una dimensione esatta. max-width imposta un limite superiore: l'elemento può essere più stretto, per esempio su un telefono, ma mai più largo. width: 100%; max-width: 600px; riempie gli schermi piccoli e si ferma a 600px su quelli grandi.
Come faccio a far occupare a un elemento tutta l'altezza dello schermo?
Usa min-height: 100vh (o 100dvh per tenere conto delle barre del browser su mobile). min-height invece di height permette alla sezione di crescere se il suo contenuto è più alto dello schermo.