SW Core
SW Core / Animações / SVG Draw (traço)

SVG Draw (traço) Animações

O contorno de um desenho SVG se desenha sozinho, como se fosse feito à mão, quando aparece na tela — sw-ani="svg-draw".

O que é

Pega uma linha de um desenho SVG (uma curva, um "check", uma assinatura, um círculo) e faz ela aparecer sendo traçada, do começo ao fim. Serve para sublinhar um título, mostrar um "pedido confirmado", desenhar a rota entre etapas ou dar vida a uma ilustração de linha.

O atributo vai na própria linha (<path>, <circle>, <polyline>…), não no <svg>. O SW Core mede sozinho o comprimento da linha, esconde e vai revelando. Por padrão ele desenha em meio segundo quando a linha chega a 85% da altura da tela, e apaga de novo se você rolar de volta para cima. Com a palavra scrub o desenho fica preso à rolagem: avança quando você desce, volta quando você sobe.

Quando usar

  • Sublinhado ou rabisco em título de página de vendas: uma curva embaixo da palavra-chave.
  • Confirmação (pedido feito, cadastro concluído): um "check" que se desenha.
  • Rota, linha do tempo ou passo a passo: a linha ligando as etapas vai sendo traçada conforme a pessoa desce — use scrub.
  • Ilustração ou assinatura exportada do Figma/Illustrator como linha (sem preenchimento).

Comece aqui

  1. 1

    Coloque o SW Core e o pacote de animação. O swcore.motion.min.js já traz o GSAP dentro e tem que vir antes do swcore.min.js.

    <!-- no <head> -->
    <link rel="stylesheet" href="swcore/swcore.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

    Coloque sw-ani="svg-draw" na linha do desenho. Ela precisa de fill="none" e de um stroke (a cor do traço). Role a página até aqui e veja: ele se desenha ao aparecer.

    <svg viewBox="0 0 120 40" width="240" height="80" class="t-pri">
      <path sw-ani="svg-draw" d="M4 30 Q 30 4 60 22 T 116 12"
            fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/>
    </svg>

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. Desenha quando aparece (padrão)

Sem nenhuma palavra extra: desenha em meio segundo quando a linha entra na tela e apaga se você rolar de volta para cima. Role para cima e para baixo para ver de novo.

Curva simples <svg viewBox="0 0 120 40" width="200" height="66" class="t-pri"> <path sw-ani="svg-draw" d="M4 30 Q 30 4 60 22 T 116 12" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/> </svg>
Assinatura / rabisco <svg viewBox="0 0 240 80" width="200" height="66" class="t-pri"> <path sw-ani="svg-draw" d="M10 55 C 30 10, 50 10, 60 45 S 80 70, 95 40 S 120 5, 140 45 S 170 75, 200 30 L 230 45" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/> </svg>
Várias linhas, cada uma com o seu atributo <svg viewBox="0 0 200 100" width="200" height="100"> <path sw-ani="svg-draw" class="t-pri" d="M20 80 L 60 30" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/> <path sw-ani="svg-draw" class="t-suc" d="M60 30 L 100 70" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/> <path sw-ani="svg-draw" class="t-ale" d="M100 70 L 140 20" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/> <path sw-ani="svg-draw" class="t-err" d="M140 20 L 180 50" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/> </svg>

2. Espessura, cor e ponta

Espessura, cor e ponta são do próprio SVG (stroke-width, stroke, stroke-linecap), não do SW Core. Dica: use stroke="currentColor" e uma classe de cor de texto (t-pri, t-suc…) — assim o traço acompanha o tema claro e escuro.

Fino (stroke-width="1") <svg viewBox="0 0 120 40" width="200" height="66" class="t-pri"> <path sw-ani="svg-draw" d="M4 30 Q 30 4 60 22 T 116 12" fill="none" stroke="currentColor" stroke-width="1"/> </svg>
Grosso com ponta redonda <svg viewBox="0 0 120 40" width="200" height="66" class="t-err"> <path sw-ani="svg-draw" d="M4 30 Q 30 4 60 22 T 116 12" fill="none" stroke="currentColor" stroke-width="7" stroke-linecap="round"/> </svg>
Cor de sucesso (t-suc) <svg viewBox="0 0 120 40" width="200" height="66" class="t-suc"> <path sw-ani="svg-draw" d="M4 30 Q 30 4 60 22 T 116 12" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/> </svg>
Cor fixa (qualquer cor) <svg viewBox="0 0 120 40" width="200" height="66"> <path sw-ani="svg-draw" d="M4 30 Q 30 4 60 22 T 116 12" fill="none" stroke="#f97316" stroke-width="3" stroke-linecap="round"/> </svg>

3. Outras formas além do

Funciona em qualquer forma de linha do SVG: <polyline>, <line>, <circle>, <rect>. O círculo começa a ser desenhado pela direita (3 horas); o retângulo, pelo canto de cima à esquerda.

polyline — um "check" <svg viewBox="0 0 24 24" width="72" height="72" class="t-suc"> <polyline sw-ani="svg-draw" points="4 12 10 18 20 6" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/> </svg>
circle — um anel <svg viewBox="0 0 60 60" width="72" height="72" class="t-pri"> <circle sw-ani="svg-draw" cx="30" cy="30" r="24" fill="none" stroke="currentColor" stroke-width="3"/> </svg>
rect — uma moldura <svg viewBox="0 0 100 60" width="120" height="72" class="t-inf"> <rect sw-ani="svg-draw" x="4" y="4" width="92" height="52" rx="4" fill="none" stroke="currentColor" stroke-width="2.5"/> </svg>
line — um traço reto <svg viewBox="0 0 120 10" width="200" height="16" class="t-pri"> <line sw-ani="svg-draw" x1="2" y1="5" x2="118" y2="5" stroke="currentColor" stroke-width="3" stroke-linecap="round"/> </svg>

