SW Core
SW Core / Animações / Track (fileira horizontal)

Track (fileira horizontal) Animações

A pessoa rola a página para baixo e uma fileira de cartões anda para o lado — o bloco fica preso na tela até a fileira passar inteira.

O que é

É o efeito clássico de portfólio e de "linha do tempo": a rolagem normal (para baixo) vira movimento para o lado. Quando o bloco chega ao topo da tela, ele prende; enquanto a pessoa continua rolando, a fileira desliza mostrando os cartões um a um; quando o último aparece, o bloco solta e a página segue.

São três peças: o bloco (sw-ani="track"), a fileira que anda (sw-ani-track, filho direto do bloco) e os cartões (sw-ani-section, filhos diretos da fileira). A fileira precisa estar lado a lado (flx) e os cartões precisam de largura. sw-ani-end diz quanto de rolagem a travessia inteira consome — o padrão é uma tela por cartão. Precisa do pacote de animação.

Quando usar

  • Portfólio: um projeto por cartão.
  • Linha do tempo da empresa ou etapas de um serviço.
  • Vitrine de produtos em destaque numa landing page.
  • Se você não quer prender a página, use uma faixa que anda com a rolagem (sw-ani="marquee scrub", grupo 2 abaixo) ou um carrossel de arrastar (sw-trilho).

Comece aqui

  1. 1

    Coloque o SW Core e o pacote de animação. O JS da animação vai antes do swcore.min.js.

    <link rel="stylesheet" href="swcore/swcore.min.css">
    <link rel="stylesheet" href="swcore/swcore.motion.min.css">
    
    <!-- fim do <body> -->
    <script src="swcore/swcore.motion.min.js"></script>
    <script src="swcore/swcore.min.js"></script>
  2. 2

    Monte as três peças. A fileira lado a lado (flx), os cartões sem encolher (f-sh0) e com largura. Os exemplos ao vivo estão logo abaixo.

    <style>
      .card-trilho { width: 28rem; }   /* cada cartão precisa de largura */
    </style>
    <div sw-ani="track" sw-ani-end="200%" class="ov-hi">
      <div sw-ani-track class="flx gap-3">
        <div sw-ani-section class="card-trilho f-sh0">Projeto 1</div>
        <div sw-ani-section class="card-trilho f-sh0">Projeto 2</div>
        <!-- … até o Projeto 8 -->
      </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. A fileira andando

Estes quadros prendem de verdade: quando a caixa chega ao topo da tela, ela gruda e a fileira anda enquanto você rola. Role devagar.

Projeto 1
Projeto 2
Projeto 3
Projeto 4
Projeto 5
Projeto 6
Projeto 7
Projeto 8
Padrão — anda para a esquerda (sw-ani-end="150%": travessia em 1,5 tela de rolagem)
<style>
  .card-trilho { width: 28rem; }   /* cada cartão precisa de largura */
</style>
<div sw-ani="track" sw-ani-end="150%" class="ov-hi">
  <div sw-ani-track class="flx gap-3">
    <div sw-ani-section class="card-trilho f-sh0">Projeto 1</div>
    <div sw-ani-section class="card-trilho f-sh0">Projeto 2</div>
    <!-- … até o Projeto 8 -->
  </div>
</div>
Projeto 1
Projeto 2
Projeto 3
Projeto 4
Projeto 5
Projeto 6
Projeto 7
Projeto 8
sw-ani-dir="right" — começa no último cartão e anda para a direita
<style>
  .card-trilho { width: 28rem; }   /* cada cartão precisa de largura */
</style>
<div sw-ani="track" sw-ani-dir="right" sw-ani-end="150%" class="ov-hi">
  <div sw-ani-track class="flx gap-3">
    <div sw-ani-section class="card-trilho f-sh0">Projeto 1</div>
    <div sw-ani-section class="card-trilho f-sh0">Projeto 2</div>
    <!-- … até o Projeto 8 -->
  </div>
</div>
Projeto 1
Projeto 2
Projeto 3
Projeto 4
Projeto 5
Projeto 6
Projeto 7
Projeto 8
sw-ani-end="400%" — mais rolagem para a mesma travessia = anda mais devagar
<style>
  .card-trilho { width: 28rem; }   /* cada cartão precisa de largura */
</style>
<div sw-ani="track" sw-ani-end="400%" class="ov-hi">
  <div sw-ani-track class="flx gap-3">
    <div sw-ani-section class="card-trilho f-sh0">Projeto 1</div>
    <div sw-ani-section class="card-trilho f-sh0">Projeto 2</div>
    <!-- … até o Projeto 8 -->
  </div>
</div>
Projeto 1
Projeto 2
Projeto 3
Projeto 4
Projeto 5
Projeto 6
Projeto 7
Projeto 8
sw-ani-scrub="2" — a fileira "atrasa" macio atrás da rolagem
<style>
  .card-trilho { width: 28rem; }   /* cada cartão precisa de largura */
</style>
<div sw-ani="track" sw-ani-end="150%" sw-ani-scrub="2" class="ov-hi">
  <div sw-ani-track class="flx gap-3">
    <div sw-ani-section class="card-trilho f-sh0">Projeto 1</div>
    <div sw-ani-section class="card-trilho f-sh0">Projeto 2</div>
    <!-- … até o Projeto 8 -->
  </div>
</div>

2. Sem prender a página: faixa que anda com a rolagem

Parecido, mas a página não para: a faixa anda para o lado só enquanto você rola, e repete sem fim. É o sw-ani="marquee scrub" (veja também Texto animado).

Sites · Lojas · Aplicativos · Identidade visual · 
marquee scrub — anda para a esquerda quando você desce
<div sw-ani="marquee scrub" class="t-xg fw7">
  <span>Sites · Lojas · Aplicativos · Identidade visual ·&nbsp;</span>
