Flexbox: centralize horizontalmente e verticalmente


672

Como centralizar a div horizontalmente e verticalmente dentro do contêiner usando o flexbox. No exemplo abaixo, quero cada número abaixo um do outro (em linhas), centralizado horizontalmente.

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

http://codepen.io/anon/pen/zLxBo



No seu CSS, você tem o row{que não tem efeito nas linhas. Se você mudar para .row{o resultado, será totalmente diferente.
— 21719 Hamid Mayeli

Respostas:


753

Eu acho que você quer algo como o seguinte.

html, body {
    height: 100%;
}
body {
    margin: 0;
}
.flex-container {
    height: 100%;
    padding: 0;
    margin: 0;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    align-items: center;
    justify-content: center;
}
.row {
    width: auto;
    border: 1px solid blue;
}
.flex-item {
    background-color: tomato;
    padding: 5px;
    width: 20px;
    height: 20px;
    margin: 10px;
    line-height: 20px;
    color: white;
    font-weight: bold;
    font-size: 2em;
    text-align: center;
}
<div class="flex-container">
    <div class="row"> 
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
    </div>
</div>

Veja a demonstração em: http://jsfiddle.net/audetwebdesign/tFscL/

Seus .flex-itemelementos devem estar no nível do bloco (em divvez de span) se você quiser que a altura e o preenchimento superior / inferior funcionem corretamente.

Além disso, .rowative a largura para em autovez de 100%.

Suas .flex-containerpropriedades estão bem.

Se você deseja que o .rowser centrado verticalmente no porto vista, atribuir altura de 100% a htmle body, e também de zero as bodymargens.

Observe que .flex-containerprecisa de uma altura para ver o efeito do alinhamento vertical; caso contrário, o contêiner calcula a altura mínima necessária para incluir o conteúdo, que é menor que a altura da porta de visualização neste exemplo.

Nota de rodapé:
A flex-flow, flex-direction, flex-wrappropriedades poderia ter feito este projeto mais fácil de implementar. Eu acho que o .rowcontêiner não é necessário, a menos que você queira adicionar algum estilo ao redor dos elementos (imagem de plano de fundo, bordas e assim por diante).

Um recurso útil é: http://demo.agektmr.com/flexbox/


5
Os itens flexíveis não precisam estar no nível de bloco, a menos que o conteúdo que eles contêm exija. Além disso, você prefixou todas as propriedades de exibição, mas não prefixou nenhuma das outras propriedades do Flexbox (que têm nomes diferentes nos outros rascunhos).
— Cimmanon

1
@cimmanon Concordo com você sobre o nível de bloqueio e editei meu post de acordo. O nível do bloco não é necessário para o alinhamento, mas pode ser necessário se o usuário desejar especificar a altura e assim por diante. Tomei liberdade sobre os prefixos do navegador, apenas assumi um navegador perfeito para chegar a uma demonstração de trabalho. Obrigado novamente por seu comentário, agradeço o feedback.
— Marc Audet

1
Se transbordar, corta o topo. i.imgur.com/3dgFfQK.png Qualquer maneira de evitar isso?
— Brian Gates

1
@BrianGates Se a altura da janela é muito curta, como você deseja que os 4 elementos sejam exibidos 2x2, 1x4?
— Marc Audet


253

Como centralizar elementos verticalmente e horizontalmente no Flexbox

Abaixo estão duas soluções gerais de centralização.

Um para itens flexíveis alinhados verticalmente ( flex-direction: column) e outro para itens flexíveis alinhados horizontalmente ( flex-direction: row).

Nos dois casos, a altura dos divs centralizados pode ser variável, indefinida, desconhecida, qualquer que seja. A altura dos divs centralizados não importa.

Aqui está o HTML para ambos:

<div id="container"><!-- flex container -->

    <div class="box" id="bluebox"><!-- flex item -->
        <p>DIV #1</p>
    </div>

    <div class="box" id="redbox"><!-- flex item -->
        <p>DIV #2</p>
    </div>

</div>

CSS (excluindo estilos decorativos)

Quando os itens flexíveis são empilhados verticalmente:

#container {
    display: flex;           /* establish flex container */
    flex-direction: column;  /* make main axis vertical */
    justify-content: center; /* center items vertically, in this case */
    align-items: center;     /* center items horizontally, in this case */
    height: 300px;
}

.box {
    width: 300px;
    margin: 5px;
    text-align: center;     /* will center text in <p>, which is not a flex item */
}

insira a descrição da imagem aqui

DEMO


Quando os itens flexíveis são empilhados horizontalmente:

Ajuste a flex-directionregra do código acima.

#container {
    display: flex;
    flex-direction: row;     /* make main axis horizontal (default setting) */
    justify-content: center; /* center items horizontally, in this case */
    align-items: center;     /* center items vertically, in this case */
    height: 300px;
}

