Explore as diferenças entre esses métodos modernos de layout CSS com um problema prático: alinhar colunas.

Quando se trata de layouts CSS, as duas principais ferramentas à sua disposição são Grid e Flexbox. Embora ambos sejam fantásticos na criação de layouts, eles servem a propósitos diferentes e têm pontos fortes e fracos diferentes.

Aprenda como os dois métodos de layout se comportam e quando usar um em vez do outro.

O comportamento diferente do CSS Flexbox e Grid

Para ajudar a visualizar as coisas, crie um index.html arquivo na pasta de sua preferência e cole a seguinte marcação:

html>
<htmllang="en">
<head>
<linkrel="stylesheet"href="style.css">
head>

<body>
<h1>Flexbox vs Gridh1>
<h2>Flexbox:h2>

<divclass="flex-container">
<div>Lorem.div>
<div>Lorem ipsum dolor sit amet.div>
<div>Lorem ipsum dolor sit amet consectetur.div>
<div>Lorem ipsum dolor sit.div>
<div>Lorem ipsum dolor sit amet consectetur adipisicing elit.div>
<div>Lorem ipsum dolor sit amet.div>
<div>Lorem ipsum dolor sit amet consectetur.div>
<div>Lorem ipsum dolor sit.div>
div>

<h2>Grid:h2>

instagram viewer

<divclass="grid-container">
<div>Lorem.div>
<div>Lorem ipsum dolor sit amet.div>
<div>Lorem ipsum dolor sit amet consectetur.div>
<div>Lorem ipsum dolor sit.div>
<div>Lorem ipsum dolor sit amet consectetur adipisicing elit.div>
<div>Lorem ipsum dolor sit amet.div>
<div>Lorem ipsum dolor sit amet consectetur.div>
<div>Lorem ipsum dolor sit.div>
div>
body>
html>

Ambos os divs contêm exatamente os mesmos filhos, então você pode aplicar um sistema diferente a cada um e compará-los.

Você também pode ver que o HTML importa um arquivo de folha de estilo chamado estilo.css. Crie este arquivo na mesma pasta que index.html e cole os seguintes estilos nele:

body {
padding: 30px;
}

h1 {
color: #A52A2A;
}

h2 {
font-size: large;
}

div:not([class]) {
outline: 2pxsolidblack;
padding: 0.5em;
}

Sua página deve ficar assim:

Agora, para virar o primeiro em uma coluna flexível, basta adicionar o seguinte código à sua folha de estilo:

.flex-container {
display: flex;
}

Este é o resultado:

O contêiner flexível div agora organiza seus elementos filhos em colunas. Essas colunas são flexíveis e responsivas — elas adaptam sua largura com base no espaço disponível na janela de visualização. Esse comportamento é um dos principais conceitos básicos por trás do Flexbox.

Para evitar transbordamento de colunas no contêiner flexível, você pode usar o envoltório flexível propriedade:

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

Se não houver espaço suficiente para os elementos filhos caberem em uma linha, eles serão contornados e continuarão na próxima.

Agora aplique um layout de grade ao segundo usando este CSS:

.grid-container {
display: grid;
}

Nada acontecerá apenas com a declaração acima porque o comportamento padrão do Grid cria linhas que são empilhadas umas sobre as outras.

Para mudar para uma exibição de coluna, você precisa alterar o fluxo automático de grade propriedade (que é linha por padrão):

.grid-container {
display: grid;
grid-auto-flow: column;
}

Agora aqui está o resultado:

Para especificar o número exato de colunas que você deseja em cada linha, use colunas de modelo de grade:

.grid-container {
display: grid;
grid-template-columns: repeat(5, 1fr);
}

Este valor cria cinco colunas de largura igual. Para obter um comportamento de empacotamento semelhante ao Flexbox, você pode usar propriedades responsivas como ajuste automático e mínimo máximo:

.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, min-max(300px, 1fr));
}

Freqüentemente, você ouvirá Flexbox e Grid serem chamados de unidimensionais e bidimensionais, respectivamente. Isso não é toda a verdade, porque tanto o Flexbox quanto o Grid podem fazer um sistema de layout bidimensional. Eles apenas fazem isso de maneiras diferentes, com restrições diferentes.

O mais importante é a maneira como você pode controlar o aspecto unidimensional do layout. Considere a seguinte imagem, por exemplo:

Observe quão consistente é a coluna Grid e quão desigual é cada coluna no Flexbox. Cada linha/coluna em um flex container é independente uma da outra. Portanto, alguns podem ser maiores que outros, dependendo do tamanho do conteúdo. Eles são menos parecidos com colunas e mais com blocos independentes.

A grade funciona de maneira diferente, configurando uma grade 2D com colunas bloqueadas por padrão. Uma coluna com texto curto terá o mesmo tamanho de outra com texto muito mais longo, como demonstra a imagem acima.

