DEV Community

Cover image for Aprenda a utilizar o Flexbox para criar layouts flexíveis
Lorena
Lorena

Posted on

8 2

Aprenda a utilizar o Flexbox para criar layouts flexíveis

O Flexbox é uma técnica de posicionamento de elementos HTML que permite criar layouts flexíveis e responsivos. Com o Flexbox, você pode facilmente organizar e alinhar elementos na página, tornando o design mais dinâmico.

Neste artigo, vamos explorar os principais conceitos do Flexbox e fornecer exemplos práticos para ajudar você a entender como utilizá-lo.

desenho em gif de garota sentada em uma cadeira com um notebook no colo

Display:flex

Antes de começar a utilizar o Flexbox, é importante definir o contêiner pai como um elemento flexível. Isso é feito definindo a propriedade CSS display com o valor flex no contêiner pai. Veja o exemplo abaixo:

<style>
  .container {
    display: flex;
  }
</style>

<div class="container">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
</div>
Enter fullscreen mode Exit fullscreen mode

Flex-direction

A propriedade flex-direction define a direção do eixo principal do contêiner flexível. Ela pode ter quatro valores possíveis: row, row-reverse, column e column-reverse. O valor padrão é row. Veja os exemplos:

<style>
  .container {
    display: flex;
    flex-direction: row; /* Valor padrão */
  }

  .container-reverse {
    display: flex;
    flex-direction: row-reverse;
  }

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

  .container-column-reverse {
    display: flex;
    flex-direction: column-reverse;
  }
</style>

<div class="container">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
</div>

<div class="container-reverse">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
</div>

<div class="container-column">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
</div>

<div class="container-column-reverse">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
</div>

Enter fullscreen mode Exit fullscreen mode

Justify-content e align-items

As propriedades justify-content e align-items são utilizadas para alinhar os elementos no eixo principal e no eixo transversal, respectivamente. Elas podem receber valores como flex-start, flex-end, center, space-between, space-around e stretch. Veja o exemplo a seguir:

<style>
  .container {
    display: flex;
    justify-content: center; /* Alinhamento horizontal */
    align-items: center; /* Alinhamento vertical */
    height: 300px;
  }
</style>

<div class="container">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
</div>

Enter fullscreen mode Exit fullscreen mode

Flex-wrap e align-content

A propriedade flex-wrap controla a quebra automática dos elementos quando o espaço disponível é insuficiente. Ela pode receber os

valores nowrap, wrap e wrap-reverse. Já a propriedade align-content é usada para alinhar as linhas de elementos em contêineres de várias linhas. Ela aceita os mesmos valores que justify-content. Veja o exemplo abaixo:

<style>
  .container {
    display: flex;
    flex-wrap: wrap; /* Quebra os elementos em várias linhas */
    align-content: center; /* Alinha as linhas no centro */
    height: 300px;
  }
</style>

<div class="container">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
  <div>Elemento 3</div>
  <div>Elemento 4</div>
  <div>Elemento 5</div>
  <div>Elemento 6</div>
</div>

Enter fullscreen mode Exit fullscreen mode

Flex-grow, flex-shrink e flex-basis

As propriedades flex-grow, flex-shrink e flex-basis são utilizadas para controlar o tamanho e o comportamento de crescimento e encolhimento dos elementos flexíveis. O flex-grow define a proporção em que os elementos devem crescer em relação aos outros elementos. O flex-shrink define a proporção em que eles devem encolher. Já o flex-basis define o tamanho inicial dos elementos. Veja o exemplo abaixo:

<style>
  .container {
    display: flex;
    height: 200px;
  }

  .item {
    flex-grow: 1; /* Todos os itens crescem igualmente */
    flex-shrink: 0; /* Os itens não encolhem */
    flex-basis: 0; /* Tamanho inicial igual para todos */
  }

  .item:last-child {
    flex-grow: 2; /* O último item cresce em dobro em relação aos outros */
  }
</style>

<div class="container">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>

Enter fullscreen mode Exit fullscreen mode

Mais exemplos para te ajudar a fixar:

Vamos começar com um exemplo muito simples, resolvendo um problema quase diário: o alinhamento perfeito no centro. Com o flexbox é bem simples:

.pai {
display: flex;
height: 300px; /* ou o valor que você desejar */
}

