2010-10-14 14 views
35

Rispetto alla pagina, l'allineamento orizzontale in CSS è semplice: a margin:0 auto si ottiene la maggior parte del tempo e uno text-align:center per altri casi.metafisica CSS: PERCHÉ l'allineamento verticale della pagina è così difficile?

La mia domanda ai guru non è come allineare verticalmente, ma perché è molto più difficile? Perché non c'è margin:auto 0? Voglio dire, da una prospettiva di programmazione.

In teoria, sembra che gli stessi algoritmi si applichino a entrambi i tipi di centraggio.

+1

Suppongo che sia perché il browser può facilmente conoscere la larghezza della pagina, ma la lunghezza cambia in base al contenuto. – imgx64

+3

Questo è ciò che intendo con gli algoritmi - la larghezza potrebbe anche essere modificata dinamicamente, ma i CSS mantengono il passo. Perché non per le modifiche verticali? – Ben

risposta

17

Buona domanda e non lo so, ma sospetterei che la radice del problema risieda nell'HTML e quindi i motori di rendering sono originariamente destinati alla semantica del documento anziché alla semantica di stampa/layout. I CSS sono eccezionalmente bravi nella descrizione di paragrafi, intestazioni e tutti i tipi di problemi relativi ai documenti e sono davvero deboli quando si tratta di compiti di layout DTP più grandi che ora tutti vogliono siano i loro siti web.

In breve: penso che il problema sia che l'HTML viene assegnato a cose per cui non è stato progettato. Quel sorpresa.

+33

CSS 4 e HTML 6, si prega di rendere 'vertical-align: center;' funziona su qualsiasi cosa. Per favore. – william44isme

4

Concettualmente, le regole CSS vengono applicate agli elementi di un documento nell'ordine in cui appaiono nell'HTML, vale a dire in un traversal di preordine della struttura DOM. Storicamente, questo era così che il CSS poteva essere applicato come il documento veniva caricato, ma anche con HTML dinamico e CSS dinamico, ci sono vantaggi di prestazioni per essere in grado di applicare il CSS in un unico passaggio.

Ecco perché il CSS non ha selettori per "una A seguita da una B" o "una A che contiene una B", mentre è possibile dire "una A preceduta da una B" o "una A contenuta all'interno di una B ", perché in quest'ultimo caso, A precede B in un attraversamento preordinato.

verticale centratura è difficile perché al momento della CSS per l'elemento figlio (l'elemento di essere centrato) viene elaborato, le altezze degli elementi principali e secondari (i due valori necessari per calcolare l'offset dell'elemento figlio all'inizio) non sono noti, poiché entrambi dipendono da elementi che non sono ancora stati elaborati.

La dipendenza dall'altezza dell'elemento padre viene superata dal posizionamento assoluto: top: 50%. In questo modo si rimuove in modo efficace il calcolo dell'offset verticale fino a quando l'altezza dell'elemento padre è nota.

Analogamente, le trasformazioni CSS3 possono tenere conto dell'altezza del bambino: transform: translateY(-50%). Prima del CSS3, era comune usare invece lo margin-top negativo, ma era necessario impostare un'altezza fissa sull'elemento figlio.