Como criar um carrossel de imagens com HTML, CSS e JavaScript
Criar um carrossel de imagens interativo do zero é uma excelente forma de dominar a base da web moderna. Vamos usar HTML, CSS e JavaScript para montar um slider responsivo e funcional sem depender de bibliotecas externas.
Resumo
- O carrossel mostra uma foto por vez dentro de uma faixa que esconde o restante.
- O HTML guarda a trilha, os slides e os dois botões.
- O CSS faz cada slide ocupar 100% da largura visível.
- O JavaScript só altera o translateX da trilha.
- Indicadores e autoplay entram depois que a troca manual já funciona.
O que a página precisa esconder
Um carrossel mostra uma imagem por vez no mesmo retângulo. As outras continuam no HTML, alinhadas lado a lado, mas uma máscara corta tudo o que passa da largura visível. O visitante não troca de página: um clique só desliza essa faixa.
Três peças resolvem isso. O HTML guarda a faixa e os botões. O CSS define a largura de cada slide e a animação. O JavaScript muda um número, o índice da foto atual, e aplica esse deslocamento.
Passo a passo
Monte nesta ordem. Se o botão não mover nada, o erro quase sempre está no seletor ou na largura do slide, não na conta do índice.
- Crie um contêiner com overflow escondido e, dentro dele, uma trilha flexível com um bloco por foto.
- Faça cada slide ocupar 100% da largura do contêiner e a imagem preencher o slide sem estourar a altura.
- Coloque dois botões, anterior e próximo, por cima do contêiner.
- No JavaScript, guarde o índice em zero e uma função que aplica translateX negativo vezes 100% vezes o índice.
- No botão próximo, some 1 e volte a zero quando passar da última foto. No anterior, faça o caminho inverso.
- Confira no navegador: três cliques para a direita devem voltar à primeira foto, sem barra de rolagem horizontal na página.
<div class='carousel'>
<div class='carousel-track'>
<div class='carousel-slide'><img src='foto-1.jpg' alt='Primeira foto'></div>
<div class='carousel-slide'><img src='foto-2.jpg' alt='Segunda foto'></div>
</div>
<button type='button' class='prev'>Anterior</button>
<button type='button' class='next'>Próximo</button>
</div>.carousel { position: relative; overflow: hidden; max-width: 640px; }
.carousel-track { display: flex; transition: transform .4s ease; }
.carousel-slide { min-width: 100%; }
.carousel-slide img { width: 100%; display: block; }const track = document.querySelector('.carousel-track');
const slides = document.querySelectorAll('.carousel-slide');
let index = 0;
function update() {
track.style.transform = 'translateX(' + (-index * 100) + '%)';
}
document.querySelector('.next').addEventListener('click', () => {
index = (index + 1) % slides.length;
update();
});
document.querySelector('.prev').addEventListener('click', () => {
index = (index - 1 + slides.length) % slides.length;
update();
});Erros comuns
O deslizamento quebra quando a largura do slide não é exatamente a largura visível, ou quando o script roda antes do HTML existir. Para complementar essa implementação em produção, vale conferir também nossas análises técnicas sobre Design System com CSS puro: Como criar cards e sidebars premium e Como criar e assinar commits usando chaves GPG ou chaves SSH para autenticidade.
- Coloque o script no final do body ou espere DOMContentLoaded.
- Não use imagens com largura fixa em pixels dentro do slide.
- Deixe alt em cada imagem. O botão sozinho não descreve a foto.
- Indicadores e autoplay só entram depois que o clique manual já troca o slide.
Conclusão
O carrossel é uma faixa que anda em passos de 100%. O HTML lista as fotos, o CSS esconde o excedente e o JavaScript só atualiza o índice.
Com esse núcleo estável, bolinhas e avanço automático são um contador em cima da mesma função update.