Como construir um layout de site de notícias com Flexbox
Portuguese (Português) translation by Ícaro Heimig (you can also view the original English article)



Não é necessário entender todos aspectos do Flexbox antes que você possa pular e começar. Neste tutorial, vamos apresentar algumas características do Flexbox enquanto estamos criando um "layout de notícias" como o que você pode encontrar no The Guardian.
A razão para você estar usando Flexbox é que isso te dá algumas características muito poderosas:
- Nós podemos facilmente fazer colunas responsivas
- Nós podemos fazer colunas com alturas iguais
- Nós podemos puxar o conteúdo para a base(bottom) de um container
Então vamos começar!
1. Comece com duas colunas
Criar colunas no CSS tem sempre sido um desafio. Por muito tempo, as únicas opções eram usar floats ou tables, mas ambos tinham seus próprios problemas.
Flexbox torna o processo mais simples, nos dando:
- código limpo: nós só vamos precisar de um container com
display: flex - Não há necessidade de limpar os floates, impedindo comportamentos de layout inesperados
- markup semântico
- flexibilidade: nós podemos redimensionar, esticar, alinhar as colunas com poucas linhas de CSS
Vamos começar fazendo duas colunas; uma que tenha 2/3 da largura do nosso container e, outra, que tenha 1/3.
1 |
<div class="columns"> |
2 |
<div class="column main-column"> |
3 |
2/3 column |
4 |
</div>
|
5 |
<div class="column"> |
6 |
1/3 column |
7 |
</div>
|
8 |
</div>
|
Existem dois elementos aqui:
- o container
columns - dois
columnfilhos, um com uma classe adicional demain-columnque nós vamos usar para torná-la mais larga
1 |
.columns { |
2 |
display: flex; |
3 |
}
|
4 |
|
5 |
.column { |
6 |
flex: 1; |
7 |
}
|
8 |
|
9 |
.main-column { |
10 |
flex: 2; |
11 |
}
|
Como a coluna principal tem como valor flex de 2, ela vai assumir duas vezes mais espaço que a outra coluna.
Adicionando alguns estilos visuais extras, eis o que temos:
2. Tornar cada coluna um container Flexbox
Cada uma dessas duas colunas vão conter diversos artigos empilhados verticalmente, então nós vamos transformar os elementos column em containers Flexbox também. Nós queremos:
- que os artigos sejam empilhados verticalmente
- que os artigos estiquem e preencham o espaço disponível
1 |
.column { |
2 |
display: flex; |
3 |
flex-direction: column; /* Makes the articles stacked vertically */ |
4 |
}
|
5 |
|
6 |
.article { |
7 |
flex: 1; /* Stretches the articles to fill up the remaining space */ |
8 |
}
|
A regra flex-direction: column no container, combinados com a regra flex:1 nos filhos garantem que os artigos(articles) vão preencher todo espaço vertical, mantendo as nossas duas primeiras colunas com a mesma altura.
3. Fazer de cada aticle um container Flexbox
Agora, para nos dar um controle extra, vamos transformar cada artigo em um container Flexbox também. Cada um deles vai conter:
- um título
- um parágrafo
- uma barra de informações com o autor e o número de comentários
- uma imagem responsiva opcional
Nós estamos usando Flexbox aqui para "puxar" a barra de informações para a base do container. Como um lembrete, esse é o layout do artigo que estamos almejando:



