Slider de imagens Componentes
Passa slides um depois do outro — banners, fotos, produtos. Com setas, bolinhas, troca automática e efeito de zoom lento (Ken Burns).
O que é
É aquele bloco que troca de imagem sozinho no topo de uma loja ("Promoção de inverno" → "Frete grátis" → "Parcele em 10x"), ou a fileira de produtos que anda para o lado quando você clica na seta. Cada slide pode ser uma foto, um vídeo ou um bloco inteiro com título e botão. Você escreve a caixa sw-slider, a pista sw-slider-trk e um sw-slider-it para cada slide; setas e bolinhas são opcionais.
Precisa do JavaScript do SWCore (vem no swcore.min.js). O script mede a largura da caixa, arruma os slides lado a lado e anda com eles. Ele também liga sozinho: arrastar com o dedo no celular, setas do teclado (← →) quando o slider está em foco, e volta infinita (depois do último vem o primeiro, sem "rebobinar"). A caixa precisa ter altura — a forma mais fácil é uma classe de proporção do SWCore, como ar-21-9.
Quando usar
- Banner do topo com 2 a 5 chamadas que se revezam: um slide por vez, troca automática —
sw-slider-auto="5000". - Vitrine de produtos ou depoimentos lado a lado: vários por vez —
sw-slider-show="3". - Foto de capa com movimento (imobiliária, restaurante, turismo): zoom lento —
sw-slider-effect="zoom". - Para trocar só frases curtas, use o Text Carousel, que é mais leve.
Comece aqui
-
1
Coloque o SWCore na página (uma vez só, vale para todos os componentes): o CSS no
<head>e o JS no fim do<body>.<link rel="stylesheet" href="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.css"> <!-- fim do body --> <script src="https://swcore.sanweb.com.br/dist/2.1.0/swcore.min.js"></script> -
2
Monte a caixa com altura (aqui a proporção
ar-21-9), a pista e um item por slide. Setas e bolinhas são peças opcionais dentro da caixa.Promoção de invernoFrete grátis no NordesteParcele em 10x<div sw-slider class="ar-21-9"> <div sw-slider-trk> <div sw-slider-it><img class="media-fill" src="/banner-1.webp" alt="Promoção de inverno"></div> <div sw-slider-it><img class="media-fill" src="/banner-2.webp" alt="Frete grátis no Nordeste"></div> <div sw-slider-it><img class="media-fill" src="/banner-3.webp" alt="Parcele em 10x"></div> </div> <button sw-slider-prv aria-label="Anterior">‹</button> <button sw-slider-nxt aria-label="Próximo">›</button> <div sw-slider-dot-grp></div> </div> -
3
Quer que troque sozinho? Acrescente
sw-slider-autocom o tempo em milissegundos (5000 = 5 segundos). Ele pausa quando o mouse fica em cima.<div sw-slider class="ar-21-9" sw-slider-auto="5000">…</div>
Todas as variações
Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.
1. Peças da caixa
Só sw-slider, sw-slider-trk e sw-slider-it são obrigatórios. Setas (sw-slider-prv/sw-slider-nxt), bolinhas (sw-slider-dot-grp, deixe vazio: o script desenha uma por página) e o botão de pausa (sw-slider-ply) você coloca se quiser. Mesmo sem nenhuma delas dá para passar arrastando no celular ou com ← → do teclado.
<div sw-slider class="ar-21-9">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
</div>
<div sw-slider class="ar-21-9" sw-slider-auto="3000">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<div sw-slider-dot-grp></div>
<button sw-slider-ply aria-label="Pausar ou continuar"></button>
</div>
2. Quantos slides aparecem de uma vez
sw-slider-show diz quantos ficam visíveis lado a lado; sw-slider-scroll diz quantos andam a cada clique (sem ele, anda o mesmo número que aparece). Para dar um respiro entre os cartões, use a classe p-1 no item.
<div sw-slider class="ar-21-9" sw-slider-show="3" sw-slider-scroll="1">
<div sw-slider-trk>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Camiseta</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Tênis</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Boné</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Mochila</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Relógio</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Óculos</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
</div>
<div sw-slider class="ar-21-9" sw-slider-show="3">
<div sw-slider-trk>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Camiseta</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Tênis</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Boné</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Mochila</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Relógio</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Óculos</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9" sw-slider-show="2" sw-slider-scroll="1">
<div sw-slider-trk>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Camiseta</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Tênis</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Boné</div></div>
<div sw-slider-it class="p-1"><div class="h-fl flx j-ct alc bg-sur bd r-m">Mochila</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
</div>
3. Efeito de troca
Sem nada, os slides deslizam para o lado. Com sw-slider-effect="zoom" eles ficam um em cima do outro, trocam com um esmaecer e o slide visível vai dando um zoom lento (o efeito "Ken Burns" de documentário). O zoom anda em quatro direções diferentes, uma para cada slide. Fica mais bonito com foto.
<div sw-slider class="ar-21-9" sw-slider-auto="3500">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9" sw-slider-effect="zoom" sw-slider-auto="4000">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<div sw-slider-dot-grp></div>
</div>
4. Troca automática e velocidade
sw-slider-auto liga a troca sozinha (tempo em milissegundos). Por padrão ela pausa com o mouse em cima, para a pessoa conseguir ler. sw-slider-dur muda a velocidade da animação — escreva com a unidade: "1.2s" ou "1200ms".
<div sw-slider class="ar-21-9" sw-slider-auto="3000">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9" sw-slider-auto="3000" sw-slider-hover="run">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9" sw-slider-dur="1.2s">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
</div>
5. Volta infinita ou para no fim
Por padrão, depois do último slide vem o primeiro, sem "rebobinar" (ele copia alguns slides escondidos para fazer a emenda). Com sw-slider-loop="false" a seta trava no primeiro e no último.
<div sw-slider class="ar-21-9">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9" sw-slider-loop="false">
<div sw-slider-trk>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-pri">Promoção de inverno</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-sec">Frete grátis no Nordeste</div></div>
<div sw-slider-it><div class="h-fl flx j-ct alc t-g bg-acc">Parcele em 10x</div></div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
<div sw-slider-dot-grp></div>
</div>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| Peças (atributos dentro da caixa) | ||
sw-slider | A caixa. Precisa de altura (classe ar-*, ou altura no CSS da página). | <div sw-slider class="ar-21-9"> |
sw-slider-trk | A pista que segura os slides. Obrigatória. | <div sw-slider-trk> |
sw-slider-it | Cada slide: foto, vídeo ou bloco com texto e botão. Obrigatório. | <div sw-slider-it>…</div> |
sw-slider-prv / sw-slider-nxt | Setas de anterior e próximo. Opcionais. Coloque aria-label. | <button sw-slider-nxt aria-label="Próximo">›</button> |
sw-slider-dot-grp | Onde o script desenha as bolinhas (uma por página). Deixe vazio. | <div sw-slider-dot-grp></div> |
sw-slider-ply | Botão de pausar/continuar a troca automática. O ícone ⏸/▶ vem do CSS. | <button sw-slider-ply aria-label="Pausar"></button> |
| Quantidade | ||
sw-slider-show | Quantos slides ficam visíveis ao mesmo tempo. Padrão: 1. | sw-slider-show="3" |
sw-slider-scroll | Quantos andam a cada clique. Padrão: o mesmo número do show. Nunca passa do show. | sw-slider-scroll="1" |
| Troca automática | ||
sw-slider-auto | Troca sozinho a cada N milissegundos. Sem ele, só troca quando a pessoa clica/arrasta. | sw-slider-auto="5000" |
sw-slider-hover="run" | Não pausa quando o mouse está em cima (o padrão é pausar). | sw-slider-hover="run" |
| Efeito e velocidade | ||
(sem efeito) | Desliza para o lado. Padrão. | |
sw-slider-effect="zoom" | Slides empilhados, troca esmaecendo, zoom lento no slide visível (Ken Burns). | sw-slider-effect="zoom" |
sw-slider-dur | Duração da animação de troca, com unidade. Padrão: 0.5s (deslize) / 0.8s (zoom). | sw-slider-dur="1.2s" |
| Fim da fila | ||
(padrão) | Volta infinita: depois do último vem o primeiro. | |
sw-slider-loop="false" | Trava no primeiro e no último. | sw-slider-loop="false" |
| Estados (o script coloca sozinho) | ||
.is-act | Na bolinha da página atual e, no efeito zoom, no slide visível. | |
.is-paused | No botão sw-slider-ply quando a troca automática está pausada. | |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
<div sw-slider class="ar-21-9" sw-slider-auto="5000">
<div sw-slider-trk>
<div sw-slider-it class="rel">
<img class="media-fill" src="/img/banner-cafe.webp" alt="Cafeteria com balcão de madeira">
<div class="abs-fill flx f-cl j-ct als gap-3 p-4">
<strong class="t-xg">Café especial em grão</strong>
<a href="/ofertas" sw-btn="pri">Ver ofertas</a>
</div>
</div>
<div sw-slider-it class="rel">
<img class="media-fill" src="/img/banner-entrega.webp" alt="Xícara de café sobre a mesa">
<div class="abs-fill flx f-cl j-ct als gap-3 p-4">
<strong class="t-xg">Entrega no mesmo dia</strong>
<a href="/entrega" sw-btn="glass">Consultar CEP</a>
</div>
</div>
</div>
<button sw-slider-prv aria-label="Anterior">‹</button>
<button sw-slider-nxt aria-label="Próximo">›</button>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider class="ar-21-9" sw-slider-effect="zoom" sw-slider-auto="5000">
<div sw-slider-trk>
<div sw-slider-it><img class="media-fill" src="/img/sala.webp" alt="Sala ampla com janelas"></div>
<div sw-slider-it><img class="media-fill" src="/img/fachada.webp" alt="Fachada do prédio"></div>
<div sw-slider-it><img class="media-fill" src="/img/vista.webp" alt="Vista da cidade"></div>
</div>
<div sw-slider-dot-grp></div>
</div>
"Meu site ficou pronto em uma semana e já recebi pedidos."Ana, confeitaria
"Agora os clientes marcam horário sozinhos pelo celular."Bruno, barbearia
"Atendimento rápido e sem enrolação."Carla, clínica
<div sw-slider class="ar-21-9" sw-slider-show="2" sw-slider-scroll="1" sw-slider-auto="6000">
<div sw-slider-trk>
<div sw-slider-it class="p-1"><blockquote class="h-fl flx f-cl j-ct gap-2 p-3 bg-sur bd r-m">"Meu site ficou pronto em uma semana e já recebi pedidos."<cite class="t-mut">Ana, confeitaria</cite></blockquote></div>
<div sw-slider-it class="p-1"><blockquote class="h-fl flx f-cl j-ct gap-2 p-3 bg-sur bd r-m">"Agora os clientes marcam horário sozinhos pelo celular."<cite class="t-mut">Bruno, barbearia</cite></blockquote></div>
<div sw-slider-it class="p-1"><blockquote class="h-fl flx f-cl j-ct gap-2 p-3 bg-sur bd r-m">"Atendimento rápido e sem enrolação."<cite class="t-mut">Carla, clínica</cite></blockquote></div>
</div>
<div sw-slider-dot-grp></div>
</div>
<div sw-slider id="vitrine" class="ar-21-9">…</div>
<script>
const vitrine = document.getElementById('vitrine');
SW.Slider.next(vitrine); // próximo
SW.Slider.prev(vitrine); // anterior
SW.Slider.goTo(vitrine, 2); // vai para a página 3 (a contagem começa em 0)
vitrine.addEventListener('sw:slider:change', (e) => {
console.log('foi para a página', e.detail.page);
});
</script>
Eventos
sw:slider:changeSW.Slider.goTo(). Traz e.detail.page (começa em 0).API (JavaScript)
SW.Slider.next(el)SW.Slider.prev(el)SW.Slider.goTo(el, n)n (a primeira é 0). Com sw-slider-scroll maior que 1, cada página tem vários slides.SW.Slider.initAll(raiz)raiz. Normalmente não precisa: o SWCore liga sozinho os que aparecem na página, até os inseridos depois.Precisa de quê
swcore.min.csseswcore.min.js.- Altura na caixa
[sw-slider]— pela classe de proporção (ar-21-9,ar-16-9,ar-2-1,ar-4-3…) ou pelo CSS da sua página.
Cuidados — erros comuns
- Caixa sem altura: o slider nasce achatado e parece que "sumiu". Coloque
class="ar-21-9"(ou outra proporção) na[sw-slider]. - Esquecer o
sw-slider-trk: sem a pista, nada acontece — os itens precisam estar dentro dela. - Escrever
sw-slider-dur="800"sem unidade: a animação some (o navegador não entende "800"). Use"800ms"ou"0.8s". - Foto dentro do slide sem
class="media-fill": ela não preenche o slide e sobra espaço.media-fillfaz a foto cobrir sem distorcer. - Troca automática muito rápida (menos de 3 s) não dá tempo de ler. Para banner com texto, use 5000 ou mais.
- Colocar
sw-slider-showjunto comsw-slider-effect="zoom": no zoom os slides ficam empilhados, então só aparece um de cada vez.
O que ele não faz
- Não muda o número de slides visíveis conforme a tela:
sw-slider-show="3"mostra 3 também no celular. Para vitrine, prefira 2 ou use outro slider só no celular. - Não carrega as fotos sob demanda: todas baixam junto com a página. Use imagens leves (WebP) e poucas.
- Para trocar só frases, o Text Carousel é o componente certo.

