SWCore
SWCore / Componentes / Slider de imagens

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. 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. 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 inverno
    Frete grátis no Nordeste
    Parcele 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. 3

    Quer que troque sozinho? Acrescente sw-slider-auto com 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.

Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
Completo — setas + bolinhas
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
Só as bolinhas
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
Só as setas
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
Com botão de pausa (sw-slider-ply) — só faz sentido com troca automática
<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.

Camiseta
Tênis
Boné
Mochila
Relógio
Óculos
sw-slider-show="3" sw-slider-scroll="1" — mostra 3, anda de 1 em 1
<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>
Camiseta
Tênis
Boné
Mochila
Relógio
Óculos
sw-slider-show="3" — mostra 3, anda de 3 em 3 (página inteira)
<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>
Camiseta
Tênis
Boné
Mochila
sw-slider-show="2" sw-slider-scroll="1"
<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.

Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
Padrão — desliza para o lado
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
sw-slider-effect="zoom" — esmaece e dá zoom lento
<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".

Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
sw-slider-auto="3000" — troca a cada 3 s e pausa com o mouse em cima
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
sw-slider-hover="run" — não pausa com o mouse em cima
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
sw-slider-dur="1.2s" — deslize bem mais lento
<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.

Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
Padrão — volta infinita
<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>
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
sw-slider-loop="false" — trava no último
<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

PalavraO que fazExemplo
Peças (atributos dentro da caixa)
sw-sliderA caixa. Precisa de altura (classe ar-*, ou altura no CSS da página).<div sw-slider class="ar-21-9">
sw-slider-trkA pista que segura os slides. Obrigatória.<div sw-slider-trk>
sw-slider-itCada slide: foto, vídeo ou bloco com texto e botão. Obrigatório.<div sw-slider-it>…</div>
sw-slider-prv / sw-slider-nxtSetas de anterior e próximo. Opcionais. Coloque aria-label.<button sw-slider-nxt aria-label="Próximo">›</button>
sw-slider-dot-grpOnde o script desenha as bolinhas (uma por página). Deixe vazio.<div sw-slider-dot-grp></div>
sw-slider-plyBotão de pausar/continuar a troca automática. O ícone ⏸/▶ vem do CSS.<button sw-slider-ply aria-label="Pausar"></button>
Quantidade
sw-slider-showQuantos slides ficam visíveis ao mesmo tempo. Padrão: 1.sw-slider-show="3"
sw-slider-scrollQuantos 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-autoTroca 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-durDuraçã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-actNa bolinha da página atual e, no efeito zoom, no slide visível.
.is-pausedNo 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.

Banner do topo de uma loja, com foto e chamada Ao vivo
Cafeteria com balcão de madeira
Café especial em grão Ver ofertas
Xícara de café sobre a mesa
Entrega no mesmo dia Consultar CEP
<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>
Capa de imobiliária com zoom lento (Ken Burns) Ao vivo
Sala ampla com janelas
Fachada do prédio
Vista da cidade
<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>
Depoimentos de clientes, 2 por vez Ao vivo
"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>
Controlar por JavaScript e saber quando trocou Ao vivo
Promoção de inverno
Frete grátis no Nordeste
Parcele em 10x
<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:change
Trocou de página — por seta, arrastar, teclado, troca automática, bolinha ou SW.Slider.goTo(). Traz e.detail.page (começa em 0).

API (JavaScript)

SW.Slider.next(el)
Anda para a próxima página.
SW.Slider.prev(el)
Volta uma página.
SW.Slider.goTo(el, n)
Vai direto para a página n (a primeira é 0). Com sw-slider-scroll maior que 1, cada página tem vários slides.
SW.Slider.initAll(raiz)
Liga os sliders dentro de raiz. Normalmente não precisa: o SWCore liga sozinho os que aparecem na página, até os inseridos depois.

Precisa de quê

  • swcore.min.css e swcore.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-fill faz 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-show junto com sw-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.