Texto central CSS (horizontal e verticalmente) dentro de um bloco div

862

Eu tenho um divconjunto para display:block( 90px heighte width) e tenho algum texto dentro.

Preciso que o texto seja alinhado no centro tanto vertical quanto horizontalmente.

Eu tentei text-align:center, mas não faz a parte horizontal, então tentei vertical-align:middle, mas não funcionou.

Alguma ideia?

Satch3000
fonte
25
você quer dizer text-align:centerque não faz a "parte vertical"?
Nonopolarity
2
Eu finalmente encontrei uma solução que funciona com tamanhos relativos e há alturas fixas: stackoverflow.com/a/16195362/1301331
cirrus
3
É muito importante saber como centralizar / elementos do meio. O documento abaixo deu uma imagem muito clara. w3.org/Style/Examples/007/center.en.html
shibualexis
Aqui estão dois métodos simples para o centro objetos dentro de divs, vertical, horizontal ou ambos (puro CSS): stackoverflow.com/a/31977476/3597276
Michael Benjamin

Respostas:

1385

Se é uma linha de texto e / ou imagem, é fácil fazê-lo. Apenas use:

text-align: center;
vertical-align: middle;
line-height: 90px;       /* The same as your div height */

É isso aí. Se pode haver várias linhas, é um pouco mais complicado. Mas existem soluções em http://pmob.co.uk/ . Procure por "alinhamento vertical".

Como eles tendem a ser hacks ou adicionando divs complicados ... eu costumo usar uma tabela com uma única célula para fazê-lo ... para torná-lo o mais simples possível.


Atualização para 2020:

A menos que você precise fazê-lo funcionar em navegadores anteriores, como o Internet Explorer 10, você pode usar o flexbox. É amplamente suportado por todos os principais navegadores atuais . Basicamente, o contêiner precisa ser especificado como um contêiner flexível, juntamente com a centralização ao longo do eixo principal e transversal:

#container {
  display: flex;
  justify-content: center;
  align-items: center;
}

Para especificar uma largura fixa para o filho, que é chamado de "item flexível":

#content {
  flex: 0 0 120px;
}

Exemplo: http://jsfiddle.net/2woqsef1/1/

Para reduzir o conteúdo, é ainda mais simples: basta remover a flex: ...linha do item flexível e ele é automaticamente encolhido.

Exemplo: http://jsfiddle.net/2woqsef1/2/

Os exemplos acima foram testados nos principais navegadores, incluindo o MS Edge e o Internet Explorer 11.

Uma observação técnica se você precisar personalizá-lo: dentro do item flex, como esse item não é um contêiner flex, a maneira antiga de CSS não-flexbox funciona como esperado. No entanto, se você adicionar um item flexível adicional ao contêiner flexível atual, os dois itens flexíveis serão posicionados horizontalmente. Para colocá-los na vertical, adicione-os flex-direction: column;ao contêiner flex. É assim que funciona entre um contêiner flex e seus elementos filhos imediatos .

Existe um método alternativo de centralizar: não especificando centera distribuição nos eixos principal e cruzado para o container flex, mas especifique margin: autono item flex para ocupar todo o espaço extra nas quatro direções e as margens distribuídas uniformemente tornará o item flexível centralizado em todas as direções. Isso funciona, exceto quando há vários itens flexíveis. Além disso, essa técnica funciona no MS Edge, mas não no Internet Explorer 11.


Atualização para 2016/2017:

Isso pode ser feito com mais frequência transforme funciona bem mesmo em navegadores mais antigos, como o Internet Explorer 10 e o Internet Explorer 11. Ele suporta várias linhas de texto:

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

Exemplo: https://jsfiddle.net/wb8u02kL/1/

Para encolher a largura:

A solução acima usou uma largura fixa para a área de conteúdo. Para usar uma largura reduzida, use

position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

Exemplo: https://jsfiddle.net/wb8u02kL/2/

Se o suporte ao Internet Explorer 10 for necessário, o flexbox não funcionará e o método acima e o line-heightmétodo funcionariam. Caso contrário, o flexbox faria o trabalho.

