Carrossel de arrastar (sw-trilho) CSS
Uma fileira de cartões que a pessoa arrasta para o lado com o dedo, e cada um encaixa no lugar. Sem biblioteca de slider, sem JavaScript.
O que é
Serve para mostrar muita coisa num espaço pequeno: depoimentos, produtos, serviços, planos, fotos. Tudo que você colocar dentro de <div sw-trilho> vira um item da fileira. No celular a pessoa arrasta com o dedo; no computador, rola para o lado com o trackpad ou com Shift + rodinha do mouse. Quando solta, o item encaixa certinho.
É só CSS: os itens ficam lado a lado numa grade que rola na horizontal, com "encaixe" (scroll-snap) — o navegador faz o movimento. Cada item tem a mesma largura: até 32rem, ou 80% da tela no celular. As palavras dentro do atributo mudam o tamanho e o ponto de encaixe. Se você quer setas, bolinhas e troca automática, use o Carousel.
Quando usar
- Depoimentos de clientes — vários, sem empilhar a página.
- Vitrine de produtos ou serviços no celular, uma "prateleira" que desliza.
- Galeria de fotos uma por vez (
cheio). - Tabela de planos que no celular vira fileira arrastável.
Comece aqui
-
1
Coloque o SW Core no
<head>. O trilho é só CSS: não precisa do arquivo de JavaScript.<link rel="stylesheet" href="swcore/swcore.min.css"> -
2
Coloque os itens dentro de
<div sw-trilho>. Cada filho direto vira um item. Arraste para o lado:"Atendimento nota 10!"Ana, cliente desde 2023
"Site pronto em uma semana."Carlos, loja de roupas
"Dobrou meus pedidos."Beatriz, confeitaria
<div sw-trilho> <div sw-card="p"><div class="sw-card-bdy"><strong>"Atendimento nota 10!"</strong><p class="t-mut t-pp">Ana, cliente desde 2023</p></div></div> <div sw-card="p"><div class="sw-card-bdy"><strong>"Site pronto em uma semana."</strong><p class="t-mut t-pp">Carlos, loja de roupas</p></div></div> <div sw-card="p"><div class="sw-card-bdy"><strong>"Dobrou meus pedidos."</strong><p class="t-mut t-pp">Beatriz, confeitaria</p></div></div> </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. Tamanho dos itens
O tamanho diz quanto cada item ocupa. Arraste cada fileira para o lado para comparar. Sem palavra: até 32rem (80% da largura no celular).
R$ 45 · 30 min
R$ 35 · 20 min
R$ 70 · 50 min
R$ 20 · 10 min
R$ 60 · 40 min
<div sw-trilho>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte</strong><p class="t-mut t-pp">R$ 45 · 30 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Barba</strong><p class="t-mut t-pp">R$ 35 · 20 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte + barba</strong><p class="t-mut t-pp">R$ 70 · 50 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Sobrancelha</strong><p class="t-mut t-pp">R$ 20 · 10 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Pigmentação</strong><p class="t-mut t-pp">R$ 60 · 40 min</p></div></div>
</div>
R$ 45 · 30 min
R$ 35 · 20 min
R$ 70 · 50 min
R$ 20 · 10 min
R$ 60 · 40 min
<div sw-trilho="p">
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte</strong><p class="t-mut t-pp">R$ 45 · 30 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Barba</strong><p class="t-mut t-pp">R$ 35 · 20 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte + barba</strong><p class="t-mut t-pp">R$ 70 · 50 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Sobrancelha</strong><p class="t-mut t-pp">R$ 20 · 10 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Pigmentação</strong><p class="t-mut t-pp">R$ 60 · 40 min</p></div></div>
</div>
R$ 45 · 30 min
R$ 35 · 20 min
R$ 70 · 50 min
R$ 20 · 10 min
R$ 60 · 40 min
<div sw-trilho="g">
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte</strong><p class="t-mut t-pp">R$ 45 · 30 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Barba</strong><p class="t-mut t-pp">R$ 35 · 20 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte + barba</strong><p class="t-mut t-pp">R$ 70 · 50 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Sobrancelha</strong><p class="t-mut t-pp">R$ 20 · 10 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Pigmentação</strong><p class="t-mut t-pp">R$ 60 · 40 min</p></div></div>
</div>
R$ 45 · 30 min
R$ 35 · 20 min
R$ 70 · 50 min
R$ 20 · 10 min
R$ 60 · 40 min
<div sw-trilho="cheio">
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte</strong><p class="t-mut t-pp">R$ 45 · 30 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Barba</strong><p class="t-mut t-pp">R$ 35 · 20 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte + barba</strong><p class="t-mut t-pp">R$ 70 · 50 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Sobrancelha</strong><p class="t-mut t-pp">R$ 20 · 10 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Pigmentação</strong><p class="t-mut t-pp">R$ 60 · 40 min</p></div></div>
</div>
2. Onde o item encaixa
Por padrão o item encaixa pela esquerda (o começo dele fica alinhado). Com centro ele para no meio, e os vizinhos aparecem dos dois lados. Combine com um tamanho: sw-trilho="p centro".
R$ 45 · 30 min
R$ 35 · 20 min
R$ 70 · 50 min
R$ 20 · 10 min
R$ 60 · 40 min
<div sw-trilho="centro">
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte</strong><p class="t-mut t-pp">R$ 45 · 30 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Barba</strong><p class="t-mut t-pp">R$ 35 · 20 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte + barba</strong><p class="t-mut t-pp">R$ 70 · 50 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Sobrancelha</strong><p class="t-mut t-pp">R$ 20 · 10 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Pigmentação</strong><p class="t-mut t-pp">R$ 60 · 40 min</p></div></div>
</div>
R$ 45 · 30 min
R$ 35 · 20 min
R$ 70 · 50 min
R$ 20 · 10 min
R$ 60 · 40 min
<div sw-trilho="p centro">
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte</strong><p class="t-mut t-pp">R$ 45 · 30 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Barba</strong><p class="t-mut t-pp">R$ 35 · 20 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Corte + barba</strong><p class="t-mut t-pp">R$ 70 · 50 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Sobrancelha</strong><p class="t-mut t-pp">R$ 20 · 10 min</p></div></div>
<div sw-card="p"><div class="sw-card-bdy"><strong>Pigmentação</strong><p class="t-mut t-pp">R$ 60 · 40 min</p></div></div>
</div>
Tabela de opções
| Palavra | O que faz | Exemplo |
|---|---|---|
| Tamanho do item (uma palavra) | ||
(nenhuma) | Até 32rem de largura; 80% da tela no celular. | sw-trilho |
p | Pequeno: até 22rem; 60% no celular. | sw-trilho="p" |
g | Grande: até 48rem; 92% no celular. | sw-trilho="g" |
cheio | Um item por vez, 100% da largura (galeria de fotos). | sw-trilho="cheio" |
| Encaixe | ||
(nenhum) | O item encaixa pelo começo (esquerda). | sw-trilho |
centro | O item encaixa no meio da fileira. | sw-trilho="centro" |
| Largura livre (no CSS da sua página) | ||
--sw-trilho-w | Largura de cada item, do jeito que você quiser. Escreva numa classe sua. | .depoimentos { --sw-trilho-w: 26rem; } |
Receitas prontas — usos reais
Situações que aparecem em quase todo site. Copie a que servir.
"Atendimento rápido e o site ficou lindo. Recomendo!"
"Meus pedidos pelo WhatsApp dobraram no primeiro mês."
"Entregaram antes do prazo e explicaram tudo."
<div sw-trilho="centro">
<div sw-card="tst"><p class="sw-card-qt">"Atendimento rápido e o site ficou lindo. Recomendo!"</p><div class="sw-card-usr"><span sw-avt="p">AN</span><div><div class="sw-card-usr-nm">Ana Nunes</div><div class="sw-card-usr-rl">Estúdio de pilates</div></div></div></div>
<div sw-card="tst"><p class="sw-card-qt">"Meus pedidos pelo WhatsApp dobraram no primeiro mês."</p><div class="sw-card-usr"><span sw-avt="p suc">BR</span><div><div class="sw-card-usr-nm">Beatriz Rocha</div><div class="sw-card-usr-rl">Confeitaria</div></div></div></div>
<div sw-card="tst"><p class="sw-card-qt">"Entregaram antes do prazo e explicaram tudo."</p><div class="sw-card-usr"><span sw-avt="p inf">CM</span><div><div class="sw-card-usr-nm">Carlos Melo</div><div class="sw-card-usr-rl">Loja de roupas</div></div></div></div>
</div>
<div sw-trilho class="vitrine">
<div sw-card="prd">
<div class="sw-card-cnt">
<div class="sw-card-nme">Camiseta básica</div>
<div class="sw-card-prc"><span class="sw-card-prc-cur">R$ 59</span></div>
</div>
</div>
<!-- um sw-card por produto -->
</div>
<style>
.vitrine { --sw-trilho-w: 20rem; } /* cada produto com 20rem */
</style>
<div sw-trilho="cheio">
<img src="fachada.webp" alt="Fachada da clínica" loading="lazy">
<img src="recepcao.webp" alt="Recepção" loading="lazy">
<img src="sala.webp" alt="Sala de espera" loading="lazy">
</div>
Precisa de quê
swcore.min.css— o trilho.- Nenhum JavaScript.
Cuidados — erros comuns
- Só os filhos diretos viram itens. Se você embrulhar tudo numa
<div>extra dentro do trilho, vira um item só. - Foto dentro do trilho: coloque
alteloading="lazy"— as fotos que estão fora da tela só carregam quando a pessoa chega nelas. - No computador, muita gente não sabe que dá para rolar para o lado. Deixe o último item "cortado" na borda (o padrão já faz isso) para mostrar que tem mais.
- Para mudar a largura, use a variável
--sw-trilho-wnuma classe sua — não coloquewidthnos itens.
O que ele não faz
- Não tem setas, bolinhas nem troca automática. Para isso use o Carousel (
sw-carousel). - Todos os itens têm a mesma largura.

