Como centralizar um elemento horizontal e verticalmente

408

Estou tentando centralizar o conteúdo de minhas guias verticalmente, mas quando adiciono o estilo CSS display:inline-flex, o alinhamento horizontal do texto desaparece.

Como posso fazer os alinhamentos de texto xey para cada uma das minhas guias?

* { box-sizing: border-box; }
#leftFrame {
  background-color: green;
  position: absolute;
  left: 0;
  right: 60%;
  top: 0;
  bottom: 0;
}
#leftFrame #tabs {
  background-color: red;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 25%;
}
#leftFrame #tabs div {
  border: 2px solid black;
  position: static;
  float: left;
  width: 50%;
  height: 100%;
  text-align: center;
  display: inline-flex;
  align-items: center;
}
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>
  </div>
</div>

shuji
fonte
Métodos CSS Últimas usando tipo de exibição flex e CSS 2D transformar sem largura e div centro altura horizontal e verticalmente utilizando apenas métodos CSS freakyjolly.com/...
Code Spy

Respostas:

667
  • 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%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
<div class="container">
    <span>I'm vertically/horizontally centered!</span>
</div>


  • 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: -webkit-flexbox;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-align: center;
    -ms-flex-align: center;
    -webkit-align-items: center;
    align-items: center;
    justify-content: center;
}
<div class="container"> 
  <span>I'm vertically/horizontally centered!</span>
</div>


  • 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 como100% .

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

    Para centralização horizontal, você pode adicionar text-align: centerpara centralizar o texto e quaisquer outros inlineelementos filhos. Como alternativa, você pode usar margin: 0 auto, assumindo 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;
}
<section class="parent">
    <div class="child">I'm vertically/horizontally centered!</div>
</section>


  • 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;
}
<div class="container">
    <p>I'm vertically/horizontally centered!</p>
</div>


  • 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 umline-height valor no elemento filho igual à altura fixa do elemento pai.

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

.parent {
    height: 200px;
    width: 400px;
    background: lightgray;
    text-align: center;
}

.parent > .child {
    line-height: 200px;
}
<div class="parent">
    <span class="child">I'm vertically/horizontally centered!</span>
</div>

