Hoe SVG te manipuleren en te animeren met Snap.svg

In deze tutorial introduceren we Snap.svg, een JavaScript-bibliotheek die helpt bij het animeren en manipuleren van SVG-inhoud. Om enkele van de beschikbare functies te demonstreren, gaan we een SVG-oog animeren.

Wat is Snap.svg ?

Snap.svg is een JavaScript-bibliotheek waarmee u eenvoudig SVG-afbeeldingen voor moderne browsers kunt maken en manipuleren. Het is de opvolger van Raphaël van Dmitry Baranovskiy; de meest populaire JavaScript-bibliotheek voor het werken met SVG.

Raphäel

Raphäel.js is een geweldige bibliotheek. Uitgebracht in 2008, de grootste overwinning was de ondersteuning voor browsers vanaf IE 5.5. Het ondersteunen van zoveel browsers was echter beperkend en betekende dat het de nieuwste ontwikkelingen niet kon implementeren, in plaats daarvan vertrouwde op een gemeenschappelijke subset van SVG-functies.

Na een tijdje de Raphäel.js-gemeenschap verdeeld in twee, één groep die erop vertrouwde voor compatibiliteit met andere browsers, en een andere die deze gebruikte voor het maken van SVG's. Deze laatste groep eiste wijzigingen om meer SVG-functies te ondersteunen die Raphäel.js niet aankon.

Vandaar dat Snap.svg is gebouwd, helemaal opnieuw geschreven door Dmitry Baranovskiy (van het Adobe Web Platform-team), om gemakkelijker met SVG te werken en het nieuwste dat SVG kan bieden te gebruiken; functies zoals maskeren, patronen, verlopen, groepen, animaties en meer.

Wat kunt u doen met Snap.svg?

Bekijk hun API-documentatie en u zult functies zien zoals masker, groep, verloop, filter, animatie en patroon, die u allemaal kunt toepassen op SVG's.

Snap.svg helpt je bij het genereren van afbeeldingen, maar het kan ook werken met bestaande SVG. Dit betekent dat uw SVG-inhoud niet noodzakelijk met Snap.svg hoeft te worden gemaakt, u kunt ook afbeeldingen bewerken die zijn gemaakt met hulpmiddelen zoals Adobe Illustrator, Inkscape of Sketch.

Aan de slag met Snap.svg

Download 

Allereerst moet u Snap.svg downloaden. Met dat gedaan, vindt u het volgende in het archief:

  • demos - hier zijn enkele voorbeelden, die je ook kunt vinden op de Demo-sectie van hun website
  • dist - dit is het geminimaliseerde en ongecomprimeerde (voor ontwikkeling) snap.svg-script 
  • dokter - hier vindt u de API-documentatie die ook beschikbaar is op snapsvg.io
  • src - dit zijn de componenten, hulpmiddelen en plug-ins die Snap.svg vormen, zoals animeren, papier, een Grunt-taak uitvoeren enz.
  • test - deze map bevat eenheidstests voor Snap.svg

Een project opzetten

Nadat u de Snap.svg-bronnen hebt gedownload, begint u een nieuw webproject dat het volgende moet bevatten:

  • index.html - het hoofd HTML-bestand
  • js / snap.svg.js - de snap.svg-plug-in
  • js / main.js - onze hoofdwerkruimte

Maak een HTML-sjabloon en verwijs naar "scripts / snap.svg.js" en "scripts / main.js" -scripts ergens op uw pagina. 

Hierna plaats je een  container in de  en geef het een id. Je zou iets een beetje als dit moeten hebben:

    Introductie van Snap.svg       

Werken met SVG

Laten we nu direct naar de codering springen. Om dit te volgen, heb je basis JavaScript-kennis en -begrip nodig, maar het maakt niet zoveel uit omdat we niet te diep gaan met deze tutorial.

Allereerst initialiseren we Snap, wijzend naar de svg zojuist gemaakt en toewijzen aan een variabele. In ons geval wordt de variabele gebeld s

var s = Snap ("# svg");

Vanaf nu, binnen de s variabele hebben we toegang tot alle Snap.svg-methoden. Stel dat we bijvoorbeeld een cirkel of een rechthoek willen maken. 

  • Cirkel kan drie argumenten aannemen X,Y en radius (controleer Circle API)
  • Rechthoek kan zes argumenten aannemen: X, Y, breedte, hoogte, horizontale straal en verticale straal (controleer Rect API)
  • Ellips kan vier argumenten aannemen: x, y, horizontale straal en verticale straal (check ellipse API)
// Cirkel met 80px radius var circle = s.circle (90,120,80); // Vierkant met 160px zijbreedte var square = s.rect (210,40,160,160); // Ellips met 80px verticale straal en 50px horizontale straal var ellipse = sellipse (460,120,50,80);

