Isso é algo que eu precisei fazer várias vezes e uma solução consistente ainda exige que você adicione um pouco de marcação não semântica e alguns hacks específicos do navegador. Quando obtivermos suporte do navegador para o css 3, você terá sua centralização vertical sem pecar.
Para uma melhor explicação da técnica, você pode consultar o artigo do qual a adaptei , mas basicamente envolve adicionar um elemento extra e aplicar estilos diferentes no IE e navegadores compatíveis position:table\table-cell
com elementos que não são de tabela.
<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>
Existem várias maneiras (hacks) de aplicar estilos em conjuntos específicos de navegadores. Usei comentários condicionais, mas veja o artigo acima para ver duas outras técnicas.
Nota: Existem maneiras simples de obter a centralização vertical se você souber algumas alturas com antecedência, se estiver tentando centralizar uma única linha de texto ou em vários outros casos. Se você tiver mais detalhes, envolva-os, pois pode haver um método que não requer hacks no navegador ou marcação não semântica.
Atualização: Estamos começando a obter um melhor suporte do CSS3 ao navegador, trazendo tanto a caixa flexível quanto as transformações como métodos alternativos para obter a centralização vertical (entre outros efeitos). Consulte esta outra pergunta para obter mais informações sobre métodos modernos, mas lembre-se de que o suporte ao navegador ainda é superficial para CSS3.