alinhamento vertical no meio em <div>

126

Quero manter a altura de #abc divem 50pxe o texto para alinhar verticalmente no meio do div.

body{
  padding: 0;
  margin: 0;
  margin: 0px auto;
}

#main{
  position: relative;
  background-color:blue;
  width:500px;
  height:500px;
}

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  vertical-align:middle;
}
<div id="main">
 <div id="abc">
     asdfasdfafasdfasdf
 </div>
</div>

Doente
fonte

Respostas:

183

Você pode usar line-height: 50px;, você não precisará de vertical-align: middle;lá.

Demo


O exemplo acima falhará se você tiver várias linhas, portanto, nesse caso, você pode agrupar seu texto usando spane depois usar display: table-cell;e display: table;junto com vertical-align: middle;, além disso, não se esqueça de usar width: 100%;para#abc

Demo

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  display: table;
  width: 100%;
}

#abc span {
  vertical-align:middle;
  display: table-cell;
}

Outra solução que posso pensar aqui é usar a transformpropriedade translateY()onde, Yobviamente, significa Y Axis. É bem simples ... Tudo o que você precisa fazer é definir a posição dos elementos para absolutee depois posicionar 50%a toppartir do eixo e traduzir com o eixo negativo-50%

div {
  height: 100px;
  width: 100px;
  background-color: tomato;
  position: relative;
}

p {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

Demo

Observe que isso não será suportado em navegadores mais antigos, por exemplo, o IE8, mas você pode criar o IE9 e outras versões mais antigas do navegador Chrome e Firefox usando -ms, -moze -webkitprefixos, respectivamente.

Para mais informações transform, você pode consultar aqui .

Mr. Alien
fonte
Eu precisava conhecer essa solução simples de altura de linha durante toda a minha vida profissional e só aprendi sobre isso agora. Obrigado, Sr. Alien.
Nathan Beach
94

É simples: dê ao pai o seguinte:

display: table;

e dê à criança div (s) o seguinte:

display: table-cell;
vertical-align: middle;

É isso aí!

.parent{
    display: table;
}
.child{
    display: table-cell;
    vertical-align: middle;
    padding-left: 20px;
}
<div class="parent">
    <div class="child">
        Test
    </div>
    <div class="child">
        Test Test Test <br/> Test Test Test
    </div>
    <div class="child">
        Test Test Test <br/> Test Test Test <br/> Test Test Test
    </div>
<div>

Burak Çanga
fonte
6
isso é ruim, pois está usando a tabela como um hack, pode funcionar na maioria dos casos, mas quando você deseja alterar a largura da 'tabela', não funcionará corretamente (o que estou tendo agora o problema com esta solução )
Kevin Simple
Não precisei adicionar display:table;o pai aos pais para fazê-lo funcionar.
VincentPerrin.com 22/09/2015
Talvez isso seja um hack ... mas FUNCIONA, e a maioria das outras soluções funciona apenas em casos específicos e geralmente não é utilizável em nosso caso.
Jerry
Vantagem desta solução: trabalha com todos os tipos de conteúdo (e não apenas para texto, e não apenas uma única linha ...)
Jerry
77

Pergunta antiga, mas atualmente o CSS3 torna o alinhamento vertical realmente simples !

Basta adicionar ao #abcseguinte css:

display:flex;
align-items:center;

Demonstração simples

Demonstração da pergunta original atualizada

Exemplo simples:

.vertical-align-content {
  background-color:#f18c16;
  height:150px;
  display:flex;
  align-items:center;
  /* Uncomment next line to get horizontal align also */
  /* justify-content:center; */
}
<div class="vertical-align-content">
  Hodor!
</div>

Jaqen H'ghar
fonte
3
Eu sugeriria também: display: grid; alinhar itens: centro; Funciona melhor quando você tem mais de um objeto para alinhar verticalmente juntos
Leonardo Daga
Quais navegadores suportam CSS3 ?
Kiquenet
@Kiquenet, 92% do mercado global caniuse.com/#search=align-items
Daniel Kucal
Perfekt! Simples e fácil .. basta adicionar ao contêiner
Ujjwal Singh
47

Encontrei esta solução por Sebastian Ekström. É rápido, sujo e funciona muito bem. Mesmo se você não souber a altura dos pais:

.element {
  position: relative;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

Leia o artigo completo aqui .

Scott
fonte
3
Isso pode desfocar as coisas porque o resultado das transformações pode levar a que as coisas sejam posicionadas em locais de meio pixel.
Kevin Wheeler
1
Há uma atualização na postagem direcionada para esse problema. No pai transform-style: preserve-3d;:!
Andry 29/07
8

Você pode usar a altura da linha maior que a altura da div. Mas para mim a melhor solução é esta ->position:relative; top:50%; transform:translate(0,50%);

Andris
fonte
4

Que tal adicionar line-height?

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  vertical-align:middle;
  line-height: 45px;
}

Violino, altura da linha

Ou por paddingdiante #abc. Este é o resultado com preenchimento

Atualizar

Adicione no seu css:

#abc img{
   vertical-align: middle;
}

O resultado . Espero que seja o que você está procurando.

Aldi Unanto
fonte
não funciona da maneira que eu quero, quando você altera a altura ou a altura da linha, algo não está certo. já tenho uma resposta, obrigado de qualquer maneira
Sickest
2

Tente o seguinte:

.main_div{
    display: table;
    width: 100%;
}
.cells {
    display: table-cell;
    vertical-align: middle;
}

Outro método para centralizar uma div:

<div id="parent">
    <div id="child">Content here</div>
</div>

#parent {position: relative;}

#child {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 50px;
    height: 100px;
    margin: auto;
}
Amigo
fonte
2

 div {
    height:200px;
    text-align: center;
    padding: 2px;
    border: 1px solid #000;
    background-color: green;
}

.text-align-center {
    display: flex;
    align-items: center;
    justify-content: center;
}
<div class="text-align-center"> Align center</div>

Fouzia Khan
fonte
Explique por favor!
Szabolcs Páll
1

Use a propriedade translateY CSS para centralizar verticalmente o texto no contêiner

<style>
.centertext{

    position: relative;
    top: 50%;
    transform: translateY(40%);

}
</style>

E depois aplique-o ao seu DIV contendo

  <div class="centertext">
        <font style="color:white; font-size:20px;">   Your Text Here </font>
  </div>

Ajuste a porcentagem de tradução para atender às suas necessidades. Espero que isto ajude

Hondaman900
fonte
1

Este código é para o alinhamento vertical central e horizontal central, sem especificar a altura fixa:

.parent-class-name {
  position: relative;
}

.className {
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  margin: 0 auto;
  transform: translateY(-50%);
  -moz-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
}

nilesh pawar
fonte