Josh Crozier
fonte
3
Sim, isso funciona. Eu já tinha usado o inline-flex no css3, então esqueci completamente de como seguir essa abordagem corretamente. Eu realmente aprecio isso, muito obrigado.
Shuji
Abri todo o exemplo "Tela cheia" acima, notei que o alinhamento vertical é sempre um pouco demais perto da parte inferior da tela (com resolução 1920x1080, o rótulo tem 20 pixels a menos na tela). Eu implementei a abordagem 2 na minha página da Web e tive o mesmo problema, mesmo que a div não seja de tela cheia. O problema é ainda pior na minha página da web. (100px muito baixo) ...
AXMIM 23/06
Você pode adicionar a Abordagem 6, usando o flexbox (funciona no IE9 +, [90% + cobertura do mercado de navegadores] (caniuse.com/#feat=flexbox)): display: flexnos pais e align-self: centernos filhos.
Dan Dascalescu
Mudei um pouco a abordagem 2: jsfiddle.net/yeaqrh48/278 . Como resultado, ao reduzir a altura da janela, o texto vai além do escopo e torna-se impossível de ver. Como resolver este problema?
Ollazarev 08/04
1
@ josh-crozier Acabei de encontrar um site com um link para o seu post no seu css xd
zoran404 14/02
31

Se CSS3 for uma opção (ou você tiver um fallback), poderá usar transform:

.center {
    right: 50%;
    bottom: 50%;
    transform: translate(50%,50%);
    position: absolute;
}

Diferente da primeira abordagem acima, você não deseja usar a esquerda: 50% com a tradução negativa porque há um bug de estouro no IE9 +. Utilize um valor certo positivo e você não verá barras de rolagem horizontais.

Mr Bullets
fonte
Eu acredito que a transformação deveria ser transform: translateX(50%) translateY(50%);. A transformação acima não está sintaticamente correta, de acordo com os documentos de transformação da Mozilla .
Eirik H
1
@EirikH Não sei ao certo o que você estava vendo, mas essa sintaxe é ótima (e diz isso nos documentos). A maioria dos transformvalores que podem assumir um valor X e Y tem uma função básica para receber ambos e funções especializadas para tirar apenas um.
21475 Scott
9

A melhor maneira de centralizar uma caixa na vertical e na horizontal é usar dois contêineres:

O recipiente externo:

  • deveria display: table;

O recipiente interno:

  • deveria display: table-cell;
  • deveria vertical-align: middle;
  • deveria text-align: center;

A caixa de conteúdo:

  • deveria display: inline-block;
  • deve ajustar o alinhamento horizontal do texto, a menos que você queira que o texto seja centralizado

Demo:

body {
    margin : 0;
}

.outer-container {
    display: table;
    width: 80%;
    height: 120px;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

Veja também este violino !

Centralizando no meio da página:

Para centralizar seu conteúdo no meio da sua página, adicione o seguinte ao seu contêiner externo:

  • position : absolute;
  • width: 100%;
  • height: 100%;

Aqui está uma demonstração para isso:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        Center this!
     </div>
   </div>
</div>

Veja também este violino !

John Slegers
fonte
7

Aqui está como usar 2 propriedades flex simples para centralizar n divs no eixo 2:

  • Defina a altura do seu contêiner: aqui o corpo está definido para ter pelo menos 100vh.
  • align-items: center centralizará verticalmente os blocos
  • justify-content: space-around distribuirá o espaço horizontal livre ao redor dos divs

body {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: space-around;
}
<div>foo</div>
<div>bar</div>

Creaforge
fonte
5

Execute esse snippet de código e veja uma div alinhada vertical e horizontalmente.

html,
body,
.container {
  height: 100%;
  width: 100%;
}
.container {
  display: flex;
  align-items: center;
  justify-content: center;
}
.mydiv {
  width: 80px;
}
<div class="container">
  <div class="mydiv">h & v aligned</div>
</div>

JFathi
fonte
3

A solução mais simples e limpa para mim é usar a propriedade CSS3 "transform":

.container {
  position: relative;
}

.container a {
  position: absolute;
  top: 50%;
  transform: translate(0,-50%);
}
<div class="container">
  <a href="#">Hello world!</a>
</div>

tocqueville
fonte
3

    .align {
        display: flex;
        width: 400px;
        height: 400px;
        border: solid 1px black;
        align-items: center;
        justify-content: space-around;
    }
    .align div:first-child {
        width: 20px;
        height: 20px;
        background-color: red;
        position: absolute; 
    }
    .align div {
        width: 20px;
        height: 20px;
        background-color: blue;
    }
    <div class='align'>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>

O primeiro filho será alinhado vertical e horizontalmente no centro

Krishna
fonte
2

centralizar o Div em uma página check the fiddle link

#vh {
    border-radius: 15px;
    box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
    padding: 25px;
    width: 200px;
    height: 200px;
    background: white;
    text-align: center;
    margin: auto;
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
}
<div id="vh">Div to be aligned vertically</div>

Atualizar Outra opção é usar a caixa flexível check the fiddle link

.vh {
    background-color: #ddd;
    height: 200px;
    align-items: center;
    display: flex;
}
.vh > div {
    width: 100%;
    text-align: center;
    vertical-align: middle;
}
<div class="vh">
    <div>Div to be aligned vertically</div>
</div>

Nerdroid
fonte
2

Abaixo está a abordagem Flex-box para obter o resultado desejado

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Flex-box approach</title>
<style>
  .tabs{
    display: -webkit-flex;
    display: flex;
    width: 500px;
    height: 250px;
    background-color: grey;
    margin: 0 auto;
    
  }
  .f{
    width: 200px;
    height: 200px;
    margin: 20px;
    background-color: yellow;
    margin: 0 auto;
    display: inline; /*for vertically aligning */
    top: 9%;         /*for vertically aligning */
    position: relative; /*for vertically aligning */
  }
</style>
</head>
<body>

    <div class="tabs">
        <div class="f">first</div>
        <div class="f">second</div>        
    </div>

</body>
</html>

Manish62
fonte
2

Outra abordagem é usar a tabela:

<div style="border:2px solid #8AC007; height:200px; width:200px;">
  <table style="width:100%; height:100%">
    <tr style="height:100%">
      <td style="height:100%; text-align:center">hello, multiple lines here, this is super long, and that is awesome, dude</td>
    </tr>
  </table>
</div>

estou vindo
fonte
2

Para centralizar vertical e horizontalmente um elemento, também podemos usar as propriedades abaixo mencionadas.

Esta propriedade CSS alinha itens verticalmente e aceita os seguintes valores:

flex-start : os itens estão alinhados com a parte superior do contêiner.

flex-end : os itens se alinham ao fundo do contêiner.

centro : os itens são alinhados no centro vertical do contêiner.

linha de base : os itens são exibidos na linha de base do contêiner.

esticar : os itens são esticados para caber no contêiner.

Esta propriedade CSS justifica o conteúdo , que alinha itens horizontalmente e aceita os seguintes valores:

flex-start : os itens estão alinhados ao lado esquerdo do contêiner.

flex-end : os itens estão alinhados ao lado direito do contêiner.

Centro : os itens são alinhados no centro do contêiner.

espaço entre : os itens são exibidos com espaçamento igual entre eles.

space-around : os itens são exibidos com espaçamento igual ao redor deles.

Divyanshu Rawat
fonte
2

Abordagem de CSS em grade

#wrapper {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(3, 1fr);
}
.main {
    background-color: #444;
}
<div id="wrapper">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box main"></div>
</div>

corashina
fonte
2

É necessário seguir a seguinte solução nova e fácil:

  .centered-class {
      align-items: center;
      display: flex;
      justify-content: center;
      width: 100vw;
      height: 100vh;
    }
<div class="centered-class">
  I'm in center vertically and horizontally.
</div>

Sahil Ralkar
fonte
1
  • Abordagem 6

/*Change units to "%", "px" or whatever*/

#wrapper{
  width: 50%;
  height: 70vh;
  background: rgba(0,0,0,.5);
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
#left{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  background: red;
}
#right{
  width: 50%;
  height: 50vh;
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  margin: auto;
  background: green;
}
.txt{
  text-align: center;
  line-height: 50vh;
}
<div id="wrapper">
   <div id="left" class="txt">Left</div>
   <div id="right" class="txt">Right</div>