4. Preso à rolagem (scrub)

Acrescente a palavra scrub: o desenho avança conforme você desce e volta conforme você sobe — quem controla é a barra de rolagem. Com sw-ani-scrub="1" ele "persegue" a rolagem com 1 segundo de suavidade.

sw-ani="svg-draw scrub" <svg viewBox="0 0 240 80" width="200" height="66" class="t-pri"> <path sw-ani="svg-draw scrub" d="M10 55 C 30 10, 50 10, 60 45 S 80 70, 95 40 S 120 5, 140 45 S 170 75, 200 30 L 230 45" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/> </svg>
scrub com suavidade de 1 s <svg viewBox="0 0 240 80" width="200" height="66" class="t-sec"> <path sw-ani="svg-draw" sw-ani-scrub="1" d="M10 55 C 30 10, 50 10, 60 45 S 80 70, 95 40 S 120 5, 140 45 S 170 75, 200 30 L 230 45" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/> </svg>

Tabela de opções

PalavraO que fazExemplo
Onde colocar
sw-ani="svg-draw"Liga o efeito. Vai na linha (<path>, <polyline>, <line>, <circle>, <rect>…), nunca no <svg>.<path sw-ani="svg-draw" …/>
Gatilho
(nenhum)Padrão: desenha em meio segundo quando a linha chega a 85% da altura da tela; apaga ao rolar de volta para cima.sw-ani="svg-draw"
scrubPalavra dentro do sw-ani: o desenho fica preso à barra de rolagem.sw-ani="svg-draw scrub"
sw-ani-scrubMesma coisa, com um número = segundos de suavidade (a linha "persegue" a rolagem).sw-ani-scrub="1"
Aparência (do próprio SVG)
fill="none"Obrigatório: é o contorno que anima, não o preenchimento.fill="none"
strokeCor do traço. currentColor + classe t-pri/t-suc… segue o tema.stroke="currentColor"
stroke-widthEspessura do traço.stroke-width="3"
stroke-linecapPonta do traço: round (redonda) fica mais "desenhado à mão".stroke-linecap="round"
Avançado
data-sw-forceAnima mesmo para quem ativou "reduzir movimento" no sistema (por padrão essa pessoa vê o traço já pronto).<path sw-ani="svg-draw" data-sw-force …/>

Receitas prontas — usos reais

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

Rabisco embaixo da palavra-chave do título Ao vivo

Seu site pronto em 7 dias

<h2>Seu site
  <span class="rel iflx f-cl alc">pronto
    <svg viewBox="0 0 120 16" width="140" height="18" class="t-pri">
      <path sw-ani="svg-draw" d="M3 11 C 30 3, 70 3, 117 9"
            fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round"/>
    </svg>
  </span>
  em 7 dias</h2>
Pedido confirmado Ao vivo
Pedido confirmado! Enviamos os detalhes para o seu e-mail.
<div class="flx f-cl alc gap-3 t-ct">
  <svg viewBox="0 0 60 60" width="96" height="96" class="t-suc">
    <circle sw-ani="svg-draw" cx="30" cy="30" r="26" fill="none" stroke="currentColor" stroke-width="3"/>
    <polyline sw-ani="svg-draw" points="18 31 26 39 43 22" fill="none" stroke="currentColor" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/>
  </svg>
  <strong class="t-g">Pedido confirmado!</strong>
  <span class="t-mut">Enviamos os detalhes para o seu e-mail.</span>
</div>
Rota entre as etapas, desenhada pela rolagem Ao vivo
1. Briefing2. Layout3. No ar
<svg viewBox="0 0 300 60" class="w-fl t-pri" height="70">
  <path sw-ani="svg-draw scrub" d="M20 30 C 70 0, 110 60, 150 30 S 230 0, 280 30"
        fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/>
</svg>
<div class="flx j-sb w-fl">
  <span>1. Briefing</span><span>2. Layout</span><span>3. No ar</span>
</div>

API (JavaScript)

SWMotion.refresh()
Se você colocou HTML novo na página depois que ela carregou (AJAX, JS), chame para o SW Core enxergar as linhas novas. Ele reinicia todas as animações da página.

Precisa de quê

  • swcore.motion.min.js (já traz o GSAP) e swcore.motion.min.css, carregados antes do swcore.min.js.
  • Um SVG com linha de verdade: fill="none" e um stroke visível.

Cuidados — erros comuns

  • Colocar sw-ani="svg-draw" no <svg> não faz nada (aparece um aviso no console). O atributo vai em cada linha que você quer desenhar.
  • Desenho com preenchimento (fill colorido) não "se desenha": o preenchimento aparece inteiro de cara. Deixe fill="none".
  • Linha tracejada (stroke-dasharray) perde o tracejado: o efeito usa essa mesma propriedade para esconder e revelar.
  • Texto (<text>) não é linha. Para "escrever" uma palavra, converta o texto em contorno (path) no editor de vetor.
  • Ícone exportado de biblioteca costuma vir com preenchimento, não com linha — confira se o SVG é "outline/stroke".
  • Quer só um traço simples sem GSAP? Existe o mini-componente sw-draw, em CSS puro — veja Mini-componentes animados.

O que ele não faz

  • A velocidade do desenho automático não é configurável (fica em meio segundo). Para controlar o ritmo, use scrub e deixe a rolagem mandar.
  • O ponto de partida é fixo (quando a linha chega a 85% da altura da tela).
  • Quem ativou "reduzir movimento" no sistema vê o traço já pronto, sem animação (a menos que você use data-sw-force).