</div>
Projetos entregues em 2026 · 
marquee scrub + sw-ani-dir="right" + sw-ani-speed="150" — outro lado, mais sensível
<div sw-ani="marquee scrub" sw-ani-dir="right" sw-ani-speed="150" class="t-xg fw7 t-pri">
  <span>Projetos entregues em 2026 ·&nbsp;</span>
</div>

Tabela de opções

PalavraO que fazExemplo
Peças
sw-ani="track"O bloco que prende na tela. Coloque ov-hi para a fileira não vazar para fora da página.<section sw-ani="track" class="ov-hi">
sw-ani-trackA fileira que anda. Filho direto do bloco. Precisa ser lado a lado: classe flx.<div sw-ani-track class="flx gap-3">
sw-ani-sectionCada cartão. Filho direto da fileira. Precisa de largura e de f-sh0 (não encolher). Mínimo de 2.<div sw-ani-section class="f-sh0">
Ajustes (no bloco)
sw-ani-endQuanto de rolagem a travessia inteira consome (% da tela, vh ou px). Menor = mais rápido. Padrão: 100% por cartão.sw-ani-end="300%"
sw-ani-dirright inverte: começa mostrando o último cartão e anda para a direita. Padrão: esquerda.sw-ani-dir="right"
sw-ani-scrubSegundos de "atraso macio" da fileira atrás da rolagem. Padrão 0,8.sw-ani-scrub="2"
data-sw-end-sm / -md / -lgTravessia diferente por tamanho de tela (menor que 768 px / até 1199 px / 1200 px ou mais). Escreva com data-sw-.data-sw-end-sm="200%"
O que o SW Core escreve no bloco enquanto anda
data-sw-activeNúmero do cartão da vez (1, 2, 3…). Dá para usar no seu CSS.[data-sw-active="3"] .contador { … }
--sw-progressVariável CSS de 0 a 1 com o quanto da travessia já foi feito..barra { transform: scaleX(var(--sw-progress)); }

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Essa seção prende a tela de verdade e se solta da moldura enquanto você rola — role bem devagar pra ver o efeito.

Passo 1

Você escolhe

Passo 2

A gente prepara

Passo 3

Chega na sua casa

<section sw-ani="track" class="h-v ov-hi">
  <div sw-ani-track class="flx h-fl">
    <div sw-ani-section class="f-sh0 w-fl h-fl">Passo 1 — Você escolhe</div>
    <div sw-ani-section class="f-sh0 w-fl h-fl">Passo 2 — A gente prepara</div>
    <div sw-ani-section class="f-sh0 w-fl h-fl">Passo 3 — Chega na sua casa</div>
  </div>
</section>

<!-- w-fl: cada painel tem a largura do bloco; h-v: o bloco ocupa a tela toda -->

Essa seção prende a tela de verdade e se solta da moldura enquanto você rola — role bem devagar pra ver o efeito.

Trabalhos recentes

Cidade à noite
Hotel Centro · site e reservas
Café sendo preparado
Café Grão · loja virtual
Prédios coloridos
Imobiliária Sol · catálogo
Cachoeira
Eco Trilhas · agendamento
<style>
  .card-portfolio { width: 36rem; }
</style>
<section sw-ani="track" sw-ani-end="300%" class="h-v ov-hi flx f-cl j-ct gap-4">
  <h2>Trabalhos recentes</h2>
  <div sw-ani-track class="flx gap-4">
    <figure sw-ani-section class="card-portfolio f-sh0 bg-sur bd r-m ov-hi m-0">
      <img src="/portfolio/hotel.webp" width="720" height="480" alt="Site do Hotel Centro">
      <figcaption class="p-m"><strong>Hotel Centro</strong> · site e reservas</figcaption>
    </figure>
    <!-- … mais projetos … -->
  </div>
</section>
Mostrar "3 de 4" enquanto a fileira anda Referência
<p id="contador">1 de 4</p>

<script>
  const bloco = document.querySelector('[sw-ani="track"]');
  bloco.addEventListener('sw:progress', () => {
    document.getElementById('contador').textContent = bloco.dataset.swActive + ' de 4';
  });
</script>

Eventos

sw:progress
Disparado no bloco enquanto a fileira anda. e.detail.progress vai de 0 a 1. O número do cartão da vez fica em bloco.dataset.swActive.

API (JavaScript)

SWMotion.refresh()
Recalcula a travessia (use se você trocar os cartões ou o tamanho deles por JavaScript).

Precisa de quê

  • swcore.min.css + swcore.motion.min.css, e swcore.motion.min.js antes do swcore.min.js.

Cuidados — erros comuns

  • As três peças têm que ser pai → filho direto: bloco → fileira → cartões. Uma <div> a mais no meio e nada anda (aparece um aviso no console).
  • Sem flx na fileira, os cartões ficam um embaixo do outro e não há o que andar para o lado.
  • Sem largura (e sem f-sh0) os cartões se espremem para caber na tela, e a fileira não passa da largura do bloco — nada anda.
  • Esqueceu o ov-hi no bloco? Os cartões de fora aparecem vazando e a página ganha rolagem para o lado.
  • Não defina sw-ani-end muito pequeno com muitos cartões: a fileira passa rápido demais para alguém ler.

O que ele não faz

  • No celular, fileira presa com muitos cartões cansa: considere um carrossel de arrastar (sw-trilho) nas telas pequenas.
  • Todos os cartões são carregados junto com a página: com muitas fotos, use Lazy load nelas.
  • Quem ativou "reduzir movimento" no aparelho vê a fileira parada, sem prender: os cartões que não cabem ficam escondidos pelo ov-hi.