C'est quelque chose que j'ai dû faire plusieurs fois et une solution cohérente nécessite toujours d'ajouter un peu de balisage non sémantique et des hacks spécifiques au navigateur. Lorsque nous obtenons le support du navigateur pour css 3, vous obtiendrez votre centrage vertical sans pécher.
Pour une meilleure explication de la technique, vous pouvez consulter l'article à partir duquel je l'ai adaptée , mais cela implique essentiellement d'ajouter un élément supplémentaire et d'appliquer différents styles dans IE et les navigateurs prenant en charge position:table\table-cell
les éléments non-table.
<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>
Il existe de nombreuses façons (hacks) d'appliquer des styles dans des ensembles spécifiques de navigateurs. J'ai utilisé des commentaires conditionnels mais regardez l'article lié ci-dessus pour voir deux autres techniques.
Remarque: Il existe des moyens simples d'obtenir un centrage vertical si vous connaissez certaines hauteurs à l'avance, si vous essayez de centrer une seule ligne de texte ou dans plusieurs autres cas. Si vous avez plus de détails, ajoutez-les car il peut y avoir une méthode qui ne nécessite pas de piratage de navigateur ou de balisage non sémantique.
Mise à jour: Nous commençons à obtenir une meilleure prise en charge du navigateur pour CSS3, en apportant à la fois la boîte flexible et les transformations comme méthodes alternatives pour obtenir un centrage vertical (entre autres effets). Voir cette autre question pour plus d'informations sur les méthodes modernes, mais gardez à l'esprit que la prise en charge des navigateurs est encore sommaire pour CSS3.