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
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
Marque o bloco com
sw-ani="cascade"e cada item (filho direto) comsw-ani-item. Pronto: eles entram subindo, um depois do outro.SitesLojasAgendamento<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.
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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.
<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>
<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>
<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>
<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.
<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>
<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>
<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>
<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>
<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>
<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ó.
<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>
<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>
<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>
<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
| Palavra | O que faz | Exemplo |
|---|---|---|
| Peças | ||
sw-ani="cascade" | No bloco de fora. Liga a entrada em sequência. | <div sw-ani="cascade"> |
sw-ani-item | Em cada item que vai entrar. Tem que ser filho direto do bloco. | <div sw-ani-item> |
| Ajustes | ||
sw-ani-fx | Efeito 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-gap | Segundos entre um item e o próximo (0,02 a 2). Padrão 0,12. | sw-ani-gap="0.2" |
sw-ani-dur | Segundos que cada item leva para entrar (0,1 a 10). Padrão 0,72. | sw-ani-dur="1" |
sw-ani-ease | soft (padrão) · smooth · snap · linear. | sw-ani-ease="snap" |
sw-ani-start | early · normal (padrão) · late. | sw-ani-start="late" |
sw-ani-once | Entra só na primeira vez (não repete ao rolar de volta). | sw-ani-once |
scrub | Palavra junto do cascade: a entrada acompanha a barra de rolagem. | sw-ani="cascade scrub" |
sw-ani-end | Com 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.
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>
- 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>
<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>
<script>
const grade = document.querySelector('#produtos');
SWMotion.play(grade); // os itens entram de novo, em sequência
</script>
API (JavaScript)
SWMotion.play(bloco)SWMotion.refresh()Precisa de quê
swcore.min.css+swcore.motion.min.css, eswcore.motion.min.jsantes doswcore.min.js.
Cuidados — erros comuns
- O
sw-ani-itemtem 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. Osw-ani-stagger(usado no texto) não vale aqui. (A forma antigadata-sw-gapcontinua 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-fxnão quebra a página: ele usafade-upe avisa no console. - Com dezenas de itens, use um
sw-ani-gappequeno (0,04–0,06): senão o último demora muito para aparecer.
O que ele não faz
sw-ani-startaceita sóearly,normalelate(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().

