Qual é a melhor maneira de centralizar verticalmente o conteúdo de uma div quando a altura do conteúdo é variável. No meu caso particular, a altura da div do contêiner é fixa, mas seria ótimo se houvesse uma solução que funcionasse nos casos em que o contêiner também tivesse uma altura variável. Além disso, eu adoraria uma solução sem, ou com muito pouco uso de hacks CSS e / ou marcação não semântica.
css
vertical-alignment
jessegavin
fonte
fonte
Respostas:
Basta adicionar
para a div interna.
O que ele faz é mover a borda superior da div interna para a meia altura da div externa (
top: 50%;
) e depois a div interna para a metade da altura (transform: translateY(-50%)
). Isso funcionará composition: absolute
ourelative
.Lembre-se disso
transform
etranslate
tenha prefixos de fornecedores que não estejam incluídos por simplicidade.Codepen: http://codepen.io/anon/pen/ZYprdb
fonte
transform
das coisas relacionadas é-webkit-
prefixada e agora funciona. Como lembrete: não se esqueça de adicionar o-webkit-
prefixo também.position: absolute
, não é?translate
ele renderizará tudo embaçado ao tentar manipular .5px de altura em tudo.Esta parece ser a melhor solução que encontrei para esse problema, desde que o navegador suporte o
::before
pseudo elemento: CSS-Tricks: Centering in the Unknown .Não requer nenhuma marcação extra e parece funcionar extremamente bem. Não pude usar o
display: table
método porque ostable
elementos não obedecem àmax-height
propriedade.fonte
.block { white-space: nowrap; font-size: 0; line-height: 0; }
e deixar a margem direita negativa no pseudo elemento, basta redefinir fs e lh em .centered ... assim você garante que o elemento seja posicionado corretamente mesmo que seja mais largo do que a viewport (e não tem que usar a margem negativa um pouco confusa).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.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.
fonte
Usando o seletor filho, peguei a resposta incrível de Fadi acima e reduzi-a a apenas uma regra de CSS que posso aplicar. Agora tudo o que preciso fazer é adicionar o
contentCentered
nome da classe aos elementos que quero centralizar:Código bifurcado: http://codepen.io/dougli/pen/Eeysg
fonte
*
seletor terá desempenho pior do que a resposta aceita. Pode não ser um problema, mas vale a pena notar. stevesouders.com/blog/2009/06/18/simplifying-css-selectors> div
vez disso. calendar.perfplanet.com/2011/…Melhor resultado para mim até agora:
div a ser centrado:
fonte
Você pode usar a margem automática. Com o flex, o div também parece estar centralizado verticalmente.
fonte
Para mim, a melhor maneira de fazer isso é:
A vantagem é não precisar explicitar a altura
fonte
Esta é a minha solução incrível para uma
div
altura dinâmica (percentual).CSS
HTML
Tente você mesmo.
fonte
você pode usar a tela flexível, como no código abaixo:
fonte