insira a descrição da imagem aqui

DEMO


Centralizando o conteúdo dos itens flex

O escopo de um contexto de formatação flexível é limitado a um relacionamento pai-filho. Descendentes de um contêiner flex além dos filhos não participam do layout flex e ignoram as propriedades flex. Essencialmente, as propriedades flexíveis não são herdáveis ​​além dos filhos.

Portanto, você sempre precisará aplicar display: flexoudisplay: inline-flex a um elemento pai para aplicar propriedades flexíveis ao filho.

Para centralizar verticalmente e / ou horizontalmente o texto ou outro conteúdo contido em um item flexível, torne o item um contêiner flexível (aninhado) e repita as regras de centralização.

.box {
    display: flex;
    justify-content: center;
    align-items: center;        /* for single line flex container */
    align-content: center;      /* for multi-line flex container */
}

Mais detalhes aqui: Como alinhar verticalmente o texto dentro de uma caixa flexível?

Como alternativa, você pode aplicar margin: autoao elemento de conteúdo do item flexível.

p { margin: auto; }

Aprenda sobre automargens flexíveis aqui: Métodos para alinhar itens flexíveis (na caixa nº 56).


Centralizando várias linhas de itens flexíveis

Quando um contêiner flexível possui várias linhas (devido ao empacotamento), a align-contentpropriedade será necessária para o alinhamento entre eixos.

Das especificações:

8.4 Embalagem Flex Lines: a align-content propriedade

A align-contentpropriedade alinha as linhas de um contêiner flexível dentro do contêiner flexível quando houver espaço extra no eixo transversal, semelhante à forma como justify-contentalinha itens individuais no eixo principal. Observe que essa propriedade não tem efeito em um contêiner flexível de linha única.

Mais detalhes aqui: Como o flex-wrap funciona com alinhar-se, alinhar itens e alinhar conteúdo?


Suporte do navegador

O Flexbox é suportado por todos os principais navegadores, exceto o IE <10 . Algumas versões recentes do navegador, como o Safari 8 e o IE10, exigem prefixos de fornecedores . Para uma maneira rápida de adicionar prefixos, use o Autoprefixer . Mais detalhes nesta resposta .


Solução de centralização para navegadores antigos

Para uma solução de centralização alternativa usando propriedades de tabela e posicionamento CSS, consulte esta resposta: https://stackoverflow.com/a/31977476/3597276


podemos fazê-lo horizontalmente à direita, esquerda e centro verticalmente?
— Kapil

2
@ kapil, ajuste a propriedade justify-content para espaçar entre ou espaçar ... jsfiddle.net/8o29y7pd/105
— Michael Benjamin

3
Esta resposta deve estar no topo. O uso do Flex deve ser a maneira preferida de fazer isso, uma vez que é bem dimensionado entre dispositivos e tela. É muito mais fácil do que usar flutuadores e gerenciar vários divs.
— SeaWarrior404

— Ou

1
Resposta perfeita, provavelmente a melhor no Google!
— JAN

43

Adicionar

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

para o elemento contêiner do que você deseja centralizar. Documentação: justificar conteúdo e alinhar itens .


3
Obrigado pela resposta sucinta. Embora toda a verborragia acima esteja correta, essas três linhas são exatamente o que cheguei aqui procurando (bem, display: inline-flexno meu caso, mas essa foi uma edição fácil).
— Jeff Ward

27

Não se esqueça de usar atributos específicos de navegadores importantes:

alinhar itens: centro; ->

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

justificar conteúdo: centro; ->

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

Você pode ler estes dois links para entender melhor o flex: http://css-tricks.com/almanac/properties/j/justify-content/ e http://ptb2.me/flexbox/

