Allineare gli elementi in css può sembrare un'operazione semplice ed in parte è vero se stiamo allineando orizzontalmente gli elementi, ma se vogliamo allinearli verticalmente le cose iniziano a complicarsi.
Per allineare verticalmente un elemento abbiamo a disposizione diverse strategie: possiamo utilizzare flexbox, usare qualche "hack" con la proprietà transform oppure impostare manualmente le varie dimensioni.
Qual è quindi la soluzione migliore? In realtà dipende molto dalle informazioni che abbiamo a disposizione sull'elemento e quanto dobbiamo renderlo responsive.
Una delle soluzioni più semplici: non facciamo altro che aggiungere un padding verso l'alto e verso il basso delle stessa dimensione. Se per qualche motivo non possiamo utilizzare la proprietà padding, possiamo utilizzare un contenitore per l'elemento e impostare la proprietà line-height all'altezza desiderata.
.item {
padding-top: 20px;
padding-bottom: 20px;
}
.container {
height: 50px;
line-height: 50px;
white-space: nowrap;
}
In questo caso possiamo provare ad utilizzare la stessa tecnica del padding sopra e sotto che abbiamo visto nell'esempio precedente ma se abbiamo un layout particolare e non possiamo utilizzare quella soluzione possiamo affidarci a flexbox:
.container {
display: flex;
justify-content: center;
flex-direction: column;
height: 100px;
}
Se conosciamo le dimensioni di un elemento possiamo sfruttare le proprietà height e margin per allinearlo correttamente:
.container {
position: relative;
}
.item {
position: absolute;
top: 50%;
height: 100px;
margin-top: -50px;
}
In alternativa abbiamo la versione con le proprietà "moderne":
.container {
position: relative;
}
.item {
--item-height: 100px;
position: absolute;
top: calc(50% - (var(--item-height) / 2));
height: var(--item-height);
}
Se non conosciamo l'altezza dell'elemento possiamo utilizzare questo hack con la proprietà transform:
.container {
position: relative;
}
.item {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
La soluzione più moderna e più semplice:
.container {
display: flex;
flex-direction: column;
justify-content: center;
}