Aqui está o código:
1 |
<a class="article first-article"> |
2 |
<figure class="article-image"> |
3 |
<img src=""> |
4 |
</figure>
|
5 |
<div class="article-body"> |
6 |
<h2 class="article-title"> |
7 |
<!-- title -->
|
8 |
</h2>
|
9 |
<p class="article-content"> |
10 |
<!-- content -->
|
11 |
</p>
|
12 |
<footer class="article-info"> |
13 |
<!-- information -->
|
14 |
</footer>
|
15 |
</div>
|
16 |
</a>
|
1 |
.article { |
2 |
display: flex; |
3 |
flex-direction: column; |
4 |
}
|
5 |
|
6 |
.article-body { |
7 |
display: flex; |
8 |
flex: 1; |
9 |
flex-direction: column; |
10 |
}
|
11 |
|
12 |
.article-content { |
13 |
flex: 1; /* This will make the content fill up the remaining space, and thus push the information bar at the bottom */ |
14 |
}
|
Os elementos articles são dispostos verticalmente graças a regra flex-direction: column;.
Nós aplicamos flex: 1 para o elemento article-content então ele preenche o espaço vazio, e "puxa" o article-info para a base, não importa a altura das colunas.
4. Adicionar algumas colunas aninhadas
Na coluna da esquerda, o que nós realmente queremos é outro conjunto de colunas. Então nós vamos trocar o segundo article com o mesmo container columns que nós já usamos
1 |
<div class="columns"> |
2 |
<div class="column nested-column"> |
3 |
<a class="article"> |
4 |
<!-- Article content -->
|
5 |
</a>
|
6 |
</div>
|
7 |
|
8 |
<div class="column"> |
9 |
<a class="article"> |
10 |
<!-- Article content -->
|
11 |
</a>
|
12 |
<a class="article"> |
13 |
<!-- Article content -->
|
14 |
</a>
|
15 |
<a class="article"> |
16 |
<!-- Article content -->
|
17 |
</a>
|
18 |
</div>
|
19 |
</div>
|
Como queremos que a primeira coluna aninhada seja mais ampla, estamos adicionando uma classe nested-column com o estilo adicional:
1 |
.nested-column { |
2 |
flex: 2; |
3 |
}
|
Isso vai fazer nossa nova coluna duas vezes mais larga que as outras.
5. Dar ao primeiro article um layout horizontal
Esse primeiro article é bem grande. Para otimizar o uso do espaço, vamos trocar o seu layout para ser horizontal.
1 |
.first-article { |
2 |
flex-direction: row; |
3 |
}
|
4 |
|
5 |
.first-article .article-body { |
6 |
flex: 1; |
7 |
}
|
8 |
|
9 |
.first-article .article-image { |
10 |
height: 300px; |
11 |
order: 2; |
12 |
padding-top: 0; |
13 |
width: 400px; |
14 |
}
|
A propriedade order é muito útil aqui, já que ela nos permite alterar a ordem dos elementos HTML sem afetar o markup HTML. O article-image na verdade vem antes do article-body na marcação, mas ele se comportará como se viesse depois.
6. Tornar o layout responsivo
Isso tudo está aparecendo como nós queremos, embora esteja um pouco esmagado. Vamos consertar isso transformando em responsivo.
Uma das grandes características do Flexbox é que você precisa apenas remover a regra display:flex no container para desabilitar o Flexbox completamente, enquanto todas as outras propriedades do Flexbox (como align-items ou flex) continuam válidas.
Como resultado, você pode acionar um layout "responsivo", habilitando Flexbox somente acima de um certo breakpoint.
Nós vamos remover o display:flex de ambos seletores .columns e .column ao invés de colocar dentro de uma media query:
1 |
@media screen and (min-width: 800px) { |
2 |
.columns, |
3 |
.column { |
4 |
display: flex; |
5 |
}
|
6 |
}
|
É isso! Em telas menores, todos os articles vão estar no topo um do outro. Acima de 800px, eles vão se dispor em duas colunas.
7. Adicionar toques finais
Para tornar o layout mais atraente em telas maiores, vamos fazer alguns ajustes no CSS:
1 |
@media screen and (min-width: 1000px) { |
2 |
.first-article { |
3 |
flex-direction: row; |
4 |
}
|
5 |
|
6 |
.first-article .article-body { |
7 |
flex: 1; |
8 |
}
|
9 |
|
10 |
.first-article .article-image { |
11 |
height: 300px; |
12 |
order: 2; |
13 |
padding-top: 0; |
14 |
width: 400px; |
15 |
}
|
16 |
|
17 |
.main-column { |
18 |
flex: 3; |
19 |
}
|
20 |
|
21 |
.nested-column { |
22 |
flex: 2; |
23 |
}
|
24 |
}
|
O primeiro artigo tem seu conteúdo disposto horizontalmente, com o texto à esquerda e a imagem à direita. E também, a coluna principal agora é mais larga(75%) e a coluna aninhada também (66%). Aqui está o resultado final!
Conclusão
Eu espero que eu tenha mostrado que você não precisa entender cada um dos aspectos do Flexbox para se jogar e começar a usá-lo! Esse layout de notícias responsivo é um padrão realmente útil; brinque com ele, deixe-nos saber como você chegou lá!



