Esto es algo que he necesitado hacer muchas veces y una solución consistente aún requiere que agregue un pequeño marcado no semántico y algunos hacks específicos del navegador. Cuando obtengamos compatibilidad con el navegador para CSS 3, obtendrá su centrado vertical sin pecar.
Para una mejor explicación de la técnica, puede consultar el artículo del que lo adapté , pero básicamente implica agregar un elemento adicional y aplicar diferentes estilos en IE y navegadores que admiten position:table\table-cell
elementos que no son de tabla.
<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>
Hay muchas formas (hacks) para aplicar estilos en conjuntos específicos de navegadores. Utilicé comentarios condicionales, pero mire el artículo vinculado anteriormente para ver otras dos técnicas.
Nota: Existen formas simples de obtener un centrado vertical si conoce algunas alturas de antemano, si está tratando de centrar una sola línea de texto o en varios otros casos. Si tiene más detalles, tírelos porque puede haber un método que no requiera hacks del navegador o marcado no semántico.
Actualización: Estamos comenzando a obtener una mejor compatibilidad del navegador para CSS3, incorporando tanto la caja flexible como las transformaciones como métodos alternativos para obtener un centrado vertical (entre otros efectos). Consulte esta otra pregunta para obtener más información sobre los métodos modernos, pero tenga en cuenta que la compatibilidad con el navegador aún es incompleta para CSS3.