.filho {
width: 100px; /* ou o valor que você desejar */
height: 100px; /* ou o valor que você desejar */
margin: auto; 
}
Enter fullscreen mode Exit fullscreen mode

Definir uma margem como auto fará com que o item fique perfeitamente centrado nos dois eixos.

Agora vamos explorar algumas propriedades extras. Imagine uma lista com 6 itens, cada um com um tamanho fixo, mas que podem se ajustar automaticamente. O objetivo é distribuí-los de forma equilibrada ao longo do eixo horizontal, para que, ao redimensionar a janela do navegador, tudo se adapte perfeitamente sem precisar usar media queries:

.container-flex {
  /* Primeiro precisamos criar um layout flexível */
  display: flex;

  /* Em seguida, definimos a direção do fluxo
e se permitimos que os itens quebrem linha */
  flex-flow: row wrap;
  /* Por fim definimos como o espaço restante é distribuído */
  justify-content: space-around;
}
Enter fullscreen mode Exit fullscreen mode

Prontinho! Aqui você pode ver um exemplo usando esse código no Codepen, o resto do código é apenas estilização.

Vamos fazer diferente agora. Imagine que temos um elemento de navegação alinhado à direita no topo do nosso site, mas queremos que ele esteja centralizado em telas de tamanho médio e em uma única coluna em dispositivos pequenos.

Fazemos algo assim:

/* Telas grandes */
.navegacao {
  display: flex;
  flex-flow: row wrap;
  /* Isso alinha os itens à linha final no eixo principal */
  justify-content: flex-end;
}

/* Telas médias */
@media all and (max-width: 800px) {
  .navegacao {
    /* Em telas de tamanho médio, centralizamos distribuindo igualmente o espaço vazio ao redor dos itens */
    justify-content: space-around;
  }
}

/* Telas pequenas */
@media all and (max-width: 500px) {
  .navegacao {
    /* Em telas pequenas, não estamos mais usando a direção de linha, mas sim coluna */
    flex-direction: column;
  }
}
Enter fullscreen mode Exit fullscreen mode

Aqui você pode ver um exemplo usando esse código no Codepen com o resto dos estilos aplicados.

Podemos brincar mais ainda com a flexibilidade dos itens. Vamos lá?

Faremos um layout de 3 colunas para dispositivos móveis, com cabeçalho e rodapé ocupando toda a largura.

.container {
  display: flex;
  flex-flow: row wrap;
}

/* Setamos para que todos os itens tenham largura de 100%, usando flex-basis. 

O seletor `> *` seleciona todos os elementos filhos diretos do elemento "wrapper". */

.container > * {
  flex: 1 100%;
}

/* Dependemos da ordem original para uma abordagem mobile-first
 * Sendo assim:
 * 1. cabeçalho
 * 2. artigo
 * 3. sidebar 1
 * 4. sidebar 2
 * 5. rodapé
 */

/* Telas médias */
@media all and (min-width: 600px) {
  /* Setamos que as duas barras laterais compartilhem uma linha */
  .sidebar { flex: 1 auto; }
}

/* Telas grandes */
@media all and (min-width: 800px) {
  /* Invertemos a ordem da primeira barra lateral e do conteúdo principal e dizemos que o elemento principal deve ocupar o dobro da largura das outras duas barras laterais */
  .main { flex: 3 0px; }
  .sidebar-1 { order: 1; }
  .main    { order: 2; }
  .sidebar-2 { order: 3; }
  .footer  { order: 4; }
}
Enter fullscreen mode Exit fullscreen mode

Aqui você pode ver um exemplo usando esse código no Codepen, com o resto dos estilos aplicados.

Espero que este artigo tenha ajudado você a compreender o uso do Flexbox. Com esses exemplos e conceitos, você poderá criar layouts flexíveis e responsivos em suas páginas web.

Experimente e divirta-se explorando as possibilidades do Flexbox e se quiser compartilhar o que fez sinta-se livre. 🙂

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

Top comments (3)

Collapse
 
miiluke profile image
lucas

Muito bom!!!!!

Collapse
 
slowle profile image
Gui Reinaldo

amei!! 💕

Collapse
 
user_1e799f797f profile image
user_1e799f797f

demais!! ❤️

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

AWS GenAI LIVE!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️