Em resumo, CSS Grid é um pouco mais estruturado, enquanto Flexbox é mais sistema de layout flexível e responsivo. Esses sistemas de layout alternativos têm um bom nome!

Quando usar o Flexbox

Deseja contar com o dimensionamento intrínseco de cada coluna/linha, conforme definido pelo seu conteúdo? Ou você quer ter um controle estruturado da perspectiva dos pais? Se a sua resposta for a primeira, então o Flexbox é a solução perfeita para você.

Para demonstrar isso, considere um menu de navegação horizontal. Substitua a marcação dentro do tags com isso:

<h1>Flexbox vs. Gridh1>

<headerclass="flex">
<h2>Flexboxh2>

<nav>
<ulclass="nav-list">
<li><ahref="">Homea>li>
<li><ahref="">About Usa>li>
<li><ahref="">Service Information Goes Herea>li>
<li><ahref="">Blog Contacta>li>
<li><ahref="">a>li>
ul>
nav>
header>

<headerclass="grid">
<h2>Gridh2>

<nav>
<ulclass="nav-list">
<li><ahref="">Homea>li>
<li><ahref="">About Usa>li>
<li><ahref="">Service Information Goes Herea>li>
<li><ahref="">Blog Contacta>li>
<li><ahref="">a>li>
ul>
nav>
header>

Substitua a marcação no arquivo CSS por isto:

.nav-list {
list-style: none;
margin: 0;
padding: 0;
}

header {
--border-width: 5px;
border: var(--border-width) solidblack;
margin-bottom: 30px;
}

header > *:first-child {
border: var(--border-width) solid#FFC0CB;
margin: 0;
}

li {
border: var(--border-width) solid#90EE90;
}

Aqui está o resultado:

Agora, transforme a primeira navegação em um layout flexível e a segunda em um layout de grade adicionando o seguinte CSS:

.flex.nav-list {
display: flex;
gap: 1em;
flex-wrap: wrap;
}

.grid.nav-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

Compare os resultados para ver qual foi mais adequado:

Pela imagem acima você pode ver que o Flexbox é a solução perfeita neste caso. Você tem itens que deseja colocar um ao lado do outro e manter seu tamanho intrínseco (grande ou pequeno dependendo do comprimento do texto). Com o Grid, cada célula tem uma largura fixa e não parece tão boa – pelo menos com links de texto simples.

Quando usar grade CSS

Um lugar onde o Grid realmente se destaca é quando você deseja criar um sistema rígido a partir do pai. Um exemplo é um conjunto de elementos de cartão que devem ser igualmente amplos, mesmo que contenham quantidades diferentes de conteúdo.

Substitua a marcação dentro do tags com isso:

<h1>Flexbox vs. Gridsh1>

<sectionclass="cards">
<h2>Some cardsh2>

<divclass="columns">
<articleclass="card">
<h3class="card__title">Fun Stuffh3>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit.p>

<ul>
<li>Loremli>
<li>Ipsumli>
<li>Excavateli>
ul>
article>

<articleclass="card">
<h3class="card__title">Fun Stuffh3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.p>

<ul>
<li>Loremli>
<li>Ipsumli>
<li>Excavateli>
ul>
article>

<articleclass="card">
<h3class="card__title">A Longer Title Than Othersh3>

<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Facere
excepturi sit ea dolores totam veniam qui voluptates commodi,
perferendis et!p>

<ul>
<li>Loremli>
<li>Ipsumli>
<li>Excavateli>
ul>
article>
div>
section>

Adicione este CSS:

.columns {
display: flex;
gap: 1em;
}

article {
background-color: #90EE90;
color: black;
padding: 15px;
}

ul {
background-color: white;
padding: 2px;
list-style: none;
}

Você está começando com um display Flexbox para ver sua aparência e compará-lo com o display de grade. Aqui está o resultado:

Observe como a última coluna é maior que as outras devido ao seu dimensionamento intrínseco, que é o que o Flexbox lida bem. Mas para torná-los da mesma largura usando o Flexbox, você teria que ir contra esse dimensionamento intrínseco adicionando o seguinte:

.columns > * {
flex: 1;
}

Isso funciona. Mas o Grid é mais adequado para casos como este. Basta especificar o número de colunas e pronto:

.columns {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 1em;
}

Aqui está o resultado:

Outra vantagem de usar o Grid é que o pai controla o layout dos filhos. Assim, você pode adicionar e remover elementos filhos sem se preocupar em quebrar o layout.

Então, quando você deve usar Grid ou Flexbox?

Em resumo, CSS Grid é ótimo quando você deseja um controle estruturado da perspectiva do pai, com tamanhos iguais de colunas, independentemente do tamanho de seu conteúdo individual.

Já o Flexbox é ideal quando se deseja um sistema mais flexível baseado no dimensionamento intrínseco dos elementos.