Exercícios Flexbox
Galeria de fotos
Existem diferentes formas de resolver o exercício, vamos ver duas diferentes formas. A primeira forma consiste na utilização da propriedade flex-wrap.
Você vai criar o seu documento HTML com as 9 imagens e atribuir um container para elas destacado abaixo.
<div class="galeria">
<img src="https://picsum.photos/id/237/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/238/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/230/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/231/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/232/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/233/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/234/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/235/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/236/300/200" alt="imagem aleatoria">
</div>A URL utilizada possui o seguinte formato
https://picsum.photos/id/{1}/{2}/{3}, na qual, o valor{1}corresponde a um ID da imagem (com isso você consegue pegar imagens diferentes). Em{2}a largura da imagem e{3}a altura da imagem.
Para posicionar as imagens devemos fazer a utilização do flexbox com a propriedade display: flex no container. Faça essa modificação e você vai perceber que as imagens vão ficar todas um ao lado da outra em uma mesma linha, o que não é suficiente para solucionar o problema. Para resolver precisaremos adicionar mais propriedades, que serão detalhadas logo a seguir.
.galeria {
display: flex;
flex-wrap: wrap;
gap:30px;
width: 984px;
}
.galeria img {
border: solid 4px #000;
}display: flex: permite a utilização do flexbox;flex-wrap: faz com que o flexbox permita aos elementos se posicionarem em mais de uma linha ou em outras palavras, permite a geração de quebra de linha, fazendo com que os elementos fiquem em linhas separadas caso não caibam em seu container;gap: 30px: gera um espaço de30pxentre os elementos, tanto na horizontal como na vertical;width: 984px: limita o espaço total do container para que a disposição dos elementos possam se dar de 3 em 3.
Veja que cada imagem tem uma largura de
300pxcom uma borda de4pxde cada lado e os elementos tem um espaçamento de30pxentre eles. Logo a largura total de cada imagem é de4px (borda esquerda) + 300px + 4px (borda direita)que é308px, esse valor multiplicado por três imagens da um total de924pxmais o espaçamento entre as imagens que é de30pxmultiplicado por 2 vezes que é utilizado da60px. No total temos os924pxdas imagens mais os60pxde espaço, resultado em984pxno total da largura do container.
A segunda forma é separando os elementos cada um em sua linha.
<div class="galeria">
<div class="linha">
<img src="https://picsum.photos/id/237/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/238/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/230/300/200" alt="imagem aleatoria">
</div>
<div class="linha">
<img src="https://picsum.photos/id/231/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/232/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/233/300/200" alt="imagem aleatoria">
</div>
<div class="linha">
<img src="https://picsum.photos/id/234/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/235/300/200" alt="imagem aleatoria">
<img src="https://picsum.photos/id/236/300/200" alt="imagem aleatoria">
</div>
</div>E no CSS:
.linha {
display: flex;
gap:30px;
margin-bottom: 30px;
}
.galeria img {
border: solid 4px #000;
}Perceba que agora não utilizamos a propriedade flex-wrap, por outro lado como os elementos estão separados cada um em sua linha precisamos de uma margin-bottom pra conseguir espaçar essas linhas entre si.
Cards
O desafio desse exercício encontra-se na construção do elemento que chamamos de cartão card. A organização dos diversos cards é a mesma do exercício da galeria, então vamos nos concentrar em criar o cartão.
<div class="galeria">
<div class="card">
<img src="https://picsum.photos/id/1/200/150" alt="imagem aleatoria">
<div class="text">
<h2>Lorem ipsum dolor</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Suscipit ipsa debitis natus tenetur quas.</p>
<a href="#">Veja mais...</a>
</div>
</div>
</div>A parte mais importante é a criação do container para englobar os elementos h2, p, e a que formam a parte inferior do card. Isso é necessário pois precisamos de um espaçamento interno de todos eles para chegar ao efeito desejado. Nesse exemplo foi utilizado o elemento a para representar o botão, mas poderia ser outro elemento como o próprio button.
.card {
width: 200px;
height: 400px;
box-shadow: 2px 2px 8px #9d9d9d;
}
.card .text {
padding: 15px;
}
.text h2 {
margin: 0;
}
.text a {
background-color: #9d9d9d;
padding: 10px;
display: block;
text-decoration: none;
color: white;
text-align: center;
}
No CSS temos vários trechos importantes. Começando o elemento card temos a propriedade box-shadow na linha 4 para criar uma sombra na caixa. Ela tem a mesma sintaxe (forma de escrever) da propriedade text-shadow. Ainda no card apenas temos uma largura e altura definidos para cada um deles.
Em seguida, temos na linha 115 um espaçamento interno (padding) no container text. Com ele conseguimos diminuir o espaçamento de todos os elementos dentro dele para conseguir o efeito da imagem ocupar todo o espaço e os demais elementos possuirem esse espaçamento.
Na linha 119 temos a propriedade margin: 0 sendo aplicada ao elemento h2. Isso se faz necessário porque por padrão o navegador vai aplicar algumas propriedades aos elementos comuns, no caso o h2 já possui uma margem, que faz com ele empurre o elemento mais pra baixo do que estamos precisando.
Por fim, na linha 125, temos a propriedade display: block sendo aplicada ao elemento a. Isso é feito porque por padrão o elemento vai ter a propriedade display: inline, isso faz com que o elemento ocupe somente seu espaço necessário na tela enquanto que a propriedade display: block vai fazer com que ele ocupe todo o espaço disponível no container a qual está inserido.