De bovenstaande code genereert het volgende resultaat:

Zoals je kunt zien in bijgevoegd screenshot, hebben de vormen standaard een # 000 (zwart) vul de kleur zonder een andere stijl. Laten we er interactie mee hebben en wat meer stylingattributen toevoegen, zoals opvulkleur, vuldekking, lijnkleur, lijnbreedte, slagdekking. U kunt SVG-attributen bekijken voor meer informatie.

circle.attr (fill: 'coral', stroke: 'coral', strokeOpacity: .3, strokeWidth: 10); square.attr (fill: 'lightblue', stroke: 'lightblue', strokeOpacity: .3, strokeWidth: 10); ellipse.attr (fill: 'mediumturquoise', stroke: 'mediumturquoise', strokeOpacity: .2, strokeWidth: 10);

Deze attributen hebben onze SVG-vormen veel mooier gemaakt!

Verdere SVG-manipulatie

Laten we ons voorbeeld nemen en verder gaan dan de basis.

Vormen groeperen

Snap.svg gebruikt een krachtig wapen genaamd groep, dat, zoals de naam suggereert, vectoren samen groepeert, waardoor ze één vorm vormen. U kunt zoveel vormen als u wilt groeperen door ze als een lijst toe te voegen.

Laten we twee cirkels maken, groeperen en de vulling van elke cirkel verlagen om beter te visualiseren wat er aan de hand is.

var circle_1 = s.circle (200, 200, 140); var circle_2 = s.circle (150, 200, 140); var circles = s.group (circle_1, circle_2); circles.attr (fill: 'coral', fillOpacity: .6);

Vormen maskeren met andere vormen

Laten we nu zeggen dat we een denkbeeldig oog willen maken met de gegroepeerde elementen die we al hebben gemaakt. We kunnen dit doen met behulp van masker. Eerst moeten we een extra ellips maken en deze in het midden van de groep plaatsen.

var circle_1 = s.circle (300, 200, 140); var circle_2 = s.circle (250, 200, 140); var circles = s.group (circle_1, circle_2); var ellips = sellipse (275, 220, 170, 90); circles.attr (fill: 'coral', fillOpacity: .6,); ellipse.attr (opacity: .4);



Nu moeten we de cirkels maskeren met onze ellips, door een andere vulkleur toe te voegen aan de ellips:

circles.attr (fill: 'coral', fillOpacity: .6, mask: ellip); ellipse.attr (fill: '#fff', onduidelijkheid: .8); 

Animaties animeren

Als we doorgaan met ons voorbeeld, kunnen we dit oog laten knipperen door een animatiemethode toe te voegen. Om de ellips die we zojuist hebben gemaakt te animeren, wijzigen we de verticale straal van 1 naar 90 (dat is de huidige waarde) en weer terug.

Maak de animatie en pak deze in een functie genaamd knipperen.

functie knippert () ellipse.animate (ry: 1, 220, function () ellipse.animate (ry: 90, 300);); ;

Dit stelt dat we gaan bezielen vanuit ry: 90 naar ry: 1 en van ry: 90 naar ry: 1 met verschillende timing.

Maak nu een setInterval om de. te bellen knipperenmethode om de drie seconden, om een ​​knipperend effect te creëren.

setInterval (knipperen, 3000); 

De definitieve code zou er als volgt uit moeten zien:

var circle_1 = s.circle (300, 200, 140); var circle_2 = s.circle (250, 200, 140); // Groepeert cirkels samen var cirkels = s.groep (circle_1, circle_2); var ellips = sellipse (275, 220, 170, 90); // Vulkleur en -dekking toevoegen om te omcirkelen en // het masker circles.attr toepassen (fill: 'coral', fillOpacity: .6, mask: ellip); ellipse.attr (fill: '#fff', onduidelijkheid: .8); // Creëer een knippereffect door de rx-waarde // voor ellips van 90px tot 1px aan te passen en omgekeerd functie knippert () ellipse.animate (ry: 1, 220, function () ellipse.animate (ry: 90 , 300);); ; // Herhaal de knippermethode eenmaal per 3 seconden setInterval (knipper, 3000); 

Browserondersteuning

Zoals eerder vermeld, worden deze functies ondersteund in moderne browsers: IE9+, Safari, Chrome, Firefox en Opera.

Open-source en gratis

Snap.svg is beschikbaar onder een Apache 2-licentie, wat betekent dat het volledig open-source en volledig gratis is.

Conclusie

Snap.svg verlaagt de barrière voor een behoorlijk verbluffende SVG-manipulatie. Ik hoop dat je het leuk vond om mee te gaan en dat het je heeft geïnspireerd om verder te kijken in SVG! 

handige links

  • @snapvg op Twitter
  • https://github.com/adobe-webplatform/Snap.svg
  • Snapsvg-forum