Boa sorte.


1
este é um ponto bom, para hoje (para apoiar apenas os navegadores mais recentes) você só precisa as duas últimas linhas -webkit .. para o safari e o último para todos os outros
— Pete Kozak

1
+1 porque os rascunhos de trabalho antigos de 2009 e março de 2012 ainda têm uma participação significativa dos usuários (combinados cerca de 8% de acordo com caniuse.com ).
— benebun

Flext não funciona no safari, como você pôde resolver esse problema?
— user3378649

Verifiquei a última versão do safari no Windows há muitos dias e não me lembro muito bem, mas vou verificar e direi. Apenas me diga qual versão do safari você quis dizer? e em qual sistema operacional?
— Qmaster

@ user3378649 A versão mais recente do safari pode oferecer suporte à Flex-box, consulte este link: caniuse.com/#search=flexbox
— QMaster 4/16

15

1 - Defina CSS no div pai como display: flex;

2 - Defina CSS na div pai como flex-direction: column;
Note que isso fará com que todo o conteúdo dessa div fique alinhado de cima para baixo. Isso funcionará melhor se a div pai contiver apenas o filho e nada mais.

3 - Defina CSS no div pai como justify-content: center;

Aqui está um exemplo de como o CSS será:

.parentDivClass {
  display: flex;
  flex-direction: column;
  justify-content: center;
}



8

diplay: flex;por seu contêiner e margin:auto;por seu item, funciona perfeitamente.

NOTA: Você precisa configurar o widthe heightpara ver o efeito.

#container{
  width: 100%; /*width needs to be setup*/
  height: 150px; /*height needs to be setup*/
  display: flex;
}

.item{
  margin: auto; /*These will make the item in center*/
  background-color: #CCC;
}
<div id="container">
   <div class="item">CENTER</div>
</div>


3

Se você precisar centralizar um texto em um link, isso funcionará:

div {
  display: flex;

  width: 200px;
  height: 80px;
  background-color: yellow;
}

a {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center; /* only important for multiple lines */

  padding: 0 20px;
  background-color: silver;
  border: 2px solid blue;
}
<div>
  <a href="#">text</a>
  <a href="#">text with two lines</a>
</div>


1
Doce! Às vezes, sinto que sou muito idiota pelo Flexbox.) Suponha que eu precise de mais prática, algumas de suas lógicas ainda não estão claras. Obrigado Leo!
— Zoltán

3

margin: autofunciona perfeitamente com o flexbox. Centraliza verticalmente e horizontalmente.

html, body {
  height: 100%;
  max-height: 100%;
}

.flex-container {
  display: flex;
    
  height: 100%;
  background-color: green;
}

.container {
  display: flex;
  margin: auto;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS</title>
</head>
<body>
  <div class="flex-container">
    <div class="container">
      <div class="row">
        <span class="flex-item">1</span>
      </div>
      <div class="row">
        <span class="flex-item">2</span>
      </div>
      <div class="row">
        <span class="flex-item">3</span>
      </div>
     <div class="row">
        <span class="flex-item">4</span>
    </div>
  </div>  
</div>
</body>
</html>


1

RESULTADO: Código

CÓDIGO

HTML:

<div class="flex-container">
  <div class="rows">

    <div class="row">
      <span class="flex-item">1</span>
    </div>
    <div class="row">
      <span class="flex-item">2</span>
    </div>
    <div class="row">
      <span class="flex-item">3</span>
    </div>
    <div class="row">
      <span class="flex-item">4</span>
    </div>

  </div>  
</div>

CSS:

html, body {
  height: 100%;  
}

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

.rows {
  display: flex;
  flex-direction: column;
}

onde flex-containerdiv é usado para centralizar vertical e horizontalmente sua rowsdiv, e rowsdiv é usada para agrupar seus "itens" e ordená-los em uma coluna.


0
    .flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}

Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
— Piotr Labunski 22/03

-7

Usando CSS +

<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

dê uma olhada AQUI


1
como isso é fácil e amplamente suportado por navegadores modernos com o flexbox puro, sua solução de biblioteca certamente não é necessária. Especialmente porque ele perguntou como fazê-lo usando o flex box e não uma biblioteca de css.
— Bungleofsketches
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.