Estou tendo um problema com a altura da linha que não consigo entender.
O código a seguir centralizará uma imagem em um div:
CSS
.bar {
height: 800px;
width: 100%;
line-height:800px;
background-color: #000;
text-align: center;
}
.bar img {
vertical-align: middle;
}
HTML
<div class="bar">
<img src="http://27.media.tumblr.com/yHWA4oxH870ulxnoH7CkOSDR_500.jpg" alt="Foo Image" />
</div>
No entanto, se eu alterar a altura da linha para 100%, a altura da linha não terá efeito (ou pelo menos não se tornará 100% da div).
Alguém sabe o que estou fazendo de errado?
Sei que essa pergunta é antiga, mas descobri qual é a solução alternativa perfeita para mim.
Eu adiciono este css ao div que desejo centralizar:
Isso funciona sempre e é limpo.
Edit: Apenas para fins de conclusão, eu uso scss e tenho um mixin útil que incluo em todos os pais que são filhos diretos que desejo centralizar verticalmente:
Explicação completa:
div:before
adicionará um elemento dentro do div, mas antes de qualquer um de seus filhos. Ao usar:before
ou:after
devemos usar umacontent:
declaração, caso contrário, nada acontecerá, mas para o nosso propósito, o conteúdo pode estar vazio. Em seguida, dizemos ao elemento para ser tão alto quanto seu pai, desde que a altura de seu pai seja definida e este elemento seja pelo menos inline-block.vertical-align
define a posição vertical de self em relação aos pais, ao contrário detext-align
que funciona de maneira diferente.A
@mixin
declaração é para usuários sass e seria usada assim:fonte
Quando você usa a porcentagem como a altura da linha, ela não se baseia no contêiner div, mas sim no tamanho da fonte.
fonte
line-height: 100% seria uma maneira fácil de centralizar verticalmente os elementos, se fosse calculado em relação ao container, mas seria muito fácil, portanto não funciona.
Em vez disso, é apenas outra maneira de dizer a altura da linha: 1em (certo?)
Outra maneira de centralizar verticalmente um elemento seria:
fonte
pode não ser bonito, mas está funcionando e sua semântica;
display: table-cell dá a um elemento a capacidade única de alinhar verticalmente (pelo menos eu acho que é único)
fonte
Essa é uma resposta muito tardia, no entanto, em navegadores modernos, supondo que o elemento pai também tenha 100% da altura da tela, você pode usar a
vh
unidade da janela de visualização. FIDDLESuporte de navegador
fonte
Esta solução funciona no IE9 e superior. Primeiro, definimos a posição superior da criança em 50% (meio do pai). Então, usando uma
translate
regra, mude a criança para cima pela metade de sua altura real. O principal benefício é que não precisamos definir a altura da criança, ela é calculada dinamicamente pelo navegador. JSFiddlefonte
Uma abordagem mais moderna é usar o flexbox para isso, é mais simples e limpo. No entanto, flexbox é um paradigma completamente diferente do que
inline-block
,float
ouposition
costumava ser.Para alinhar os itens dentro de
.parent
você, faça:Isso é tudo. Filhos de
flex
pais são automaticamente convertidos em itens filhos flexíveis.Você deve ler mais sobre o flexbox, um bom lugar para começar é esta folha de dicas: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
fonte
Você pode definir a altura da linha com base na altura desse elemento. Se a altura do elemento 200px significa que você precisa definir a altura da linha para 200px para centralizar o texto.
fonte