SW Core
SW Core / Animações / Cascade

Cascade Animações

Vários itens entrando um depois do outro — cartões, fotos, itens de lista — com um só atributo no bloco de fora.

O que é

Quando uma grade de cartões aparece toda de uma vez, fica sem graça; quando cada cartão entra um pouquinho depois do anterior, a seção ganha ritmo. É isso que o Cascade faz: você marca o bloco de fora com sw-ani="cascade" e cada item com sw-ani-item. Quando o bloco aparece na tela, os itens entram em sequência, com o efeito que você escolher.

O efeito de cada item é o mesmo vocabulário dos Efeitos de entrada (fade-up, zoom-in, wipe-l…), escolhido em sw-ani-fx. O intervalo entre um item e o próximo é sw-ani-gap (em segundos). Por padrão, se a pessoa rolar de volta para cima do bloco, os itens "saem" e entram de novo na próxima passagem; com sw-ani-once entram só uma vez. Precisa do pacote de animação.

Quando usar

  • Grade de serviços, produtos ou planos aparecendo em sequência.
  • Lista de vantagens ou passos de "como funciona".
  • Galeria de fotos com entrada suave.
  • Para um elemento só, não precisa: use sw-ani="fade-up one" direto nele.

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

    Marque o bloco com sw-ani="cascade" e cada item (filho direto) com sw-ani-item. Pronto: eles entram subindo, um depois do outro.

    Sites
    Lojas
    Agendamento

    <div sw-ani="cascade" class="l l-3 gap-4">
      <div sw-ani-item class="bg-sur bd p-m r-m">Sites</div>
      <div sw-ani-item class="bg-sur bd p-m r-m">Lojas</div>
      <div sw-ani-item class="bg-sur bd p-m r-m">Agendamento</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. O efeito de cada item (sw-ani-fx)

Todos os 37 efeitos de entrada funcionam. Sem sw-ani-fx, é fade-up. Os quadros animam quando aparecem na tela e de novo toda vez que você rola de cima para baixo por eles.

1
2
3
4
fade-up (padrão, sem sw-ani-fx) <div sw-ani="cascade" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="fade" <div sw-ani="cascade" sw-ani-fx="fade" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="fade-down" <div sw-ani="cascade" sw-ani-fx="fade-down" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="fade-left" <div sw-ani="cascade" sw-ani-fx="fade-left" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="fade-right" <div sw-ani="cascade" sw-ani-fx="fade-right" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="slide-up" <div sw-ani="cascade" sw-ani-fx="slide-up" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="slide-down" <div sw-ani="cascade" sw-ani-fx="slide-down" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="slide-left" <div sw-ani="cascade" sw-ani-fx="slide-left" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="slide-right" <div sw-ani="cascade" sw-ani-fx="slide-right" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="zoom-in" <div sw-ani="cascade" sw-ani-fx="zoom-in" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="zoom-out" <div sw-ani="cascade" sw-ani-fx="zoom-out" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="zoom-blur" <div sw-ani="cascade" sw-ani-fx="zoom-blur" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="scale" <div sw-ani="cascade" sw-ani-fx="scale" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="pop" <div sw-ani="cascade" sw-ani-fx="pop" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="blur" <div sw-ani="cascade" sw-ani-fx="blur" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="soft" <div sw-ani="cascade" sw-ani-fx="soft" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="drop" <div sw-ani="cascade" sw-ani-fx="drop" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="roll" <div sw-ani="cascade" sw-ani-fx="roll" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="swing" <div sw-ani="cascade" sw-ani-fx="swing" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="flip" <div sw-ani="cascade" sw-ani-fx="flip" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="flip-x" <div sw-ani="cascade" sw-ani-fx="flip-x" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="flip-y" <div sw-ani="cascade" sw-ani-fx="flip-y" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="3d-l" <div sw-ani="cascade" sw-ani-fx="3d-l" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="3d-r" <div sw-ani="cascade" sw-ani-fx="3d-r" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="3d-t" <div sw-ani="cascade" sw-ani-fx="3d-t" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="rotate-in" <div sw-ani="cascade" sw-ani-fx="rotate-in" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="skew-l" <div sw-ani="cascade" sw-ani-fx="skew-l" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="skew-r" <div sw-ani="cascade" sw-ani-fx="skew-r" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="tilt-up" <div sw-ani="cascade" sw-ani-fx="tilt-up" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="tilt-down" <div sw-ani="cascade" sw-ani-fx="tilt-down" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="tilt-left" <div sw-ani="cascade" sw-ani-fx="tilt-left" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="tilt-right" <div sw-ani="cascade" sw-ani-fx="tilt-right" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="wipe-l" <div sw-ani="cascade" sw-ani-fx="wipe-l" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="wipe-r" <div sw-ani="cascade" sw-ani-fx="wipe-r" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="wipe-t" <div sw-ani="cascade" sw-ani-fx="wipe-t" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="wipe-b" <div sw-ani="cascade" sw-ani-fx="wipe-b" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-fx="wipe-c" <div sw-ani="cascade" sw-ani-fx="wipe-c" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>

