Se é uma linha de texto e / ou imagem, é fácil fazê-lo. Apenas use:
text-align: center;
vertical-align: middle;
line-height: 90px; /* The same as your div height */
É isso aí. Se pode haver várias linhas, é um pouco mais complicado. Mas existem soluções em http://pmob.co.uk/ . Procure por "alinhamento vertical".
Como eles tendem a ser hacks ou adicionando divs complicados ... eu costumo usar uma tabela com uma única célula para fazê-lo ... para torná-lo o mais simples possível.
Atualização para 2020:
A menos que você precise fazê-lo funcionar em navegadores anteriores, como o Internet Explorer 10, você pode usar o flexbox. É amplamente suportado por todos os principais navegadores atuais . Basicamente, o contêiner precisa ser especificado como um contêiner flexível, juntamente com a centralização ao longo do eixo principal e transversal:
#container {
display: flex;
justify-content: center;
align-items: center;
}
Para especificar uma largura fixa para o filho, que é chamado de "item flexível":
#content {
flex: 0 0 120px;
}
Exemplo: http://jsfiddle.net/2woqsef1/1/
Para reduzir o conteúdo, é ainda mais simples: basta remover a flex: ...
linha do item flexível e ele é automaticamente encolhido.
Exemplo: http://jsfiddle.net/2woqsef1/2/
Os exemplos acima foram testados nos principais navegadores, incluindo o MS Edge e o Internet Explorer 11.
Uma observação técnica se você precisar personalizá-lo: dentro do item flex, como esse item não é um contêiner flex, a maneira antiga de CSS não-flexbox funciona como esperado. No entanto, se você adicionar um item flexível adicional ao contêiner flexível atual, os dois itens flexíveis serão posicionados horizontalmente. Para colocá-los na vertical, adicione-os flex-direction: column;
ao contêiner flex. É assim que funciona entre um contêiner flex e seus elementos filhos imediatos .
Existe um método alternativo de centralizar: não especificando center
a distribuição nos eixos principal e cruzado para o container flex, mas especifique margin: auto
no item flex para ocupar todo o espaço extra nas quatro direções e as margens distribuídas uniformemente tornará o item flexível centralizado em todas as direções. Isso funciona, exceto quando há vários itens flexíveis. Além disso, essa técnica funciona no MS Edge, mas não no Internet Explorer 11.
Atualização para 2016/2017:
Isso pode ser feito com mais frequência transform
e funciona bem mesmo em navegadores mais antigos, como o Internet Explorer 10 e o Internet Explorer 11. Ele suporta várias linhas de texto:
position: relative;
top: 50%;
transform: translateY(-50%);
Exemplo: https://jsfiddle.net/wb8u02kL/1/
Para encolher a largura:
A solução acima usou uma largura fixa para a área de conteúdo. Para usar uma largura reduzida, use
position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
Exemplo: https://jsfiddle.net/wb8u02kL/2/
Se o suporte ao Internet Explorer 10 for necessário, o flexbox não funcionará e o método acima e o line-height
método funcionariam. Caso contrário, o flexbox faria o trabalho.
text-align:center
que não faz a "parte vertical"?