SW Core
SW Core / Animações / Motion Path

Motion Path Animações

Um ícone ou objeto anda por cima de uma linha desenhada por você — preso à rolagem ou sozinho. sw-ani="motion-path" + sw-ani-path.

O que é

Você desenha um caminho (uma curva em SVG) e escolhe um elemento — um ícone, um avião de papel, uma caixinha — para percorrer esse caminho. Por padrão, quem manda é a rolagem: desceu a página, o objeto avança; subiu, ele volta. Também dá para ele andar sozinho quando aparece na tela, uma vez ou indo e voltando sem parar.

São duas peças, lado a lado dentro da mesma caixa: o <svg sw-ani-path> com o caminho (um <path> dentro) e o elemento com sw-ani="motion-path", que anda por cima. A linha-guia pode ficar visível, clarinha ou invisível — o objeto segue o traçado de qualquer jeito.

Quando usar

  • "Seu pedido a caminho": um pacote que vai de um ponto a outro conforme a pessoa rola.
  • Topo de página com personalidade: um avião de papel ou foguete cruzando a tela em curva.
  • Linha do tempo / etapas: um marcador que desce pela linha enquanto a pessoa lê.
  • Detalhe decorativo que anda sozinho (bolinha orbitando, ícone passeando): sw-ani-play="auto".

Comece aqui

  1. 1

    Coloque o SW Core e o pacote de animação (o swcore.motion.min.js já traz o GSAP e vem antes do swcore.min.js). O segundo CSS só é preciso se usar ícones swi-*.

    <!-- no <head> -->
    <link rel="stylesheet" href="swcore/swcore.min.css">
    <link rel="stylesheet" href="swcore/swcore.compl.min.css">
    <link rel="stylesheet" href="swcore/swcore.motion.min.css">
    
    <!-- no fim do <body>: o motion ANTES do swcore -->
    <script src="swcore/swcore.motion.min.js"></script>
    <script src="swcore/swcore.min.js"></script>
  2. 2

    Dentro de uma caixa com class="rel", coloque o SVG com o caminho (sw-ani-path) e, ao lado dele, o elemento que anda (sw-ani="motion-path"). Role a página devagar: o coração acompanha.

    <div class="rel">
      <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3">
        <path d="M10,60 Q85,0 160,60 T310,60" fill="none" stroke="currentColor" stroke-width="2"/>
      </svg>
      <i sw-ani="motion-path" class="swi-heart abs pin-t pin-l t-pri t-gg"></i>
    </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. Preso à rolagem (padrão)

O objeto sai do começo da linha quando ela aparece embaixo da tela e chega ao fim quando ela some em cima. Role devagar, para cima e para baixo.

Linha-guia clarinha (op-3) <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3"> <path d="M10,60 Q85,0 160,60 T310,60" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path" class="swi-heart abs pin-t pin-l t-pri t-gg"></i> </div>
Linha-guia invisível (op-0) <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-0"> <path d="M10,110 C 90,0 230,0 310,110" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path" class="swi-send abs pin-t pin-l t-pri t-gg"></i> </div>
Linha tracejada visível <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-5"> <path d="M10,100 C 60,10 120,120 170,60 S 260,10 310,90" fill="none" stroke="currentColor" stroke-width="2" stroke-dasharray="5 5"/> </svg> <i sw-ani="motion-path" class="swi-package abs pin-t pin-l t-suc t-gg"></i> </div>

2. Andando sozinho (sw-ani-play="auto")

Com sw-ani-play="auto" a rolagem não manda mais: o objeto percorre a linha sozinho quando ela chega a 85% da altura da tela. sw-ani-duration muda o tempo (em segundos) e sw-ani-repeat="true" faz ir e voltar sem parar.

Uma vez (2,4 s, o padrão) <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3"> <path d="M10,60 Q85,0 160,60 T310,60" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path" sw-ani-play="auto" class="swi-star abs pin-t pin-l t-ale t-gg"></i> </div>
Mais devagar (sw-ani-duration="6") <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3"> <path d="M10,60 Q85,0 160,60 T310,60" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path" sw-ani-play="auto" sw-ani-duration="6" class="swi-star abs pin-t pin-l t-ale t-gg"></i> </div>
Vai e volta sem parar (sw-ani-repeat) <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3"> <path d="M10,110 C 90,0 230,0 310,110" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path" sw-ani-play="auto" sw-ani-repeat="true" class="swi-rocket abs pin-t pin-l t-pri t-gg"></i> </div>

3. Suavidade na rolagem

No modo de rolagem, o objeto "persegue" a posição da página com 0,6 s de suavidade. Você pode mudar: scrub sozinho cola na rolagem sem atraso; sw-ani-scrub="2" deixa bem macio.

Sem atraso (sw-ani="motion-path scrub") <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3"> <path d="M10,60 Q85,0 160,60 T310,60" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path scrub" class="swi-heart abs pin-t pin-l t-err t-gg"></i> </div>
Bem macio (sw-ani-scrub="2") <div class="rel"> <svg sw-ani-path viewBox="0 0 320 120" class="w-fl blk op-3"> <path d="M10,60 Q85,0 160,60 T310,60" fill="none" stroke="currentColor" stroke-width="2"/> </svg> <i sw-ani="motion-path" sw-ani-scrub="2" class="swi-heart abs pin-t pin-l t-err t-gg"></i> </div>