2. Ritmo entre os itens (sw-ani-gap)

Segundos entre um item e o próximo. Padrão 0,12. Vai de 0,02 a 2.

1
2
3
4
sw-ani-gap="0.04" — quase juntos <div sw-ani="cascade" sw-ani-gap="0.04" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
(padrão) — 0,12 s <div sw-ani="cascade" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-gap="0.3" — bem espaçado <div sw-ani="cascade" sw-ani-gap="0.3" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-gap="0.6" — um de cada vez <div sw-ani="cascade" sw-ani-gap="0.6" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>

3. Duração e jeito de cada entrada

sw-ani-dur é quanto cada item leva para entrar (segundos, padrão 0,72). sw-ani-ease é o "jeito" do movimento.

1
2
3
4
sw-ani-dur="0.3" — rápido <div sw-ani="cascade" sw-ani-dur="0.3" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-dur="1.6" — lento <div sw-ani="cascade" sw-ani-dur="1.6" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-ease="soft" — freia no fim (padrão) <div sw-ani="cascade" sw-ani-ease="soft" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-ease="smooth" — acelera e freia <div sw-ani="cascade" sw-ani-ease="smooth" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-ease="snap" — passa do ponto e volta <div sw-ani="cascade" sw-ani-fx="zoom-in" sw-ani-ease="snap" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-ease="linear" — velocidade constante <div sw-ani="cascade" sw-ani-ease="linear" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>

4. Quando começa e quantas vezes

sw-ani-start diz quão cedo começa: early (assim que aparece a pontinha), normal (padrão) ou late (quando já está bem dentro da tela). sw-ani-once faz entrar uma vez só.

1
2
3
4
sw-ani-start="early" — começa cedo <div sw-ani="cascade" sw-ani-start="early" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-start="late" — começa tarde <div sw-ani="cascade" sw-ani-start="late" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
sw-ani-once — só na primeira vez <div sw-ani="cascade" sw-ani-once class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>
1
2
3
4
cascade scrub — os itens entram conforme você rola (preso à rolagem) <div sw-ani="cascade scrub" class="flx gap-2"> <div sw-ani-item>1</div> <div sw-ani-item>2</div> <div sw-ani-item>3</div> <div sw-ani-item>4</div> </div>

Tabela de opções

PalavraO que fazExemplo
Peças
sw-ani="cascade"No bloco de fora. Liga a entrada em sequência.<div sw-ani="cascade">
sw-ani-itemEm cada item que vai entrar. Tem que ser filho direto do bloco.<div sw-ani-item>
Ajustes
sw-ani-fxEfeito de cada item: fade-up · fade · fade-down · fade-left · fade-right · slide-up · slide-down · slide-left · slide-right · zoom-in · zoom-out · zoom-blur · scale · pop · blur · soft · drop · roll · swing · flip · flip-x · flip-y · 3d-l · 3d-r · 3d-t · rotate-in · skew-l · skew-r · tilt-up · tilt-down · tilt-left · tilt-right · wipe-l · wipe-r · wipe-t · wipe-b · wipe-c. Padrão fade-up.sw-ani-fx="zoom-in"
sw-ani-gapSegundos entre um item e o próximo (0,02 a 2). Padrão 0,12.sw-ani-gap="0.2"
sw-ani-durSegundos que cada item leva para entrar (0,1 a 10). Padrão 0,72.sw-ani-dur="1"
sw-ani-easesoft (padrão) · smooth · snap · linear.sw-ani-ease="snap"
sw-ani-startearly · normal (padrão) · late.sw-ani-start="late"
sw-ani-onceEntra só na primeira vez (não repete ao rolar de volta).sw-ani-once
scrubPalavra junto do cascade: a entrada acompanha a barra de rolagem.sw-ani="cascade scrub"
sw-ani-endCom scrub: onde a sequência termina. Padrão "bottom center" (quando o fim do bloco chega no meio da tela).sw-ani-end="bottom top"

