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

bsr
fonte
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/

Marc Audet
fonte
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
2
A solução está aqui: stackoverflow.com/questions/24538100/…
Brian Gates
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

Michael Benjamin
fonte
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 .

ben
fonte
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.

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

MelanieP
fonte
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>

Polar
fonte
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>

Leo
fonte
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>

Aksana Tolstoguzova
fonte
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.

Wilson
fonte
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;
}
Carpiee
fonte
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

Marco Allori
fonte
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