Como Manipular e Animar SVG usando Snap.svg
Portuguese (Português) translation by Andre Rocha (you can also view the original English article)
Neste tutorial iremos introduzir Snap.svg, uma biblioteca de JavaScript que auxilia na animação e manipulação de conteudo SVG. Para demonstrar algumas das funcionalidades disponíveis, iremos animar um olho em SVG.
O que é Snap.svg?
Snap.svg é uma biblioteca de JavaScript que facilita a criação e manipulação de gráficos SVG para browsers modernos. É o sucessor para o Raphaël de Dmitry Baranovskiy; a biblioteca mais popular para trabalhos em SVG.
Raphäel
Raphäel.js é uma ótima biblioteca. Lançado em 2008, sua melhor característica era seu suporte para browsers do IE 5.5 em diante. Porém, o suporte para tantos browsers o limitava e significava que não podia implementar as últimas atualizações; ao invés disso, contava com funcionalidades comuns de SVG
Depois de algum tempo, a comunidade do Raphäel.js se dividiu em dois: um grupo que contava com sua compatibilidade entre os browsers, e o outro que o usava para criar SVGs. Este último grupo exigia mudanças para ter suporte a mais funcionalidades que o Raphäel.js não aguentava.
Então o Snap.svg foi criado, escrito do zero por Dmitry Baranovskiy (da equipe da Adobe Web Platform); para poder trabalhar mais facilmente com SVG e usar as mais novas funcionalidades oferecidas pelo SVG; funcionalidades como mascaras, gradientes, padrões, grupos, animações e mais.
O que pode ser feito com Snap.svg?
Dê uma olhada na documentação API dele, e verá funcionalidades como máscaras, grupos, gradientes, filtros, animar e padrões, todos quais podem ser aplicados à SVGs.
Snap.svg irá ajudá-lo a gerar gráficos, mas também pode ser usado em arquivos SVGs existentes. Isso significa que o conteúdo SVG não precisa necessariamente ser criado com Snap.svg, você também tem a liberdade de manipular gráficos com ferramentas como Adobe Illustrator, Inkscape, ou Sketch.
Começando com o Snap.svg
Download
Primeiro, baixe o Snap.svg. Uma vez baixado, você encontrará os seguintes arquivos:



- demos - aqui estão alguns exemplos, que também podem ser achados na seção Demo do site.
- dist - aqui estão a versão minificada e descompressada (para desenvolvimento) do script snap.svg
- doc - aqui você encontrará a documentação API que também está disponível no site snapsvg.io
- src - estes são os componentes, ferramentas e plugins que compõem o Snap.svg, como animate, paper, executando uma tarefa Grunt etc.
- test - este diretório contêm os testes de unidade do Snap.svg
Começando um projeto
Tendo baixado os recursos do Snap.svg, comece um novo projeto web, que precisa incluir:
- index.html - a página principal de HTML
- js/snap.svg.js - o plugin snap.svg
- js/main.js - o arquivo principal de desenvolvimento
Crie um template HTML e chame "scripts/snap.svg.js" e "scripts/main.js" em algum lugar na sua página.
Após isso, coloque um contêiner <svg>
dentro de <body>
e lhe dê um id. Você deverá ter algo parecido com isto:
1 |
<!DOCTYPE html>
|
2 |
<html lang="en"> |
3 |
<head>
|
4 |
<meta charset="UTF-8"> |
5 |
<title>Introducing Snap.svg</title> |
6 |
<script src="js/snap.svg.js"></script> |
7 |
<script src="js/main.js"></script> |
8 |
</head>
|
9 |
<body>
|
10 |
<svg id="svg"></svg> |
11 |
</body>
|
12 |
</html>
|
Trabalhando com SVG
Agora vamos diretamente para a codificação. Para conseguir acompanhar, você precisará de um conhecimento básico de JavaScript, mas não importa muito porque não iremos muito a fundo neste tutorial.
Primeiro, iniciamos Snap, apontando para o <svg>
que criamos, e o adicionamos a uma variável. No nosso caso, chamamos a variável de s
1 |
var s = Snap("#svg"); |
De agora em diante, teremos acesso aos métodos do Snap.svg pela variável s
. Por exemplo, digamos que queremos criar um círculo, ou um retângulo.
- Circle pode levar três argumentos: x, y e radius (veja Circle API)
- Rectangle pode levar seis argumentos: x, y, width, height, horizontal radius e vertical radius (veja Rect API)
- Ellipse pode levar quatro argumentos: x, y, horizontal radius e vertical radius (veja ellipse API)
1 |
// Circle with 80px radius
|
2 |
var circle = s.circle(90,120,80); |
3 |
// Square with 160px side width
|
4 |
var square = s.rect(210,40,160,160); |
5 |
// Ellipse with 80px vertical radius and 50px horizontal radius
|
6 |
var ellipse = s.ellipse(460,120,50,80); |
O código acima gerará o seguinte resultado:



