Questo è qualcosa che ho dovuto fare molte volte e una soluzione coerente richiede ancora di aggiungere un po 'di markup non semantico e alcuni hack specifici del browser. Quando avremo il supporto del browser per css 3 otterrai il tuo centraggio verticale senza peccare.
Per una migliore spiegazione della tecnica è possibile consultare l'articolo da cui l'ho adattato , ma in pratica comporta l'aggiunta di un elemento aggiuntivo e l'applicazione di stili diversi in Internet Explorer e browser che supportano position:table\table-cell
elementi non di tabella.
<div class="valign-outer">
<div class="valign-middle">
<div class="valign-inner">
Excuse me. What did you sleep in your clothes again last night. Really. You're gonna be in the car with her. Hey, not too early I sleep in on Saturday. Oh, McFly, your shoe's untied. Don't be so gullible, McFly. You got the place fixed up nice, McFly. I have you're car towed all the way to your house and all you've got for me is light beer. What are you looking at, butthead. Say hi to your mom for me.
</div>
</div>
</div>
<style>
/* Non-structural styling */
.valign-outer { height: 400px; border: 1px solid red; }
.valign-inner { border: 1px solid blue; }
</style>
<!--[if lte IE 7]>
<style>
/* For IE7 and earlier */
.valign-outer { position: relative; overflow: hidden; }
.valign-middle { position: absolute; top: 50%; }
.valign-inner { position: relative; top: -50% }
</style>
<![endif]-->
<!--[if gt IE 7]> -->
<style>
/* For other browsers */
.valign-outer { position: static; display: table; overflow: hidden; }
.valign-middle { position: static; display: table-cell; vertical-align: middle; width: 100%; }
</style>
Esistono molti modi (hack) per applicare gli stili in set specifici di browser. Ho usato i commenti condizionali, ma guarda l'articolo collegato sopra per vedere altre due tecniche.
Nota: ci sono modi semplici per ottenere il centramento verticale se si conoscono alcune altezze in anticipo, se si sta tentando di centrare una singola riga di testo o in molti altri casi. Se hai maggiori dettagli, inseriscili perché potrebbe esserci un metodo che non richiede hack del browser o markup non semantico.
Aggiornamento: stiamo iniziando a ottenere un migliore supporto del browser per CSS3, portando sia flex-box che trasformazioni come metodi alternativi per ottenere il centraggio verticale (tra gli altri effetti). Vedi questa altra domanda per ulteriori informazioni sui metodi moderni, ma tieni presente che il supporto del browser è ancora impreciso per CSS3.