</div>

    .container{ 
               width: 50%;  //Your container width here
               height: 50%; //Your container height here
               position: absolute; 
               top: 0; 
               right: 0;  
               bottom: 0; 
               left: 0; 
               margin: auto;
    }
derp
fonte
1

Basta fazer 0, superior, inferior, esquerda e direita.

<html>
<head>
<style>
<div> 
{
position: absolute;
margin: auto;
background-color: lightblue;
width: 100px;
height :100px;
padding: 25px;
top :0;
right :0;
bottom:0;
left:0;
}


</style>
</head>
<body>

<div> I am in the middle</div>

</body>
</html>
yoginder bagga
fonte
1

Você pode conseguir isso usando CSS (seu elemento display:inline-grid+ grid-auto-flow: row;) Grid e Flex Box (elemento paidisplay:flex; ),

Veja abaixo o snippet

#leftFrame {
  display: flex;
  height: 100vh;
  width: 100%;
}

#tabs {
  display: inline-grid;
  grid-auto-flow: row;
  grid-gap: 24px;
  justify-items: center;
  margin: auto;
}

html,body {
  margin:0;
  padding:0;
}
<div>
<div id=leftFrame>
  <div id=tabs>
    <div>first</div>
    <div>second</div>        
  </div>
</div>
</div>