falta de polaridade
fonte
58
Agora existe uma display: table-cellpropriedade para isso, FYI. Usá-lo faz com que o elemento de se comportar como uma célula da tabela e permitevertical-align: middle;
Shauna
1
Se você estiver usando font:com estes, certifique-se de colocá-lo à frente da line-altura`.
user1135469
4
Isso pode não estar funcionando como planejado quando a div contém <br/> elementos.
Martin Meeser
7
E se a minha altura em%?
fácil
1
com essa abordagem, o texto deve estar em uma linha, caso contrário, você terá a segunda linha 90px abaixo primeiro.
Tomasz Mularczyk
454

Técnicas comuns a partir de 2014:


  • Abordagem 1 - transform translateX/ translateY:

    Exemplo aqui / Exemplo em tela cheia

    Nos navegadores suportados (a maioria deles), você pode usar top: 50%/ left: 50%em combinação com translateX(-50%) translateY(-50%)para centralizar verticalmente / horizontalmente o elemento dinamicamente.

    .container {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-50%);
    }

  • Abordagem 2 - Método Flexbox:

    Exemplo aqui / Exemplo em tela cheia

    Nos navegadores suportados , defina o displayelemento de destino como flexe use align-items: centerpara centralização vertical e justify-content: centercentralização horizontal. Apenas não esqueça de adicionar prefixos de fornecedores para suporte adicional ao navegador ( veja o exemplo ).

    html, body, .container {
        height: 100%;
    }
    .container {
        display: flex;
        align-items: center;
        justify-content: center;
    }

  • Abordagem 3 - table-cell/ vertical-align: middle:

    Exemplo aqui / Exemplo em tela cheia

    Em alguns casos, você precisará garantir que a altura do elemento html/ bodyesteja definida como 100%.

    Para o alinhamento vertical, definir o elemento pai width/ heighta 100%e adicione display: table. Em seguida, para o elemento filho, altere displaypara table-celle adicione vertical-align: middle.

    Para centralização horizontal, você pode adicionar text-align: centerpara centralizar o texto e quaisquer outros inlineelementos filhos. Como alternativa, você pode margin: 0 autoassumir que o elemento esteja blocknivelado.

    html, body {
        height: 100%;
    }
    .parent {
        width: 100%;
        height: 100%;
        display: table;
        text-align: center;
    }
    .parent > .child {
        display: table-cell;
        vertical-align: middle;
    }

  • Abordagem 4 - Absolutamente posicionado a 50%partir do topo com deslocamento:

    Exemplo aqui / Exemplo em tela cheia

    Essa abordagem pressupõe que o texto tenha uma altura conhecida - neste caso 18px,. Posicione o elemento absolutamente 50%de cima, em relação ao elemento pai. Use um margin-topvalor negativo que seja metade da altura conhecida do elemento, neste caso - -9px.

    html, body, .container {
        height: 100%;
    }
    .container {
        position: relative;
        text-align: center;
    }
    .container > p {
        position: absolute;
        top: 50%;
        left: 0;
        right: 0;
        margin-top: -9px;
    }

  • Abordagem 5 - O line-heightmétodo (Menos flexível - não sugerido):

    Exemplo Aqui

    Em alguns casos, o elemento pai terá uma altura fixa. Para centralização vertical, tudo o que você precisa fazer é definir um line-heightvalor no elemento filho igual à altura fixa do elemento pai.

    Embora essa solução funcione em alguns casos, vale a pena notar que ela não funcionará quando houver várias linhas de texto - assim .

    .parent {
        height: 200px;
        width: 400px;
        text-align: center;
    }
    .parent > .child {
        line-height: 200px;
    }

Os métodos 4 e 5 não são os mais confiáveis. Vá com um dos primeiros 3.

Josh Crozier
fonte
8
+1 para uma resposta abrangente. Pessoalmente, prefiro o primeiro método, porque o método 2 tem menos suporte e gosto de evitar table-cello máximo possível.
Harry
4
2. O método Flexbox é o único que funciona se o pai .containers for absoluto. 1. O método faz com que os pais encolhem por causa do .container absoluto e 3. O método simplesmente não funcionava enquanto o .parent tinha posição absoluta.
Jānis Gruzis
O Flex trabalhou para o texto de múltiplas linhas de centralização vertical no navegador ipad chrome.
prumo
7
O método Flexbox é o melhor do lote.
Rorykoehler 12/05
O Approach1 falha para mim quando o é rolável.
Vishal Gulati
78

Usando flexbox / CSS:

<div class="box">
    <p>&#x0D05;</p>
</div>

O CSS:

.box{
    display: flex;
    justify-content: center;
    align-items: center;
}

Retirado da dica rápida: a maneira mais simples de centralizar elementos na vertical e na horizontal

Vinod
fonte
4
Cuidado: não funcionará no IE. Você precisará adicionar display: -ms-flexbox; -ms-flex-align: center; -ms-flex-pack: center.
Florian Wendelborn
adicione text-align:centerpara inline-elementos .. como texto.
Observe que o flexbox agora tem pelo menos suporte parcial no IE 10 e 11 e funciona para 97% dos usuários, de acordo com o caniuse . Acho que o suporte ao navegador não é mais um argumento contra isso.
Félix Gagnon-Grenier
28

Adicione a linha display: table-cell;ao seu conteúdo CSS para essa div.

Somente as células da tabela suportam o vertical-align: middle;, mas você pode dar essa definição [célula da tabela] para a div ...

Um exemplo ao vivo está aqui: http://jsfiddle.net/tH2cc/

div{
    height: 90px;
    width: 90px;
    text-align: center;
    border: 1px solid silver;
    display: table-cell; // This says treat this element like a table cell
    vertical-align:middle; // Now we can center vertically like in a TD
}
FatherStorm
fonte
1
Isso não funciona se positionfor absoluto ou fixo. Veja: jsfiddle.net/tH2cc/1636
Aaron Mason
16

Eu sempre uso o seguinte CSS para um contêiner, para centralizar seu conteúdo horizontalmente e verticalmente.

display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

Veja em ação aqui: https://jsfiddle.net/yp1gusn7/

Kent Munthe Caspersen
fonte
3
^ Por que os padrões são importantes
Florian Wendelborn
16

Você pode tentar um código muito fácil para isso:

  display: flex;
  align-items: center;
  justify-content: center;

.box{
  height: 90px;
  width: 90px;
  background: green;
  display: flex;
  align-items: center;
  justify-content: center;
}
<div class="box">
  Lorem
</div>

Link do Codepen: http://codepen.io/santoshkhalse/pen/xRmZwr

Santosh Khalse
fonte
Funciona mesmo para texto em várias linhas, +1!
Jeroen Bellemans
16

Atribua esta classe CSS ao <div> direcionado:

.centered {
  width: 150px;
  height: 150px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  background: red; /* Not necessary just to see the result clearly */
}
<div class="centered">This text is centered horizontally and vertically</div>

Aminu Kano
fonte
2
Você realmente precisa, e css grid também :) Eu recomendo este currículo .
Aminu Kano
9

Você pode usar a flexpropriedade no pai div e adicionar a margin:autopropriedade aos itens filhos:

.parent {
    display: flex;
    /* You can change this to `row` if you want the items side by side instead of stacked */
    flex-direction: column;
}

/* Change the `p` tag to what your items child items are */
.parent p {
    margin: auto;
}

Você pode ver mais opções flexaqui: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

user3021146
fonte
8

Abordagem 1

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>

Abordagem 2

div {
  height: 200px;
  line-height: 200px;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Haec et tu ita posuisti, et verba vestra sunt. Non enim iam stirpis bonum quaeret, sed animalis. </span>
</div>

Abordagem 3

div {
  display: table;
  height: 100px;
  width: 100%;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: table-cell;
  vertical-align: middle;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>

shubham agrawal
fonte
4
<div class="small-container">
    <span>Text centered</span>
</div>

<style>
.small-container {
    width:250px;
    height:250px;
    border:1px green solid;
    text-align:center;
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
.small-container span{
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
</style>
Arunkumar Maha
fonte
4
# Parent
{
  display:table;
}

# Child
{
  display: table-cell;
  width: 100%; // As large as its parent to center the text horizontally
  text-align: center;
  vertical-align: middle; // Vertically align this element on its parent
}
Narcisse Doudieu Siewe
fonte
6
Quão exatamente isso é diferente das outras respostas postadas?
Josh Crozier
3

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>

Debasis Paul Official
fonte
3
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código.
Sudheesh Singanamalla
1

.cell-row {display: table; width: 100%; height: 100px; background-color: lightgrey; text-align: center}
.cell {display: table-cell}
.cell-middle {vertical-align: middle}
<div class="cell-row">
  <div class="cell cell-middle">Center</div>
</div>

antelove
fonte
1

Isso funciona para mim (testado OK!):

HTML:

<div class="mydiv">
    <p>Item to be centered!</p>
</div>

CSS:

.mydiv {
    height: 100%; /* Or other */
    position: relative;
}

.mydiv p {
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%); /* To compensate own width and height */
}

Você pode escolher outros valores além de 50%. Por exemplo, 25% para centrar em 25% do pai.

XPloRR
fonte
1
<!DOCTYPE html>
<html>
  <head>
    <style>
      .maindiv {
        height: 450px;
        background: #f8f8f8;
        display: -webkit-flex;
        align-items: center;
        justify-content: center;
      }
      p {
        font-size: 24px;
      }
    </style>
  </head>

  <body>
    <div class="maindiv">
      <h1>Title</h1>
    </div>
  </body>
</html>
Nikit Barochiya
fonte
Por que duas respostas?
Peter Mortensen
1

Você pode tentar os seguintes métodos:

  1. Se você tiver uma única palavra ou sentença de uma linha, o código a seguir pode resolver o problema.

    Coloque um texto dentro de uma tag div e forneça um ID. Defina as seguintes propriedades para esse ID.

    id-name {
      height: 90px;
      line-height: 90px;
      text-align: center;
      border: 2px dashed red;
    }

    Nota: Verifique se a propriedade altura da linha é igual à altura da divisão.

    Imagem

    Mas, se o conteúdo tiver mais de uma única palavra ou linha, isso não funcionará. Além disso, haverá momentos em que você não poderá especificar o tamanho de uma divisão em px ou% (quando a divisão for realmente pequena e você desejar que o conteúdo esteja exatamente no meio).

  2. Para resolver esse problema, podemos tentar a seguinte combinação de propriedades.

    id-name {
      display: flex;
      justify-content: center;
      align-items: center;
      border: 2px dashed red;
    }

    Imagem

    Essas três linhas de código definem o conteúdo exatamente no meio de uma divisão (independentemente do tamanho da exibição). O "align-items: center" ajuda na centralização vertical, enquanto o "justify-content: center" o centraliza horizontalmente.

    Nota: O Flex não funciona em todos os navegadores. Adicione prefixos de fornecedor apropriados para suporte adicional ao navegador.

Clinton Roy
fonte
A opção 2 funcionou bem para mim. Obrigado!
anacron
1

REDE

.center {
    display: grid;
    justify-items: center;
    align-items: center;
}

Kamil Kiełczewski
fonte
0

Ajustando a altura da linha para obter o alinhamento vertical.

line-height: 90px;
Abhay
fonte
3
Não vai downvote porque pode ser uma solução, no entanto, isso só funciona se você pode garantir texto de linha única ...
dooleyo
0

Essa deve ser a resposta certa. Mais limpo e simples:

.element {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}
Mike Barwick
fonte
0

Aplicar estilo:

position: absolute;
top: 50%;
left: 0;
right: 0;

Seu texto seria centralizado, independentemente do tamanho.

techloris_109
fonte
0

Isso funcionou para mim:

.center-stuff{
    text-align: center;
    vertical-align: middle;
    line-height: 230px; /* This should be the div height */
}
Ger Mc
fonte
0

Para mim, essa foi a melhor solução:

HTML:

 <div id="outer">  
     <img src="logo.png">
 </div>

CSS:

#outer {
  position: fixed;
  top: 50%;
  left: 50%;
  /* bring your own prefixes */
  transform: translate(-50%, -50%);
}
Bence Végert
fonte
-1
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <div style ="text-align: center;">Center horizontal text</div>
        <div style ="position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);">Center vertical text</div>
    </body>
</html> 

fonte
1
Este é um bom código limpo. No entanto, você pode adicionar ID às suas tags div, para poder usá-las posteriormente, se necessário.
Amir Md Amiruzzaman
Obrigado pela sua sugestão. Sim, concordo que o ID seja útil para manipular.
2
você leu respostas anteriores? você pode dizer o que essa resposta adiciona às anteriores?
Temani Afif 07/07
1
@AmirMdAmiruzzaman, você pode nos dizer qual é a parte mais limpa deste código :) ... Eu vejo estilos em linha que não são bons ... também adicionar ID também não é uma boa ideia, precisamos de Classes
Temani Afif
1
Duplicar de Abordagem 1 da resposta de Josh
Munim Munna
-1

Código realmente simples que funciona para mim! Apenas uma linha e seu texto serão centralizados horizontalmente.

.center-horizontally{
  justify-content: center;
}

<Card.Footer className="card-body-padding center-horizontally">
  <label className="support-expand-text-light">Call or email Customer Support to change</label>
</Card.Footer>

A saída é assim:

Por favor vote nesta resposta se ela funcionar apenas para poupar algum tempo dos desenvolvedores procurando soluções fáceis. Obrigado! :)

Jeanne vie
fonte
-2

Tente o seguinte exemplo. Adicionei exemplos para cada categoria: horizontal e vertical

<!DOCTYPE html>
<html>
    <head>
        <style>
            #horizontal
            {
                text-align: center;
            }
            #vertical
            {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translateX(-50%) translateY(-50%);
            }
         </style>
    </head>
    <body>
         <div id ="horizontal">Center horizontal text</div>
         <div id ="vertical">Center vertical text</div>
    </body>
</html> 
Amir Md Amiruzzaman
fonte
1
a questão é de cerca de centragem horizontalmente e verticalmente, também esta solução já é fornecida antes
temanitas Afif