Como pode ver na imagem acima, as formas automaticamente recebem um preenchimento #000
(preto) e não recebem nenhum outro estilo. Vamos interagir com eles e adicionar mais atributos de estilos como preenchimento, opacidade de preenchimento, cor da borda, largura da borda, opacidade da borda. Você pode dar uma olhada em SVG Attributes para mais detalhes.
1 |
circle.attr({ |
2 |
fill: 'coral', |
3 |
stroke: 'coral', |
4 |
strokeOpacity: .3, |
5 |
strokeWidth: 10 |
6 |
});
|
7 |
|
8 |
square.attr({ |
9 |
fill: 'lightblue', |
10 |
stroke: 'lightblue', |
11 |
strokeOpacity: .3, |
12 |
strokeWidth: 10 |
13 |
});
|
14 |
|
15 |
ellipse.attr({ |
16 |
fill: 'mediumturquoise', |
17 |
stroke: 'mediumturquoise', |
18 |
strokeOpacity: .2, |
19 |
strokeWidth: 10 |
20 |
});
|
Estes attributos fizeram nossas formas svg muito mais bonitas!



Mais manipulação SVG
Vamos levar nosso exemplo para além do básico.
Juntando Formas
Snap.svg usa uma arma poderosa chamada group, que, como o nome sugere, cria um grupo de vetores, criando uma só forma. Você pode agrupar quantas formas você quiser addicionando- os à lista.
Vamos criar dois círculos, agrupa-los e diminuir o preenchimento de cada círculo para visualizar mais claramente o que está acontecendo.
1 |
var circle_1 = s.circle(200, 200, 140); |
2 |
var circle_2 = s.circle(150, 200, 140); |
3 |
|
4 |
var circles = s.group(circle_1, circle_2); |
5 |
|
6 |
circles.attr({ |
7 |
fill: 'coral', |
8 |
fillOpacity: .6 |
9 |
});
|



Criando Máscaras com Outras Formas
Agora digamos que queremos criar um olho imaginário usando o grupo de elementos que já criamos. Podemos fazer isso usando mask. Primeiro, precisamos criar uma elipse extra e posicioná-lo no meio do grupo.
1 |
var circle_1 = s.circle(300, 200, 140); |
2 |
var circle_2 = s.circle(250, 200, 140); |
3 |
|
4 |
var circles = s.group(circle_1, circle_2); |
5 |
|
6 |
var ellipse = s.ellipse(275, 220, 170, 90); |
7 |
|
8 |
circles.attr({ |
9 |
fill: 'coral', |
10 |
fillOpacity: .6, |
11 |
});
|
12 |
|
13 |
ellipse.attr({ |
14 |
opacity: .4 |
15 |
});
|
Agora precisamos mascarar nossos círculos com nossa elipse, mudando a cor da elipse:
1 |
circles.attr({ |
2 |
fill: 'coral', |
3 |
fillOpacity: .6, |
4 |
mask: ellipse |
5 |
});
|
6 |
|
7 |
ellipse.attr({ |
8 |
fill: '#fff', |
9 |
opacity: .8 |
10 |
});
|



Animando as Formas
Continuando nosso exemplo, podemos fazer este olho piscar, adicionando um método animate. Para animar a elipse que acabamos de criar, iremos modificar o raio vertical de 1
para 90
(que é o valor no momento) e voltar o processo.
Crie a animação dentro de uma função e a chame de blink
.
1 |
function blink(){ |
2 |
ellipse.animate({ry:1}, 220, function(){ |
3 |
ellipse.animate({ry: 90}, 300); |
4 |
});
|
5 |
};
|
Isso diz que iremos animar de ry: 90
para ry: 1
e de ry: 90
para ry: 1
com tempos diferentes.
Agora crie um setInterval
para chamar o método blink
uma vez a cada três segundos, para criar o efeito de piscar.
1 |
setInterval(blink, 3000); |
O código final deverá ser assim:
1 |
var circle_1 = s.circle(300, 200, 140); |
2 |
var circle_2 = s.circle(250, 200, 140); |
3 |
|
4 |
// Group circles together
|
5 |
|
6 |
var circles = s.group(circle_1, circle_2); |
7 |
|
8 |
var ellipse = s.ellipse(275, 220, 170, 90); |
9 |
|
10 |
// Add fill color and opacity to circle and apply
|
11 |
// the mask
|
12 |
circles.attr({ |
13 |
fill: 'coral', |
14 |
fillOpacity: .6, |
15 |
mask: ellipse |
16 |
});
|
17 |
|
18 |
ellipse.attr({ |
19 |
fill: '#fff', |
20 |
opacity: .8 |
21 |
});
|
22 |
|
23 |
// Create a blink effect by modifying the rx value
|
24 |
// for ellipse from 90px to 1px and backwards
|
25 |
|
26 |
function blink(){ |
27 |
ellipse.animate({ry:1}, 220, function(){ |
28 |
ellipse.animate({ry: 90}, 300); |
29 |
});
|
30 |
};
|
31 |
|
32 |
// Recall blink method once every 3 seconds
|
33 |
|
34 |
setInterval(blink, 3000); |
35 |
|
36 |
|
37 |
Suporte ao Browser
Como mencionado anteriormente, estes efeitos tem suporte em browsers modernos: IE9+, Safari, Chrome, Firefox e Opera.
Open-Source e Grátis
Snap.svg está disponível sob a licença Apache 2, que significa que é open-source e completamente grátis.
Conclusão
Snap.svg diminui a barreira para manipulações incríveis de SVG. Espero que você tenha gostado de acompanhar e que tenha te inspirado a ir mais fundo em SVG!
Links Úteis
Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!