Layout
In questa pagina verrà descritto, tra le altre cose, come impostare un layout sia con flex che con CSS grid. In ogni caso i layout saranno sempre Mobile First
Width Utility Classes
Abbiamo diverse utility classes per impostare la larghezza degli elementi di una pagina.
Auto width
Con .w-auto fai calcolare automaticamente al browser la larghezza dell'elemento
<div class="bg-primary-300 py-2 px-4 w-auto"></div>
Screen width
Con .w-screen l'elemento avrà la stessa larghezza del viewport.
<div class="bg-primary-300 py-2 px-4 w-screen"></div>
Fixed width
Con .w-{numero} o .w-px si imposta la larghezza di un elemento secondo parametri fissi (.w-0 larghezza= 0, .w-px larghezza= 1px, .w-1 larghezza= .25rem, .w-2 larghezza= .5rem, ecc)
<div class="w-px"></div>
Fluid Width. Layout fluido con flex e frazioni
Con .w-{frazione} l'elemento avrà una larghezza calcolata in percentuale. Per avere il controllo della larghezza a seconda del viewport, bisogna aggiungere alla classe di base (es. .w-full) un'altra classe preceduta dal prefisso .{breakpoint}:. ad esempio, un elemento con le classi .w-full .sm:1/2 avrà di base una larghezza full e dalle risoluzioni small in su avrà un'ampiezza di 1/2
<div class="flex-none sm:flex mb-4">
<div class="bg-primary-200 py-2 px-4 w-full sm:w-1/2">
...
</div>
<div class="bg-primary-400 py-2 px-4 w-full sm:w-1/2">
...
</div>
</div>
Grid Layout
E' possibile organizzare col minimo sforzo un layout completamente responsive usando le grid utility classes. Si può impostare una griglia per un massimo di 12 celle della stessa ampiezza per riga. Di seguito l'elenco delle grid utility classes.
Esempio griglia basic
Ad esempio, se il div contenitore ha le due grid utility classes .grid .grid-cols-4, avremo al suo interno una griglia di 4 celle della stessa ampiezza per ogni riga. la classe .gap-{numero} imposta lo spazio verticale e orizzontale tra ogni cella.
<div class="grid grid-cols-4 gap-4">
<div class="..."></div>
<div class="..."></div>
</div>
Responsive grid
seguendo sempre la logica *mobile first*, posso impostare la griglia in modo che si adatti a seconda del viewport. alla classe generale (in questo caso .grid-cols-none),
aggiungo delle classi che iniziano con il prefisso breakpoint .{breakpoint}:
(in questo caso md:grid-cols-2 e lg:grid-cols-4).
Nell'esempio avremo una griglia che dalle risoluzioni large in su avrà quattro celle per riga, da quelle medium in su ne avrà due per riga, e negli altri casi ogni cella occuperà tutta la larghezza del contenitore
<div class="grid grid-cols-none md:grid-cols-2 lg:grid-cols-4 gap-4">
<div class="..."></div>
<div class="..."></div>
</div>
Grid Auto Columns
Con .{breakpoint}: (in questo caso grid-cols-auto si risolve la questione breakpoint alla radice: viene generata una griglia che si adatta automaticamente al viewport o al contenitore senza bisogno di breakpoint.
<div class="grid grid-cols-auto">
<div class="..."></div>
<div class="..."></div>
</div>
Grid Layout Start/End
E' possibile organizzare la griglia in modo che le celle non siano per forza tutte della stessa larghezza. attraverso queste classi, che saranno associate alle celle, si potrà controllare il modo in cui i singoli elementi saranno posizionati all'interno della griglia attraverso span, offset, ecc
Esempio col span
<div class="grid grid-cols-none lg:grid-cols-4 md:grid-cols-2 gap-4">
<div class="col-span-2 bg-primary-200 h-8"></div>
<div class="bg-primary-300 h-8"></div>
<div class="bg-primary-200 h-8"></div>
<div class="col-span-3 bg-primary-300 h-8"></div>
<div class="bg-primary-300 h-8"></div>
<div class="bg-primary-200 h-8"></div>
<div class="bg-primary-200 h-8"></div>
<div class="col-span-2 bg-primary-300 h-8"></div>
</div>
Esempio col start
In questo caso la prima cella della griglia ha un .col-start-3, che vuol dire che ha un offset pari allo spazio di due celle
<div class="grid grid-cols-none lg:grid-cols-4 md:grid-cols-2 gap-4">
<div class="col-start-3 bg-primary-200 h-8"></div>
<div class="bg-primary-300 h-8"></div>
<div class="bg-primary-200 h-8"></div>
<div class="col-span-3 bg-primary-300 h-8"></div>
<div class="bg-primary-300 h-8"></div>
<div class="bg-primary-200 h-8"></div>
<div class="bg-primary-200 h-8"></div>
<div class="bg-primary-200 h-8"></div>
</div>