Portanto, sei que podemos centralizar uma div horizontalmente se usarmos margin:0 auto;
. Deve margin:auto auto;
funcionar como eu acho que deve funcionar? Centralizá-lo verticalmente também?
Por que também não vertical-align:middle;
funciona?
.black {
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
background:rgba(0,0,0,.5);
}
.message {
background:yellow;
width:200px;
margin:auto auto;
padding:10px;
}
<div class="black">
<div class="message">
This is a popup message.
</div>
</div>
Respostas:
Atualização de agosto de 2020
Embora ainda valha a pena ler o seguinte para obter informações úteis, já temos o Flexbox há algum tempo, então apenas use-o de acordo com esta resposta .
Você não pode usar:
vertical-align:middle
porque é não aplicável a elementos nível de blocomargin-top:auto
emargin-bottom:auto
porque seus valores usados seriam computados como zeromargin-top:-50%
porque os valores de margem baseados em porcentagem são calculados em relação à largura do bloco que contémNa verdade, a natureza do fluxo de documentos e os algoritmos de cálculo da altura do elemento tornam impossível usar as margens para centralizar um elemento verticalmente dentro de seu pai. Sempre que o valor de uma margem vertical é alterado, ele irá disparar um recálculo da altura do elemento pai (refluxo), que por sua vez irá disparar um recentramento do elemento original ... tornando-o um loop infinito.
Você pode usar:
Algumas soluções alternativas como esta que funcionam para o seu cenário; os três elementos devem ser aninhados da seguinte forma:
JSFiddle funciona bem de acordo com Browsershot.
fonte
#
é um hack para ter a regra prefixada apenas interpretada pelo IE7 e inferior. Você pode preferir incluir essas regras em uma folha de estilo específica do IE usando comentários condicionais etc.position: absolute; top: 50%; transform: translateY(-50%);
também é viável e bastante popular ... (ao contrário detop:50%;margin: - $halfHeight
você não precisa saber a altura com antecedência ...)Desde que esta pergunta foi feita em 2012 e já percorremos um longo caminho com o suporte do navegador para flexboxes, eu senti que essa resposta era obrigatória.
Se a exibição de seu contêiner pai for
flex
, então sim ,margin: auto auto
(também conhecido comomargin: auto
) funcionará para centralizá-lo horizontalmente e verticalmente, independentemente de ser um elementoinline
oublock
.Observe que a largura / altura não precisa ser especificada de forma absoluta, como neste exemplo jfiddle, que usa o tamanho em relação à janela de visualização.
Embora o suporte do navegador para flexboxes esteja em alta no momento da publicação, muitos navegadores ainda não o suportam ou exigem prefixos do fornecedor. Consulte http://caniuse.com/flexbox para obter informações atualizadas de suporte ao navegador.
Atualizar
Como essa resposta recebeu um pouco de atenção, também gostaria de salientar que você não precisa especificar
margin
se está usandodisplay: flex
e gostaria de centralizar todos os elementos no contêiner:fonte
Aqui está a melhor solução que encontrei: http://jsfiddle.net/yWnZ2/446/ Funciona no Chrome, Firefox, Safari, IE8-11 e Edge.
Se você tem uma declarada
height
(height: 1em
,height: 50%
, etc.) ou é um elemento onde o navegador sabe a altura (img
,svg
oucanvas
por exemplo), então tudo que você precisa para centralização vertical é esta:Você normalmente desejará especificar um
width
oumax-width
mais, o conteúdo não se estende por toda a extensão da tela / contêiner.Se você estiver usando isso para um modal que deseja sempre centralizado na janela de visualização sobrepondo outro conteúdo, use
position: fixed;
para os dois elementos em vez deposition: absolute
. http://jsfiddle.net/yWnZ2/445/Aqui está um artigo mais completo: http://codepen.io/shshaw/pen/gEiDt
fonte
position: relative
ao pai e o elemento será centralizado no pai. Eu fiz um artigo muito maior na Smashing Magazine sobre a técnica, se você quiser ler mais: coding.smashingmagazine.com/2013/08/09/…parent
- entendi. Muito obrigado!display: table
para conteúdo de altura variável. Caso contrário, este método deve funcionar conforme o esperado. Leia o artigo para obter mais detalhes gerais. Você também deve ser capaz de testar a visualização completa no IE8 / 9 para ver se há algum problema.Edit: é 2020, eu usaria flex box em vez disso.
Resposta original:
Html
CSS
fonte
Sei que a pergunta é de 2012, mas descobri a maneira mais fácil de todas e queria compartilhar.
HTML:
e CSS:
fonte
Se você souber a altura do div que deseja centralizar , poderá posicioná-lo absolutamente dentro de seu pai e definir o
top
valor como50%
. Isso colocará o topo do div filho 50% abaixo de seu pai, ou seja, muito baixo. Puxe-o de volta definindo seumargin-top
para a metade de sua altura. Então agora você tem o ponto médio vertical do div filho sentado no ponto médio vertical do pai - centralizado verticalmente!Exemplo:
http://jsfiddle.net/yWnZ2/2/
fonte
margin-top
não pode ser definido em% em relação à altura do elemento, então você acabará com uma correção dependente das dimensõesmargin-top
.Essas duas soluções requerem apenas dois elementos aninhados.
Primeiro - Posicionamento relativo e absoluto se o conteúdo for estático (centralização manual).
https://jsfiddle.net/GlupiJas/5mv3j171/
ou para design fluido - para centro de conteúdo exato, use o exemplo abaixo:
https://jsfiddle.net/GlupiJas/w3jnjuv0/
Você precisa definir 'min-height' caso o conteúdo ultrapasse 50% da altura da janela. Você também pode manipular essa altura com consulta de mídia para dispositivos móveis e tablets. Mas apenas se você jogar com design responsivo.
Acho que você poderia ir mais longe e usar um script JavaScript / JQuery simples para manipular a altura mínima ou a altura fixa se houver necessidade por algum motivo.
Segundo - se o conteúdo for fluido, você também pode usar as propriedades css de tabela e célula de tabela com alinhamento vertical e alinhamento de texto centralizado:
e
Funciona e escala perfeitamente, muitas vezes usado como solução de web design responsivo com layouts de grade e consulta de mídia que manipulam a largura do objeto.
https://jsfiddle.net/GlupiJas/4daf2v36/
Eu prefiro a solução de tabela para a centralização exata do conteúdo, mas em alguns casos o posicionamento absoluto relativo fará um trabalho melhor, especialmente se não quisermos manter a proporção exata do alinhamento do conteúdo.
fonte
fonte
Não existe uma maneira fácil de centralizar o div verticalmente, o que funcionaria em todas as situações.
No entanto, existem muitas maneiras de fazer isso, dependendo da situação.
Aqui estão alguns deles:
Você também pode procurar no google por "centralização vertical css"
fonte
altura variável, margem superior e inferior automática
altura variável, margem superior e inferior automática
fonte
Usando Flexbox:
HTML:
CSS:
Ver resultado
fonte
fonte