Tabela de opções

PalavraO que fazExemplo
As duas peças
sw-ani-pathNo <svg> que tem o caminho. O SW Core usa o primeiro <path> de dentro dele.<svg sw-ani-path viewBox="…"><path d="…"/></svg>
sw-ani="motion-path"No elemento que anda. Tem que estar na mesma caixa (mesmo pai) que o SVG.<i sw-ani="motion-path" class="swi-heart"></i>
Gatilho
(nenhum)Padrão: preso à rolagem, com 0,6 s de suavidade. Anda enquanto o SVG atravessa a tela, de baixo até em cima.sw-ani="motion-path"
scrubPalavra no sw-ani: preso à rolagem sem atraso nenhum.sw-ani="motion-path scrub"
sw-ani-scrubSegundos de suavidade no modo rolagem.sw-ani-scrub="2"
sw-ani-play="auto"Anda sozinho, uma vez, quando o SVG chega a 85% da altura da tela.sw-ani-play="auto"
sw-ani-durationSó no modo auto: tempo do percurso em segundos (de 0,3 a 20). Padrão 2,4.sw-ani-duration="6"
sw-ani-repeat="true"Só no modo auto: vai e volta sem parar. (A forma antiga data-sw-repeat="true" também funciona.)sw-ani-repeat="true"
Avançado
data-sw-forceAnima mesmo para quem ativou "reduzir movimento" no sistema.data-sw-force

Receitas prontas — usos reais

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

Pedido a caminho (acompanha a rolagem) Ao vivo
Loja Sua casa
<div class="bg-sur bd r-m p-3">
  <div class="flx j-sb">
    <span><i class="swi-store"></i> Loja</span>
    <span><i class="swi-map-pin"></i> Sua casa</span>
  </div>
  <div class="rel">
    <svg sw-ani-path viewBox="0 0 320 80" class="w-fl blk op-3">
      <path d="M10,60 C 80,10 140,70 200,35 S 280,20 310,60"
            fill="none" stroke="currentColor" stroke-width="2" stroke-dasharray="6 6"/>
    </svg>
    <i sw-ani="motion-path" class="swi-package abs pin-t pin-l t-pri t-gg"></i>
  </div>
</div>
Avião de papel cruzando o topo da página Ao vivo

Fale com a gente

<section class="rel topo">
  <h1>Fale com a gente</h1>
  <!-- caminho invisível ocupando a seção toda -->
  <svg sw-ani-path viewBox="0 0 320 120" class="abs pin op-0">
    <path d="M-20,110 C 80,-20 220,140 340,10" fill="none" stroke="currentColor"/>
  </svg>
  <i sw-ani="motion-path" sw-ani-play="auto" sw-ani-duration="4" sw-ani-repeat="true"
     class="swi-send abs pin-t pin-l t-xg"></i>
</section>
Marcador descendo pela linha do tempo Ao vivo
2019 — primeiro cliente 2022 — 100 sites no ar 2026 — sistema próprio
<div class="flx gap-4">
  <div class="rel">
    <svg sw-ani-path viewBox="0 0 20 200" width="20" height="200" class="blk op-3">
      <path d="M10,5 L10,195" fill="none" stroke="currentColor" stroke-width="2"/>
    </svg>
    <i sw-ani="motion-path scrub" class="swi-check-circle abs pin-t pin-l t-suc t-g"></i>
  </div>
  <div class="flx f-cl j-sb">
    <span><strong>2019</strong> — primeiro cliente</span>
    <span><strong>2022</strong> — 100 sites no ar</span>
    <span><strong>2026</strong> — sistema próprio</span>
  </div>
</div>

API (JavaScript)

SWMotion.refresh()
Se o HTML entrou na página depois que ela carregou (AJAX, JS), chame para o SW Core montar o percurso. Reinicia todas as animações da página.

Precisa de quê

  • swcore.motion.min.js (já traz o GSAP com o plugin de caminho) e swcore.motion.min.css, antes do swcore.min.js.
  • swcore.compl.min.css só se o objeto que anda for um ícone swi-*.

Cuidados — erros comuns

  • O SVG e o objeto precisam ser irmãos (mesmo pai). Se o SW Core não achar um sw-ani-path ao lado, ele usa o primeiro da página inteira — e o objeto vai andar na linha errada.
  • Um sw-ani-path por caixa. Dois caminhos na mesma caixa: vale só o primeiro.
  • O caminho tem que ser <path>. <circle>, <rect> e <line> dentro do SVG são ignorados — converta para path no editor de vetor.
  • O "vai e volta" (sw-ani-repeat="true") só funciona junto com sw-ani-play="auto".
  • Sem abs pin-t pin-l no objeto ele ocupa espaço embaixo do SVG antes de começar a andar, empurrando o resto da página.

O que ele não faz

  • O objeto não gira acompanhando a curva — ele só se desloca. Um avião continua apontando para o mesmo lado o percurso todo.
  • O ponto em que o percurso começa e termina na rolagem é fixo (do SVG entrar embaixo até sair em cima).
  • Quem ativou "reduzir movimento" no sistema vê o objeto parado no caminho.