SW Core
SW Core / Animações / Cursor personalizado

Cursor personalizado Animações

Troca ou acompanha a setinha do mouse na página inteira: um ponto, um anel, a sua logo — com movimento liso ou elástico. sw-ani="cursor" no <body>.

O que é

Cria um cursor desenhado que segue o mouse pela página toda. Pode ser um ponto, um anel ou uma imagem (a sua logo), pode "colar" no ponteiro ou vir atrás dele com atraso, e pode até se mover como uma mola, esticando e inclinando conforme a velocidade. Em cima de links e botões ele cresce, para mostrar que ali dá para clicar.

Você coloca sw-ani="cursor" no <body> e escolhe o tipo em sw-ani-cursor. Todas as outras opções também são sw-ani-cursor-… (tamanho, cor, imagem, física). O cursor novo só aparece em aparelho com mouse; no celular e no tablet nada muda. Por padrão a setinha do sistema continua lá, por baixo — para escondê-la, use sw-ani-cursor-hide-native.

Quando usar

  • Portfólio, agência, fotógrafo, estúdio: sites em que a experiência faz parte do produto.
  • Landing de campanha ou lançamento, com a logo seguindo o mouse.
  • Evite em loja, formulário, painel administrativo e site de conteúdo: ali o visitante quer a setinha de sempre.

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).

    <!-- 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="cursor" e o tipo no <body>. Pronto: vale para a página inteira.

    <body sw-ani="cursor" sw-ani-cursor="ring">
      …seu site…
    </body>

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. Tipo (sw-ani-cursor)

O cursor vale para a página inteira, então aqui cada quadro é um botão: clique para ligar aquela versão nesta página e mexa o mouse. "Desligar" volta ao normal. (Só funciona com mouse — no celular não aparece nada.)

Desligar — volta ao cursor normal <body> <!-- sem sw-ani="cursor" -->
dot — ponto (padrão) <body sw-ani="cursor" sw-ani-cursor="dot">
ring — anel <body sw-ani="cursor" sw-ani-cursor="ring">
image — a sua logo <body sw-ani="cursor" sw-ani-cursor="image" sw-ani-cursor-img="/logo-clara.webp" sw-ani-cursor-img-light="/logo-escura.webp" sw-ani-cursor-size="44">

2. Tamanho e cor

O tamanho é em pixels (padrão 10). A cor padrão é branca com "mistura de diferença": ela se inverte sobre o que está embaixo, então aparece em fundo claro e escuro. Com outra cor, troque a mistura para normal.

sw-ani-cursor-size="24" <body sw-ani="cursor" sw-ani-cursor="dot" sw-ani-cursor-size="24">
Anel de 40 px <body sw-ani="cursor" sw-ani-cursor="ring" sw-ani-cursor-size="40">
Cor da marca, mistura normal <body sw-ani="cursor" sw-ani-cursor="dot" sw-ani-cursor-size="14" sw-ani-cursor-color="var(--sw-pri)" sw-ani-cursor-mix="normal">
Esconder a setinha do sistema <body sw-ani="cursor" sw-ani-cursor="ring" sw-ani-cursor-size="28" sw-ani-cursor-hide-native>

3. Movimento

sw-ani-cursor-lerp diz o quanto ele "alcança" o ponteiro a cada quadro: 1 = colado, 0.05 = bem atrasado (padrão 0.16). sw-ani-cursor-physics="elastic" troca por uma mola: vem atrás, estica e inclina conforme a velocidade, e fica um pouco ao lado do ponteiro.

lerp="1" — colado <body sw-ani="cursor" sw-ani-cursor="ring" sw-ani-cursor-size="28" sw-ani-cursor-lerp="1">
lerp="0.05" — atrasado <body sw-ani="cursor" sw-ani-cursor="ring" sw-ani-cursor-size="28" sw-ani-cursor-lerp="0.05">
physics="elastic" — mola <body sw-ani="cursor" sw-ani-cursor="dot" sw-ani-cursor-size="18" sw-ani-cursor-physics="elastic">
Logo com mola <body sw-ani="cursor" sw-ani-cursor="image" sw-ani-cursor-img="/logo-clara.webp" sw-ani-cursor-img-light="/logo-escura.webp" sw-ani-cursor-size="56" sw-ani-cursor-physics="elastic">

4. Crescer em cima do que é clicável

Com o cursor ligado (ponto ou anel), passe o mouse por cima destes: links, botões, elementos com sw-ani="magnetic" e qualquer coisa marcada com data-sw-cursor-hover fazem ele crescer (3,6 vezes). No modo imagem ele não cresce.

Link ou botão — cresce sozinho <a href="/projeto" sw-btn="pri p">Ver projeto</a>
Foto do projeto
data-sw-cursor-hover em qualquer bloco <div data-sw-cursor-hover class="bg-sur bd r-m p-3">Foto do projeto</div>