Springer F
fonte
1

Link de origem

Método 1) Tipo de exibição flex

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

Método 2) Transformação 2D

.child-element {
   top: 50%;
   left: 50%;
   transform: translate(-50% , -50%);
   position: absolute;
}

Veja outros métodos aqui

Code Spy
fonte
1

A maneira mais fácil de centralizar uma div na vertical e na horizontal é a seguinte:

<div style="display: table; width: 200px; height: 200px; border: 1px solid black;">
    <div style="display: table-cell; vertical-align: middle; text-align: center;">
        Text Here
    </div>
</div>

Mais um exemplo :

.parent {
    display: table; 
    width: 100%; 
    height: 100%;
}

.child {
    display: table-cell; 
    vertical-align: middle;
    text-align: center;
}


<div class="parent">
    <div class="child">
        <h4><u>SERVICE IN BANGLADESH FLEET RESERVE <br> AND <br> RE-ENGAGEMENT ORDER FOR DEFENCE SERVICE</u></h4>
    </div>
</div>
Bablu Ahmed
fonte
1

Este é um problema relacionado que as pessoas podem acessar esta página ao pesquisar: Quando eu quero centralizar uma div para um gif animado "em espera .." (quadrado de 100 px) que eu uso:

  .centreDiv {
        position: absolute;
        top: calc(50vh - 50px);
        top: -moz-calc(50vh - 50px);
        top: -webkit-calc(50vh - 50px);
        left: calc(50vw - 50px);
        left: -moz-calc(50vw - 50px);
        left: -webkit-calc(50vw - 50px);
        z-index: 1000; /*whatever is required*/
    }
davaus
fonte
1

Se você preferir sem :
flexbox / grid / table
ou sem o:
vertical-align: middle

Você pode fazer:

HTML

<div class="box">
  <h2 class="box_label">square</h2>
</div>

CSS

.box {
  box-sizing: border-box;
  width: 100px;
  height: 100px;
  text-align: center;
  border: 1px solid black;
}

.box_label {
  box-sizing: border-box;
  display: inline-block;
  transform: translateY(50%);
  text-align: center;
  border: 1px solid black;
}
Eden Sharvit
fonte
0

Isso deve funcionar

.center-div {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    min-height: 100vh;
}
<div class="center-div">Center Div</div>

Shalmali Jain
fonte
0

Simples! Use flex de exibição no contêiner e margem automática no texto !!!!

#hood{

 width : 300px;
 height: 100px;
 border: solid 1px #333333;
 display: flex; 
}

#hood span{

  margin: auto
}



<html>
<head></head>
    <body>
        <div id="hood">
            <span> I Am Centered</span>
        </div>
    </body>
</html>

Demonstração: https://jsfiddle.net/ay95f08g/

Testado: Safari, Chrome, Firefox e Opera no MacOs Mojave. (última atualização em 25 de fevereiro de 2019)

Diego Favero
fonte
0

Há muitos foi fazer o mesmo. você pode usar o seguinte método para criar a div no meio da página.

.center-box {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
}
<div class="center-box">
  <h1>Text in center of page</h1>
</div>

Felicidades !

Shoyeb Memon
fonte
0

A flexboxabordagem mais simples :

A maneira mais fácil de centralizar um único elemento vertical e horizontalmente é torná-lo um item flexível e definir sua margem para auto:

Se você aplicar margens automáticas a um item flexível, esse item estenderá automaticamente sua margem especificada para ocupar o espaço extra no contêiner flexível ...

.flex-container {
  height: 150px;
  display: flex;
}

.flex-item {
  margin: auto;
}
<div class="flex-container">
  <div class="flex-item">
    This should be centered!
  </div>
</div>

Essa extensão de margens em cada direção empurrará o elemento exatamente para o meio de seu contêiner.

ajobi
fonte