Анімація у SVG

http://snapsvg.io/ - бібліотека для роботи з SVG та анімацією.

Анімувати примітиви можна за допомогою наступних тегів:

<animate> - зміна числових атрибутів (і кольору) протягом певного часу.

<set> - зміна нечислових атрибутів (visible, font-style і т.п.)

<animateMotion> - рух елемента по заданій траекторії.

Додаткові теги:

<animateTransform> - трансформація елемента.

<mpath> - вставляється в тег animateMotion, задає траекторію руху елемента своїм контуром.

<animateMotion path="..."> - модифікація контура.

<animateMotion keypoints="..."> - точки зміни швидкості руху.

<animateMotion rotate="..."> - дозволяє обертати елемент так, щоб він "завжди дивився вперед" по мірі руху по траекторії.

 

Включення анімації в код можливий двома шляхами (подібно до взаємодії label <==> input):

<line id="line1" ... />
<animation xlink:href="#cool_shape" ... />

<line ... >
  <animation ... />
</line>

Атрибути анімації:

attributeName - ім'я атрибута, який будемо міняти.

В одній анімації можна міняти тільки один атрибут. Якщо потрібно міняти декілька атрибутів - створіть декілька анімацій.

attributeType - якщо міняти треба не XML-атрибут, а CSS, такий, як opacity, font-weight і т.п., то потрібно задати attributeType="CSS".

from - початкове значення атрибута.

to - кінцеве значення атрибута.

by - кінцеве відносне значення атрибута.

dur - тривалість анімації, наприклад, dur="3s".

repeatCount - кількість повторів, repeatCount="indefinite" - нескінченна анімація.

begin - подія, по якій повинна початися анімація, наприклад, begin="click", begin="4s" - по кліку і через 4 секунди після завантаження сторінки, begin="click + 2s".

fill - результат анімації: fill="freeze" - залишити елемент зміненим, fill="remove" - повернути елемент до початкового стану.

<circle cx="50" cy="100" r="70">
  <animate attributeName="cx" to="100" dur="4s" begin="click" fill="freeze"/>
  <animate attributeName="cy" by="40" dur="4s" begin="click" fill="freeze"/>
  <animate attributeName="r" from="50" to="100" dur="4s" begin="click" fill="remove"/>
  <animate attributeType="CSS" attributeName="opacity" from="1" to="0.3" dur="2s" begin="click + 2s" fill="freeze"/>
</circle>

Можна задати рух по ключовим кадрам:

<animate ... values="20; 40; 60" keyTimes="0; 0.3; 1" />

calcMode - атрибут, що задає плавність переходу між точками, calcMode="discrete" - різкий, calcMode="linear" - плавний, є ще значення paced і spline.

keySplines - атрибут, що задає плавність по типу CSS-властивості ease-in = cubic-bezier(0.47, 0, 0.745, 0.715).

Цим атрибутом можна задати наприклад ефект гравітації - стрибаючий гумовий м'ячик.

 

Атрибути тега animateMotion всі ті самі і ще три додаткових:

keyPoints

rotate - прокручувати елемент по ходу руху, значення: auto, auto-reverse, число - градуси.

path - той самий формат, що і у атрибута <path d="..."/>.

Використання примітиву <path> як траекторія руху об'єкта:

<animateMotion ... dur="1s" begin="click" fill="freeze">
  <mpath xlink:href="#motionPath"/>
</animateMotion>

Текст по заданій траекторії:

<text>
  <textpath xlink:href="#textpath">
    Text laid out along a path.
  </textpath>
</text>

Приклад анімації ліній (клікни по колу):

<svg id="svg1" width="230" height="230" fill="#080a1a">
  <circle cx="115" cy="115" r="110" fill="rgba(0,0,0,0.2)"
      stroke="#ff0000" stroke-width="5"
      stroke-dasharray="1000" stroke-dashoffset="1000">
    <animate attributeName="stroke-dashoffset" begin="svg1.click"
        values="1000; 0" dur="5s" repeatCount="1" fill="freeze"
        calcMode="linear"></animate>
  </circle>