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>

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 .


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>


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>


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 .


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%);


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.


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;
}

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>


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


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%);
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.