Receitas prontas — usos reais

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

Grade de serviços com ícones Ao vivo

Site institucional

Sua empresa apresentada do jeito certo.

Loja virtual

Venda 24 horas, com Pix e cartão.

Agendamento

Clientes marcam sozinhos, sem ligação.

<div sw-ani="cascade" sw-ani-fx="fade-up" sw-ani-gap="0.15" class="l l-3 gap-4">
  <div sw-ani-item class="bg-sur bd p-g r-m">
    <i class="swi-rocket t-pri"></i>
    <h3>Site institucional</h3>
    <p class="t-p op-8">Sua empresa apresentada do jeito certo.</p>
  </div>
  <div sw-ani-item class="bg-sur bd p-g r-m">…</div>
  <div sw-ani-item class="bg-sur bd p-g r-m">…</div>
</div>
Lista de vantagens entrando pela lateral Ao vivo
  • Entrega no mesmo dia
  • Troca sem burocracia
  • Parcelamento em 10x
  • Atendimento por WhatsApp

<ul sw-ani="cascade" sw-ani-fx="fade-right" sw-ani-gap="0.1" sw-ani-once>
  <li sw-ani-item><i class="swi-check"></i> Entrega no mesmo dia</li>
  <li sw-ani-item><i class="swi-check"></i> Troca sem burocracia</li>
  <li sw-ani-item><i class="swi-check"></i> Parcelamento em 10x</li>
  <li sw-ani-item><i class="swi-check"></i> Atendimento por WhatsApp</li>
</ul>
Galeria de fotos que "estoura" em sequência Ao vivo
Morangos Legumes Frutas Café

<div sw-ani="cascade" sw-ani-fx="pop" sw-ani-gap="0.08" class="l l-4 gap-3">
  <img sw-ani-item src="/galeria/1.webp" width="400" height="300" alt="Morangos">
  <img sw-ani-item src="/galeria/2.webp" width="400" height="300" alt="Legumes">
  <img sw-ani-item src="/galeria/3.webp" width="400" height="300" alt="Frutas">
  <img sw-ani-item src="/galeria/4.webp" width="400" height="300" alt="Café">
</div>
Repetir a entrada por código (ex.: depois de filtrar a lista) Referência
<script>
  const grade = document.querySelector('#produtos');
  SWMotion.play(grade);   // os itens entram de novo, em sequência
</script>

API (JavaScript)

SWMotion.play(bloco)
Faz os itens do cascade entrarem de novo, na hora (sem esperar a rolagem).
SWMotion.refresh()
Refaz todas as animações do pacote (use depois de trocar a lista inteira 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

  • O sw-ani-item tem que ser filho direto do bloco. Se houver uma <div> no meio, nada entra (e aparece um aviso no console).
  • Para mudar o ritmo, use sw-ani-gap. O sw-ani-stagger (usado no texto) não vale aqui. (A forma antiga data-sw-gap continua funcionando.)
  • Para "uma vez só", use sw-ani-once. Sem ele, os itens somem e entram de novo toda vez que você rola para cima e volta.
  • Não coloque sw-ani="fade-up one" nos itens e cascade no bloco: os dois brigam pelo mesmo movimento.
  • Efeito com nome errado em sw-ani-fx não quebra a página: ele usa fade-up e avisa no console.
  • Com dezenas de itens, use um sw-ani-gap pequeno (0,04–0,06): senão o último demora muito para aparecer.

O que ele não faz

  • sw-ani-start aceita só early, normal e late (sem posição livre).
  • Quem ativou "reduzir movimento" no aparelho vê os itens já no lugar.
  • Itens colocados na lista depois (por JavaScript) só entram na animação depois de SWMotion.refresh().