Um slideshow/carrossel de imagens completo e interativo, desenvolvido em JavaScript puro (vanilla), sem dependências externas. Ideal para praticar conceitos como timers, eventos, classes ES6 e animações CSS.
- ✅ Navegação intuitiva - Botões next/prev para navegar entre slides
- ✅ Autoplay pausável - Transição automática que pausa ao passar o mouse
- ✅ Indicadores (dots) - Navegação direta para qualquer slide
- ✅ Touch/Swipe - Suporte completo para gestos em dispositivos móveis
- ✅ Navegação por teclado - Setas, Home, End e Espaço
- ✅ Persistência - Salva posição atual no localStorage
- ✅ Loop infinito - Navegação circular sem fim
- ✅ Responsivo - Adapta-se a qualquer tamanho de tela
- ✅ Acessível - Suporte a leitores de tela e navegação por teclado
- ✅ Performance otimizada - Usa transform CSS para animações suaves
Slideshow/
├── index.html # Estrutura HTML do carrossel
├── style.css # Estilos CSS responsivos
├── slideshow.js # Classe ES6 principal
└── README.md # Documentação
- Clone ou baixe este projeto
- Abra o arquivo
index.htmlem seu navegador - Pronto! O slideshow já está funcionando
Copie a estrutura HTML para seu projeto:
<div class="carousel-container" data-slide="0">
<div class="carousel-track">
<img class="slide" src="img1.jpg" alt="Descrição 1">
<img class="slide" src="img2.jpg" alt="Descrição 2">
<img class="slide" src="img3.jpg" alt="Descrição 3">
</div>
<button class="nav-btn prev" aria-label="Slide anterior">‹</button>
<button class="nav-btn next" aria-label="Próximo slide">›</button>
<div class="dots">
<span class="dot active" data-index="0"></span>
<span class="dot" data-index="1"></span>
<span class="dot" data-index="2"></span>
</div>
</div>Inclua o arquivo style.css ou copie os estilos necessários:
<link rel="stylesheet" href="style.css">Inclua o arquivo slideshow.js e inicialize:
<script src="slideshow.js"></script>
<script>
document.addEventListener('DOMContentLoaded', () => {
new Slideshow('.carousel-container');
});
</script>const slideshow = new Slideshow('.carousel-container', {
autoplayInterval: 3000, // Intervalo em ms (padrão: 3000)
touchThreshold: 50, // Distância mínima para swipe (padrão: 50)
enableLocalStorage: true, // Salvar posição (padrão: true)
enableKeyboard: true, // Navegação por teclado (padrão: true)
enableTouch: true // Suporte a touch (padrão: true)
});// Slideshow mais rápido
const fastSlideshow = new Slideshow('.carousel-container', {
autoplayInterval: 1500
});
// Sem autoplay
const manualSlideshow = new Slideshow('.carousel-container', {
autoplayInterval: 0
});
// Apenas navegação manual
const manualOnly = new Slideshow('.carousel-container', {
autoplayInterval: 0,
enableKeyboard: false,
enableTouch: false
});| Controle | Ação |
|---|---|
| 🖱️ Clique em ‹ | Slide anterior |
| 🖱️ Clique em › | Próximo slide |
| ⏯️ Hover no container | Pausa autoplay |
| 👆 Swipe esquerda | Próximo slide |
| 👆 Swipe direita | Slide anterior |
| ⌨️ Seta ← | Slide anterior |
| ⌨️ Seta → | Próximo slide |
| ⌨️ Home | Primeiro slide |
| ⌨️ End | Último slide |
| ⌨️ Espaço | Play/Pause |
| ⚫ Clique no dot | Vai para o slide |
Você pode criar slides dinamicamente usando a função utilitária:
const images = [
{ url: 'https://example.com/img1.jpg', alt: 'Imagem 1' },
{ url: 'https://example.com/img2.jpg', alt: 'Imagem 2' },
{ url: 'https://example.com/img3.jpg', alt: 'Imagem 3' }
];
const slideshow = createDynamicSlideshow('.carousel-container', images);// Navegação
slideshow.next(); // Próximo slide
slideshow.prev(); // Slide anterior
slideshow.goTo(index); // Vai para slide específico
// Controle de autoplay
slideshow.play(); // Inicia autoplay
slideshow.pause(); // Pausa autoplay
slideshow.togglePlayPause(); // Alterna play/pause
// Informações
slideshow.getInfo(); // Retorna objeto com informações
// { totalSlides: 7, currentIndex: 2, isPlaying: true, autoplayInterval: 3000 }
// Destruição
slideshow.destroy(); // Remove slideshow e listenersNo style.css:
.carousel-track {
transition: transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}.carousel-container {
max-width: 1000px; /* Altere conforme necessário */
height: 500px; /* Altere conforme necessário */
}.nav-btn {
background: rgba(255, 0, 0, 0.5); /* Vermelho */
color: white;
}
.dot.active {
background: #ff0000; /* Vermelho */
}O slideshow é totalmente responsivo e se adapta automaticamente:
- Desktop: 800px × 400px
- Tablet: 300px de altura
- Mobile: 220px de altura
Pontos de quebra em style.css:
@media (max-width: 768px) { /* Tablet */ }
@media (max-width: 480px) { /* Mobile */ }- Atributos
aria-labelnos botões - Navegação completa por teclado
- Suporte a leitores de tela
- Indicadores visuais claros
- Estados de foco visíveis
| Aspecto | Teste | Status |
|---|---|---|
| Navegação | Next/prev volta ao início | ✅ |
| Loop infinito | % this.slides.length |
✅ |
| Autoplay | Pausa em hover, retoma | ✅ |
| Touch | Swipe funciona em mobile | ✅ |
| Teclado | Setas navegam corretamente | ✅ |
| LocalStorage | Posição salva/restaurada | ✅ |
| Responsivo | Resize funciona | ✅ |
| Performance | 20+ slides sem lag | ✅ |
- Navegação: Clique nos botões e dots
- Autoplay: Passe o mouse sobre o container
- Touch: Use em dispositivo móvel ou emulador
- Teclado: Use setas, Home, End e Espaço
- Persistência: Recarregue a página e verifique a posição
- Responsivo: Redimensione a janela do navegador
| Navegador | Versão Mínima |
|---|---|
| Chrome | 61+ |
| Firefox | 60+ |
| Safari | 11+ |
| Edge | 79+ |
| Opera | 48+ |
Este projeto é excelente para praticar:
- ✨ Classes ES6 - Orientação a objetos em JavaScript
- ⏱️ Timers -
setIntervaleclearInterval - 🎯 Event Listeners - Click, hover, touch, keyboard
- 🎨 CSS Transitions - Animações suaves com
transform - 💾 LocalStorage - Persistência de dados no navegador
- 📱 Touch Events - Gestos em dispositivos móveis
- ♿ Acessibilidade - ARIA e navegação por teclado
- 📐 Responsividade - Media queries e design adaptativo
- 🚀 Performance - Otimização de animações
- LogRocket - Build Image Carousel from Scratch
- Tuts+ - Simple Carousel with Vanilla JavaScript
- Andrew McCall - Vanilla JavaScript Carousel
- GeeksforGeeks - Autoplay Carousel
Este projeto está sob a licença MIT. Sinta-se livre para usar, modificar e distribuir conforme necessário.
Contribuições são bem-vindas! Sinta-se à vontade para:
- Fazer fork do projeto
- Criar uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abrir um Pull Request
Para dúvidas ou sugestões, abra uma issue no repositório.
Desenvolvido com ❤️ usando Vanilla JavaScript