Como criar uma galeria em mosaico com CSS sem Javascript e responsivo
Oi eu sou o Felipe! Sou artista digital. Nesse blog falo sobre o que gosto e o que me inspira. Compartilho curiosidades sobre o mundo geek, tutoriais e muito mais.
Neste tutorial irei ensinar como criar uma galeria de fotos em mosaico assimétrico utilizando apenas CSS sem javascript e ainda sendo responsivo. Sim é possível e é mais simples do que você pensa.
É muito comum encontrarmos diversas soluções de mosaico utilizando Javascript e libs prontas, Masonry é uma das mais conhecidas. Mas no CSS é possível fazer muita coisa de forma mais leve e de forma criativa chegar a resultados bem parecidos ou até melhores. Com CSS puro acabamos carregando menos código e tendo um site mais leve e rápido. Então vamos lá?
Veja o resultado e o código no JSFiddle
Estude e desenvolva seu HTML e CSS
Crie uma página em HTML básica
Utilize o seu editor para criar uma página simples é a partir dela que vamos construir nossa galeria de imagens mosaico.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="Boomo - Felipe Moreira">
<meta name="description" content="Tutorial Mosaico. Boomo - por Felipe Moreira">
<link rel="shortcut icon" href="favicon.ico">
<title>Tutorial Mosaico. Boomo - por Felipe Moreira</title>
</head>
<body>
</body>
</html>
Adicione a DIV que será o nosso container de imagens
No código abaixo nós criamos uma <div> com o id grid, e dentro dela colocamos diversas imagens <img> apenas com o src para imagem, repare que algumas imagens possuem a classe span-2 que falaremos mais tarde nesse tutorial. Adicione esse código dentro do body na página criada na etapa anterior.
<div id="grid">
<img src="https://boomo.com.br/images/noticias/operacao-big-hero-png-c799.png">
<img src="https://boomo.com.br/images/noticias/peanuts-png-c977.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-funko-pop-jpg-c163.jpg">
<img src="https://boomo.com.br/images/noticias/angry-birds-png-c939.png">
<img src="https://boomo.com.br/images/noticias/como-treinar-o-seu-dragao-png-c348.png">
<img src="https://boomo.com.br/images/noticias/detona-ralph-png-c286.png">
<img src="https://boomo.com.br/images/noticias/divertidamente-png-c684.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-funko-pop-2-jpg-c571.jpg">
<img src="https://boomo.com.br/images/noticias/familia-futuro-png-c618.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/seto-kaiba-yu-gi-oh-funko-pop-boneco-jpg-c119.jpg">
<img src="https://boomo.com.br/images/noticias/frozen-png-c476.png">
<img src="https://boomo.com.br/images/noticias/meu-malvado-favorito-png-c518.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-10-png-c992.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-rasengan-funko-pop-jpg-c879.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-8-png-c764.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-9-png-c437.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-1-png-c901.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/joey-wheeler-yu-gi-oh-funko-pop-boneco-jpg-c328.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-2-png-c539.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/dragao-branco-de-olhos-azuis-yu-gi-oh-funko-pop-boneco-jpg-c914.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-3-png-c209.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-4-png-c457.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-sexy-no-jutsu-funko-pop-jpg-c248.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-5-png-c577.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/pegasus-yu-gi-oh-funko-pop-boneco-jpg-c256.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-6-png-c801.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-7-png-c637.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/exodia-yu-gi-oh-funko-pop-boneco-jpg-c686.jpg">
<img src="https://boomo.com.br/images/noticias/mago-negro-yu-gi-oh-funko-pop-boneco-jpg-c600.jpg">
</div>
Código HTML completo
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="Boomo - Felipe Moreira">
<meta name="description" content="Tutorial Mosaico. Boomo - por Felipe Moreira">
<link rel="shortcut icon" href="favicon.ico">
<title>Tutorial Mosaico. Boomo - por Felipe Moreira</title>
</head> <body>
<div id="grid">
<img src="https://boomo.com.br/images/noticias/operacao-big-hero-png-c799.png">
<img src="https://boomo.com.br/images/noticias/peanuts-png-c977.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-funko-pop-jpg-c163.jpg">
<img src="https://boomo.com.br/images/noticias/angry-birds-png-c939.png">
<img src="https://boomo.com.br/images/noticias/como-treinar-o-seu-dragao-png-c348.png">
<img src="https://boomo.com.br/images/noticias/detona-ralph-png-c286.png">
<img src="https://boomo.com.br/images/noticias/divertidamente-png-c684.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-funko-pop-2-jpg-c571.jpg">
<img src="https://boomo.com.br/images/noticias/familia-futuro-png-c618.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/seto-kaiba-yu-gi-oh-funko-pop-boneco-jpg-c119.jpg">
<img src="https://boomo.com.br/images/noticias/frozen-png-c476.png">
<img src="https://boomo.com.br/images/noticias/meu-malvado-favorito-png-c518.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-10-png-c992.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-rasengan-funko-pop-jpg-c879.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-8-png-c764.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-9-png-c437.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-1-png-c901.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/joey-wheeler-yu-gi-oh-funko-pop-boneco-jpg-c328.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-2-png-c539.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/dragao-branco-de-olhos-azuis-yu-gi-oh-funko-pop-boneco-jpg-c914.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-3-png-c209.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-4-png-c457.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-sexy-no-jutsu-funko-pop-jpg-c248.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-5-png-c577.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/pegasus-yu-gi-oh-funko-pop-boneco-jpg-c256.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-6-png-c801.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-7-png-c637.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/exodia-yu-gi-oh-funko-pop-boneco-jpg-c686.jpg">
<img src="https://boomo.com.br/images/noticias/mago-negro-yu-gi-oh-funko-pop-boneco-jpg-c600.jpg">
</div>
</body>
</html>
Dando vida ao mosaico com o CSS
Agora vamos dar iníco a criação do arquivo em CSS, você pode fazer da maneira que preferir adicionando um arquivo separado no head ou criando a tag <style> dentro do mesmo arquivo, aqui vamos usar a tag <style> para simplificar.
Começamos adicionando um pequeno código só para tirar as margens e mudar a cor do fundo do documento. Isso não afeta em nada nosso mosaico.
html,body{
margin: 0;
padding: 0;
background: #000
}
CSS do Container principal
Nossa div que é o container de nossas imagens tem o id grid e vamos utilizar ele no css para definir os estilos do container. Nós utilizaremos o grid layout para fazer nosso mosaico.
#grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
grid-auto-rows: minmax(250px, auto);
grid-auto-flow: dense;
grid-column-gap: .5em;
grid-row-gap: .5em;
margin: 20px 0 0 0;
}
Então definimos o display como grid e adicionamos alguns estilos que vão definir o comportamento das imagens dentro do container.
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
Esse estilo define o tamanho das imagens em linha/horizontal a função. repeat repete o tamanho para um número x de imagens, o auto-fill determina esse tamanho automaticamente e o minmax é uma função que calcula o tamanho respeitando os 300px e ignorando caso as imagens sejam maiores.
grid-auto-rows: minmax(250px, auto);
Essa linha faz o mesmo que a anterior porém em colunas/vertical.
grid-auto-flow: dense;
Controla um algorítimo de posicionamento automático e a propriedade dense sempre tenta preencher os 'buracos'
grid-column-gap: .5em;
grid-row-gap: .5em;
Esses estilos definem os espaçamentos entre as imagens em linhas e colunas.
Definindo o estilo das imagens dentro do container
Aqui é mais simples, estamos aplicando um estilo para as imagens dentro do grid. Apenas estamos definindo o tamanho e a altura para 100% e o object-fit faz com que a imagem sempre preencha todo os espaço independente do tamanho dela.
#grid img {
width: 100%;
height: 100%;
object-fit: cover;
}
Para finalizar nós criamos uma classe chamada span-2. Esses estilos definem qual é o espaço final que a imagem vai chegar, eu sei é um pouco confuso. Mas entenda o valor span como partes! Abaixo você consegue ver que o span na coluna é 1 ou seja ele ocupa uma parte da horizontal e 2 na vertical. Ou seja todas as imagens que tiverem com essa classe irão ocupar espaços maiores na vertical criando o mosaico.
.span-2 {
grid-column-end: span 1;
grid-row-end: span 2;
}
Quando utilizar a classe span-2?
Aqui é onde você precisará ser criativo. No meu exemplo eu defini manualmente em cada imagem a classe span-2, porém você pode fazer um código seja em PHP ou Javascript que calcule o tamanho das imagens e se a altura da imagem for maior que a largura você deve definir a classe span-2 fazendo com que todas as imagens que são altas ocupem mais espaço no mosaico.
Código Completo
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="Boomo - Felipe Moreira">
<meta name="description" content="Tutorial Mosaico. Boomo - por Felipe Moreira">
<link rel="shortcut icon" href="favicon.ico">
<title>Tutorial Mosaico. Boomo - por Felipe Moreira</title>
<style>
html,body{
margin: 0;
padding: 0;
background: #000
}
#grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
grid-auto-rows: minmax(250px, auto);
grid-auto-flow: dense;
grid-column-gap: .5em;
grid-row-gap: .5em;
margin: 20px 0 0 0;
}
#grid img {
width: 100%;
height: 100%;
object-fit: cover;
}
.span-2 {
grid-column-end: span 1;
grid-row-end: span 2;
}
</style>
</head>
<body>
<div id="grid">
<img src="https://boomo.com.br/images/noticias/operacao-big-hero-png-c799.png">
<img src="https://boomo.com.br/images/noticias/peanuts-png-c977.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-funko-pop-jpg-c163.jpg">
<img src="https://boomo.com.br/images/noticias/angry-birds-png-c939.png">
<img src="https://boomo.com.br/images/noticias/como-treinar-o-seu-dragao-png-c348.png">
<img src="https://boomo.com.br/images/noticias/detona-ralph-png-c286.png">
<img src="https://boomo.com.br/images/noticias/divertidamente-png-c684.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-funko-pop-2-jpg-c571.jpg">
<img src="https://boomo.com.br/images/noticias/familia-futuro-png-c618.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/seto-kaiba-yu-gi-oh-funko-pop-boneco-jpg-c119.jpg">
<img src="https://boomo.com.br/images/noticias/frozen-png-c476.png">
<img src="https://boomo.com.br/images/noticias/meu-malvado-favorito-png-c518.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-10-png-c992.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-rasengan-funko-pop-jpg-c879.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-8-png-c764.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-9-png-c437.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-1-png-c901.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/joey-wheeler-yu-gi-oh-funko-pop-boneco-jpg-c328.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-2-png-c539.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/dragao-branco-de-olhos-azuis-yu-gi-oh-funko-pop-boneco-jpg-c914.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-3-png-c209.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-4-png-c457.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/naruto-sexy-no-jutsu-funko-pop-jpg-c248.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-5-png-c577.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/pegasus-yu-gi-oh-funko-pop-boneco-jpg-c256.jpg">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-6-png-c801.png">
<img src="https://boomo.com.br/images/noticias/the-order-2-temporada-7-png-c637.png">
<img class="span-2" src="https://boomo.com.br/images/noticias/exodia-yu-gi-oh-funko-pop-boneco-jpg-c686.jpg">
<img src="https://boomo.com.br/images/noticias/mago-negro-yu-gi-oh-funko-pop-boneco-jpg-c600.jpg">
</div>
</body>
</html>