Tabela de opções

PalavraO que fazExemplo
Ligar e tipo
sw-ani="cursor"Liga o cursor personalizado. Coloque no <body>.<body sw-ani="cursor">
sw-ani-cursordot (ponto, padrão) · ring (anel) · image (imagem).sw-ani-cursor="ring"
sw-ani-cursor-imgA imagem do cursor. Com ela, o tipo vira imagem.sw-ani-cursor-img="/logo.webp"
sw-ani-cursor-img-lightOutra imagem só para o tema claro (troca sozinha com o dia/noite).sw-ani-cursor-img-light="/logo-escura.webp"
Aparência
sw-ani-cursor-sizeTamanho em px, de 2 a 200. Padrão: 10.sw-ani-cursor-size="24"
sw-ani-cursor-colorCor do ponto (ou da borda do anel). Padrão: #fff.sw-ani-cursor-color="var(--sw-pri)"
sw-ani-cursor-mixComo a cor se mistura com o fundo (mix-blend-mode do CSS). Padrão: difference (inverte, aparece em qualquer fundo). Use normal para a cor aparecer como é.sw-ani-cursor-mix="normal"
sw-ani-cursor-hide-nativeSem valor. Esconde a setinha do sistema.sw-ani-cursor-hide-native
Movimento
sw-ani-cursor-lerpQuanto ele alcança o ponteiro a cada quadro, de 0.02 a 1. Padrão: 0.16. 1 = colado.sw-ani-cursor-lerp="0.08"
sw-ani-cursor-physicselastic = mola que estica e inclina. Sem ela: movimento liso.sw-ani-cursor-physics="elastic"
sw-ani-cursor-tensionSó no elastic: força da mola, de 0.005 a 1. Padrão: 0.042.sw-ani-cursor-tension="0.08"
sw-ani-cursor-frictionSó no elastic: freio da mola, de 0.5 a 0.99. Padrão: 0.84 (maior = balança mais).sw-ani-cursor-friction="0.9"
sw-ani-cursor-offset-x / -yDistância do ponteiro em px, de -200 a 200. Padrão: 0 (no elastic: 18 e 14).sw-ani-cursor-offset-x="0"
Crescer em cima
data-sw-cursor-hoverEm qualquer elemento da página: faz o cursor crescer em cima dele (links, botões e sw-ani="magnetic" já crescem sozinhos).<div data-sw-cursor-hover>…</div>
Avançado
data-sw-forceLiga o cursor mesmo para quem ativou "reduzir movimento" no sistema.<body sw-ani="cursor" data-sw-force>

Receitas prontas — usos reais

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

Portfólio: anel que cresce em cima dos trabalhos Referência
<body sw-ani="cursor" sw-ani-cursor="ring" sw-ani-cursor-size="28" sw-ani-cursor-hide-native>

  <a href="/projeto-1" class="trabalho">…</a>   <!-- link: cresce sozinho -->
  <figure data-sw-cursor-hover>…</figure>       <!-- bloco comum: marque para crescer -->

</body>
Logo elástica perseguindo o mouse (landing de campanha) Referência
<body sw-ani="cursor" sw-ani-cursor="image"
      sw-ani-cursor-img="/logo-clara.webp"
      sw-ani-cursor-img-light="/logo-escura.webp"
      sw-ani-cursor-size="64"
      sw-ani-cursor-physics="elastic">
Ponto na cor da marca, colado no ponteiro Referência
<body sw-ani="cursor" sw-ani-cursor="dot"
      sw-ani-cursor-size="12"
      sw-ani-cursor-color="var(--sw-pri)"
      sw-ani-cursor-mix="normal"
      sw-ani-cursor-lerp="1">

Precisa de quê

  • swcore.motion.min.js (já traz o GSAP) e swcore.motion.min.css, antes do swcore.min.js.
  • Mouse (ou caneta/trackpad). Em tela de toque o cursor não é criado.

Cuidados — erros comuns

  • sw-ani-cursor="image" sem sw-ani-cursor-img deixa o cursor invisível. Sempre informe a imagem.
  • Logo escura some no tema escuro (e clara some no claro): use sw-ani-cursor-img para o escuro e sw-ani-cursor-img-light para o claro.
  • Cor diferente de branco com a mistura padrão (difference) sai com a cor "invertida". Coloque sw-ani-cursor-mix="normal".
  • Se esconder a setinha do sistema (sw-ani-cursor-hide-native), garanta que o seu cursor apareça em todo fundo — senão o visitante "perde" o mouse.
  • Um só por página: coloque no <body>, não em vários elementos.

O que ele não faz

  • Não aparece em celular e tablet (sem mouse).
  • Quem ativou "reduzir movimento" no sistema não vê o cursor personalizado (a menos que você use data-sw-force).
  • Não tem como desligar por JavaScript depois de ligado: para tirar, recarregue a página sem o atributo.