3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер

3 горизонтальные линии, бургер
Удалить все
ЗАГРУЗКА ...

Содержание



    Как анимировать SVG изображение используя SMIL

    Часы
    23.01.2026
    /
    Часы
    23.01.2026
    /
    Часы
    12 минут
    Глазик
    64
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0

    Вступление и краткий обзор SMIL анимаций, за и против

    Данная статья является единственным туториалом по созданию анимаций для SVG изображений на SMIL, который тебе понадобится для создания клёвых и анимированных превьюшек и иконок для своего сайта. Для данного туториала я создал специальный инструмент - редактор анимаций на SMIL для SVG изображений. Который позволит тебе отработать различные техники и навыки в создании анимаций.
    SVG(Scalable Vector Graphic) - это один из форматов изображений, который описывается математическими формулами и функциями, позволяя безгранично маcштабировать изображения данного типа.
    SMIL(Synchronized Multimedia Integration Language) - специальный язык разметки созданный для написания анимаций для SVG изображений и не только.
    Я решил написать данную статью, потому что считаю, что могу сделать лучше и нагляднее чем существующие аналоги в интернете. А так же потому что, всё за раз я запомнить не смогу и скорее всего забуду, а постоянно рыться в документации и прыгать от главы к главе, тоже не хочется.
    Поэтому данный гайд, будет поделён на главы, и чем глубже тем сложнее. То есть, если ты только начал, то лучше всего начать с первой главы (или со второй, если считать эту главу за первую). Ну а если ты уже прошаренный аниматор, то лучше ориентироваться по проблеме с которой столкнулся и начать читать с соответствующей главы.
    Собственно говоря, почему именно стоит использовать SMIL анимации, вместо CSS или JS? У данного подхода есть много преимуществ и всего два недостатка. Вот основные преимущества:
    1. Лёгкая встраиваемость. То есть не нужно добавлять дополнительных файлов или зависимостей. Просто отредактируй уже существующий или используемый SVG изображение и всё готово.
    2. Гибкость. Только на этом языке можно описать очень сложные анимации, где даже JS не в силах помочь
    3. Морфинг форм путей анимаций. Об этом подробнее в соответствующей главе, но если кратко, то позволяет очень лего пустить элемент по любому, даже самому извилистому, пути.
    4. Встроенный функционал для синхронизации анимаций.
    5. Просто быстрее, ибо всё, и само анимируемое изображение, и код анимации в одном файле.
    6. Широкая поддержка браузерами. Хотя не полная, так Opera и IE не поддерживают SVG анимации совсем. Но по статистике с https://caniuse.com/?search=smil, большинство пользователей сможет оценить ваши труды
    Статистика поддержки SMIL браузерами
    Теперь давай про недостатки:
    1. Это довольно сложный язык для создания анимаций. Потребуется время для оттачивания мастерства в его использовании
    2. Не полная поддержка. Да, я записал его и к плюсам и к минусам. Потому что для меня, если я вижу 96% поддержки среди пользовательских браузеров, значит это хорошо. Но для прожжённых веб-разработчиков этого может быть не достаточно и им нужна полная поддержка от всех существующих браузеров.

    Элемент для анимации и места их пребывания

    Существует всего 4 элемента анимации (https://www.w3.org/TR/REC-smil/smil-animation.html#animationNS-OverviewBasic) :
    1. animate - для обычных анимаций
    2. set - просто устанавливает значение для указанного элемента
    3. animateMotion - для перемещения и трансформирования элемента. Больше об этом элементе в этой главе.
    4. animateTransform - для изменения геометрии элемента. Сдвиг, растяжение, вращение, размеры. Больше о нём в этой главе
    Вообще, ещё существует такой элемент анимации, как animateColor. Но я его не включил сюда, ибо он не очень широко поддерживается, да и вообще, рекомендуется всегда использовать animate вместо animateColor.
    И существует всего два способа расположить эти элементы:
    1. Внутри целевого элемента, без указания ссылки на него
    2. Вне целевого элемента, с указанием ссылки на него используя href атрибут.
    В первом случае, мы располагаем любой элемент анимации в том объекте, к которому хотим применить анимацию, например:
    <g id="20" fill="#f00"> <set attributeName="fill" to="#fff"></set> </g>
    То есть мы зададим белый цвет всем элементам в группе с id="20". Очевидно, что для относительно простых изображений, такой способ более чем приемлем. Но как только число элементов перевалит за сотню и выше, потребуется как-то организовывать код для анимаций.
    Для этого можно поместить все элементы анимации в одно место, где и заниматься их редактированием и группировкой. Нужно только указать ID в атрибут href, того элемента, который хотим анимировать, например:
    <g id="20" fill="#f00"> ... </g> ... <set href="#20" attributeName="fill" to="#fff"></set>
    Ещё одно важное замечание в XML в общем, и в SVG/SMIL в частности, регистр букв имеет значение в отличие от HTML. Поэтому attributeName не равно attributename. Будь внимателен.
    Данный способ и использует мой инструмент. Он помещает все анимации в одно место, а пользователю нужно только указать ID требуемых для анимации элементов.

    Простая анимация

    Начнём пожалуй с самых простых анимаций. Анимаций передвижения объектов по холсту.
    <animate href="#rect1" attributeName="x" to="50" dur="1s" repeatCount="indefinite"> </animate>
    В примере кода выше я использовал минимально необходимые атрибуты для анимации:
    1. href - Это ссылка на объект, который мы хотим анимировать
    2. attributeName - То, какой атрибут мы хотим анимировать
    3. to - К какому значению необходимо привести данный объект в конце анимации
    4. dur - как долго эта анимация должна работать
    5. repeatCount - Вот это свойство необязательно, но я хотел, чтобы, ты, мой читатель точно увидел работающую анимацию. Значение этого атрибута - indefinite, говорит о том, что анимация будет повторяться бесконечно.
    Можно поиграться с перемещением ещё. Ведь можно указать с какого значения начинать(from) и на сколько менять это значение(by).
    Используя атрибут by ты не получишь разорванного результата или прыжков значений, как то может показаться. То есть не будет такого, что сначала объект по x был 0 потом, стал 100, потом ещё 200 при by = 100. Атрибут by указывает как быстро изменять позицию объекта от dt.
    <animate href="#rect1" attributeName="x" from="-400" to="1920" dur="2s" repeatCount="indefinite"> </animate>
    Вот так вот можно создать эффект бесконечного движения объекта. Важно так же понимать, что используя атрибут from, с начала анимации объект будет помещён туда без интерполяции, то есть мгновенно, что может быть не желательно для некоторых анимаций.

    Ещё более простые анимации

    Кроме элемента animate, можно использовать ещё и set. Он очень прост в своём использовании и не анимирует вообще, а только задаёт значения для целевого объекта. Вот наглядный пример:
    <set id="first" href="#rect1" attributeName="x" to="0" begin="0s;last.end" dur="0.5s" fill="freeze" /> <set id="second" href="#rect1" attributeName="x" to="1500" begin="first.end" dur="0.5s" fill="freeze" /> <set id="third" href="#rect1" attributeName="y" to="700" begin="second.end" dur="0.5s" fill="freeze" /> <set id="forth" href="#rect1" attributeName="x" to="0" begin="third.end" dur="0.5s" fill="freeze" /> <set id="last" href="#rect1" attributeName="y" to="0" begin="forth.end" dur="0.1s" fill="freeze">
    В этом примере, чтобы анимация работала постоянно я не использовал временные значения, а вместо их евент окончания предыдущей анимации (в данном случае не анимации, но установки значения, которое происходит мгновенно). Об этих эвентах подробнее будет рассказано в этой главе.

    Перемещаем объекты

    В предыдущей главе мы пробовали перемещение объектов используя общий элемент анимации - animate. И обычный сеттер значений - set. А так как перемещение объектов, это самый распространённый тип анимации, SMIL, представил отдельный элемент анимации для перемещения объектов - animateMotion.
    Вот как можно его использовать:
    <set href="#rect1" attributeName="x" to="0" begin="0" fill="freeze" /> <set href="#rect1" attributeName="y" to="0" begin="0" fill="freeze" /> <animateMotion id="top" href="#rect1" to="1600,0" dur="1s" begin="0s;left.end" fill="freeze" additive="sum"/> <animateMotion id="right" href="#rect1" from="0,0" to="0,700" dur="1s" begin="top.end" fill="freeze" additive="sum"/> <animateMotion id="bottom" href="#rect1" from="0,0" to="-1600,0" dur="1s" begin="right.end" fill="freeze" additive="sum"/> <animateMotion id="left" href="#rect1" from="0,0" to="0,-700" dur="1s" begin="bottom.end" fill="freeze" additive="sum"/>
    Сначала я задал изначальную точку для начала анимации при помощи set. После создал четыре анимации передвижения слева-направо, сверху-вниз, справа-налево, снизу-вверх. Объединил все эти анимации используя события окончания каждой анимации и что главное, использовал новые атрибуты такие как fill и additive.
    Атрибут fill - задаёт поведение для изменения конечного состояния анимируемых атрибутов. Так без fill="freeze" значения атрибутов x и y не изменятся и вернутся к состоянию до начала анимации.
    Атрибут additive - позволяет суммировать результат предыдущей анимации её текущим изменением.
    Это всё классно, но на самом деле animateMotion придумывался с уклоном использования вместе с атрибутом path, который способен задавать кривые маршрутов перемещения объектов. Например, так:
    <set href="#rect1" attributeName="x" to="0" begin="0" fill="freeze" /> <set href="#rect1" attributeName="y" to="0" begin="0" fill="freeze" /> <animateMotion id="top" href="#rect1" path="m 127.42,211.29 c 54.84,-8.6 109.68,-17.2 164.52,-25.81 238.18,-31.18 476.34,-62.37 714.52,-93.55 254.84,39.25 509.68,78.49 764.52,117.74 4.84,255.38 9.68,510.75 14.52,766.13 C 1359.67,966.67 933.87,957.53 508.06,948.39 598.93,784.94 689.78,621.51 780.65,458.06 712.9,428.49 645.16,398.92 577.42,369.35 c -98.39,0 -196.77,0 -295.16,0 -61.83,-3.76 -123.66,-7.53 -185.48,-11.29 10.22,-48.93 20.43,-97.85 30.65,-146.77 z" dur="10s" begin="0s" repeatCount="indefinite"/>
    Есть ещё один способ задания маршрута движения объекта. Создаём элемент path и сохраняем его. После чего обращаемся к нему через mpath, обёрнутый вокруг animateMotion. Код ниже аналогичен коду выше.
    <set href="#rect1" attributeName="x" to="0" begin="0" fill="freeze" /> <set href="#rect1" attributeName="y" to="0" begin="0" fill="freeze" /> <path id="shape" d="M 309.67742,420.96774 C 309.13978,395.16129 400,320.43011 446.77419,269.35484 c 46.7742,-51.07527 148.92473,29.03226 222.58065,43.54839 73.65591,14.51612 199.46236,77.41935 298.3871,117.74193 98.92476,40.32258 175.26886,-123.11828 264.51616,-187.09677 89.2473,-63.9785 201.0752,90.86021 301.6129,137.09677 100.5376,46.23656 -118.2796,173.65592 -175.8065,259.67742 C 1300.5376,726.34409 994.62366,756.98925 811.29032,817.74194 627.95699,878.49462 613.44086,742.47312 514.51613,704.83871 415.5914,667.2043 503.22581,587.09677 498.3871,527.41935 c -4.83871,-59.67741 18.8172,-59.67741 27.41935,-90.32258 8.60215,-30.64516 -51.6129,-18.27957 -77.41935,-27.41935 -25.80645,-9.13979 -91.39785,59.13978 -137.09678,88.70968 -45.69892,29.56989 -1.07527,-51.61291 -1.6129,-77.41936 z" fill="#ff"/> <animateMotion id="top" href="#rect1" dur="10s" begin="0s" repeatCount="indefinite"> <mpath xlink:href="#shape"/> </animateMotion>
    Собственно говоря, если нужно анимировать путь объекта, а этот путь очень сложен и тернист, то открываем свой любимый SVG редактор (в моём случае это InkScape), рисуем этот путь и копируем его path. Вот так:
    После чего вставляем скопированный путь в path атрибут. О том, как устроен данный атрибут и как его использовать, можно узнать в этой, исчерпывающей документации. Или можно прочитать более упрощённую версию в контексте использования SMIL.

    Анимируем цвета

    Теперь немного о цветах. Точнее об их анимации. Как было замечено раньше, чтобы анимировать цвета можно использовать как animate, так и animateColor элементы. Но использовать лучше animate.
    <!-- Верхний левый квадрат --> <animate href="#rect1" attributeName="fill" to="red" dur="3s" begin="0" repeatCount="indefinite" /> <!-- Верхний правый квадрат --> <animate href="#rect1-8" attributeName="fill" from="#fff" to="#111" dur="3s" begin="0" repeatCount="indefinite" /> <!-- Нижний левый квадрат --> <animate href="#rect1-8-5" attributeName="fill" values="#fff;#000;red;yellow" dur="3s" begin="0" repeatCount="indefinite" /> <!-- Нижний правый квадрат --> <animate href="#rect1-8-1" attributeName="stroke" from="#fff" to="#111" dur="3s" begin="0" repeatCount="indefinite" />
    Первый квадрат, который вверху слева, анимируется от текущего цвета до целевого.
    Второй, который вверху справа, анимирует цвет от #fff до #111. Игнорируя изначальный цвет заполнения.
    Третий, который внизу слева, анимирует цвета пошагово в указанном списке в атрибуте values.
    И четвёртый квадрат анимирует на заполнение - атрибут fill, но границу квадрата - атрибут stroke.
    Правила анимации к ним применяются те же, что и к обычным анимациям перемещения и трансформациям. Кстати о трансформациях, о них дальше.

    Изменяем формы и объекты

    Это одна из тех особенностей анимирования SVG изображений, ради которой и стоит учить данный язык для анимирования. Хотя бы потому что, это так просто сделать. Например, вот так:
    <animate href="#rect1" attributeName="d" dur="3s" repeatCount="indefinite" from="m 707.51507,415 h 298.51823 c 9.7927,0 17.6764,7.88367 17.6764,17.67639 v 211.42142 c 0,9.79272 -7.8837,17.67639 -17.6764,17.67639 H 707.51507 c -9.79272,0 -17.67639,-7.88367 -17.67639,-17.67639 V 432.67639 c 0,-9.79272 7.88367,-17.67639 17.67639,-17.67639 z" values="m 707.51507,415 h 298.51823 c 9.7927,0 17.6764,7.88367 17.6764,17.67639 v 211.42142 c 0,9.79272 -7.8837,17.67639 -17.6764,17.67639 H 707.51507 c -9.79272,0 -17.67639,-7.88367 -17.67639,-17.67639 V 432.67639 c 0,-9.79272 7.88367,-17.67639 17.67639,-17.67639 z;M 707.51507,415 1043.1301,282.74194 c 9.1108,-3.59035 32.8334,140.4046 30.5796,149.93445 l -50,211.42142 c -2.2538,9.52985 -7.8837,17.67639 -17.6764,17.67639 H 707.51507 c -9.79272,0 -17.67639,-7.88367 -17.67639,-17.67639 V 432.67639 c 0,-9.79272 8.56559,-14.08603 17.67639,-17.67639 z;M 707.51507,415 1043.1301,282.74194 c 9.1108,-3.59035 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -61.1095,-38.77522 -70.9022,-38.77522 H 707.51507 c -9.79272,0 -17.67639,-7.88367 -17.67639,-17.67639 V 432.67639 c 0,-9.79272 8.56559,-14.08603 17.67639,-17.67639 z;M 707.51507,415 1043.1301,282.74194 c 9.1108,-3.59035 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -110.00464,48.20897 -119.2893,45.09575 L 707.51507,661.7742 c -9.28468,-3.11323 -17.67639,-7.88367 -17.67639,-17.67639 V 432.67639 c 0,-9.79272 8.56559,-14.08603 17.67639,-17.67639 z;M 707.51507,415 1043.1301,282.74194 c 9.1108,-3.59035 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 25.872,-54.65786 25.872,-64.45058 V 432.67639 c 0,-9.79272 8.56559,-14.08603 17.67639,-17.67639 z;M 707.51507,415 1043.1301,282.74194 c 9.1108,-3.59035 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 -66.75319,-63.53923 -62.83768,-72.5151 l 88.70968,-203.3569 c 3.91551,-8.97586 8.56559,-14.08603 17.67639,-17.67639 z;M 707.51507,415 1043.1301,282.74194 c 9.1108,-3.59035 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 65.0172,3.65591 74.128,0.0655 z;m 705.90217,300.48387 337.22793,-17.74193 c 9.7791,-0.5145 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 62.7359,-113.93608 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 69.1714,6.27147 69.2893,16.06348 l 3.2258,267.87303 c 0.1179,9.79201 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 63.38863,-118.00094 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 20.7078,8.05189 22.5151,17.67638 l 50,266.26013 c 1.8073,9.62449 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 63.38863,-118.00094 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 22.3773,7.88463 22.5151,17.67638 l 3.2258,229.16336 c 0.1378,9.79175 -62.7996,83.41975 -72.5151,82.19252 L 663.96668,708.54839 c -9.71551,-1.22723 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 63.38863,-118.00094 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 22.3773,7.88463 22.5151,17.67638 l 3.2258,229.16336 c 0.1378,9.79175 -9.5118,25.19539 -19.2893,25.74091 l -346.90532,19.35483 c -9.77751,0.54551 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 63.38863,-118.00094 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 22.3773,7.88463 22.5151,17.67638 l 3.2258,229.16336 c 0.1378,9.79175 -9.4966,25.74091 -19.2893,25.74091 l -322.71177,-1e-5 c -9.79271,0 -88.44501,-43.47013 -87.03123,-53.16026 l 32.25807,-221.09884 c 1.41378,-9.69012 63.38863,-118.00094 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 22.3773,7.88463 22.5151,17.67638 l 3.2258,229.16336 c 0.1378,9.79175 -9.4966,25.74091 -19.2893,25.74091 l -322.71177,-1e-5 c -9.79271,0 -17.88728,-19.27487 -19.28929,-28.96671 L 633.38707,414.93445 c -1.40201,-9.69183 63.38863,-118.00094 72.5151,-114.45058 z;m 705.90217,300.48387 298.51823,116.12904 c 9.1264,3.55032 22.3773,7.88463 22.5151,17.67638 l 3.2258,229.16336 c 0.1378,9.79175 -9.4966,25.74091 -19.2893,25.74091 l -322.71177,-1e-5 c -9.79271,0 -17.88728,-19.27487 -19.28929,-28.96671 L 633.38707,414.93445 c -1.40201,-9.69183 63.38863,-118.00094 72.5151,-114.45058 z;m 680.09572,421.45161 324.32468,-4.8387 c 9.7916,-0.14609 22.3773,7.88463 22.5151,17.67638 l 3.2258,229.16336 c 0.1378,9.79175 -9.4966,25.74091 -19.2893,25.74091 l -322.71177,-1e-5 c -9.79271,0 -19.14324,-19.17508 -19.28929,-28.96671 l -3.22581,-216.26013 c -0.14605,-9.79162 4.65895,-22.36901 14.45059,-22.5151 z" to="m 705.90217,300.48387 337.22793,-17.74193 c 9.7791,-0.5145 30.4617,140.14244 30.5796,149.93445 l 3.2258,267.87303 c 0.1179,9.79201 -109.5738,46.32298 -119.2893,45.09575 L 663.96668,708.54839 c -9.71551,-1.22723 -64.25146,-62.82497 -62.83768,-72.5151 l 32.25807,-221.09884 c 1.41378,-9.69012 62.7359,-113.93608 72.5151,-114.45058 z"></animate>
    Данная анимация применима только к элементам <path>
    Я согласен, очень много кода для такого простого морфинга форм, но что тут важно уяснить. Вся эта анимация возможна благодаря атрибуту values, который пошагово говорит, какие узлы и куда эти узлы поместить. Каждый шаг разделяется точкой с запятой.
    Причём довольно важно учитывать тот факт, что если хочется получить именно анимацию, а не резкий скачок к целевой точке, необходимо чтобы атрибут path имел идентичную структуру на каждом шаге. То есть если первый узел описывается вот такой вот структурой пути - "M L L L Z", то и второй узел должен состоять из такой же структуры.
    Тут может возникнуть довольно резонный вопрос, а как и где мне получить необходимые позиции узлов? Я эти позиции сам не вычисляю, а копирую из обычного редактора SVG - InkScape. Вот так:
    В твоём редакторе может быть чуть-чуть по другому, но в InkScape всё довольно прямолинейно и понятно.

    Трансформации объектов

    Если такая детальная трансформация путей не нужна, или нужно трансформировать например rect элемент, на помощь придёт такой элемент анимации как animateTransform. Он позволяет анимировать базовые трансформации как scale, rotate и translate.
    Чтобы такие трансформации как rotate и scale работали корректно, необходимо проставить следующий стиль для анимируемого элемента: style="transform-origin: center;" Иначе трансформация будет применена относительно левого верхнего угла холста.
    Вот примеры анимаций для трансформаций объектов:
    <animateTransform href="#rect1" attributeName="transform" type="translate" to="500,0" begin="0s" dur="1s" repeatCount="indefinite"></animateTransform>
    <animateTransform href="#layer1" attributeName="transform" type="scale" values="2,2; 2,1.5; 1,1.25" dur="5s" repeatCount="indefinite"></animateTransform>
    <animateTransform href="#layer1" attributeName="transform" type="rotate" values="90;-90;-45;45" begin="1s" dur="5s" repeatCount="indefinite"/>
    Заметь, что я использую атрибут values, чтобы пошагово задать необходимые углы поворотов и степени масштабирования объекта. Так просто нагляднее для читателя, увидеть в действии ту или иную анимацию.

    Сглаживаем анимации

    Иногда движения могут показаться слишком резкими или "прямолинейными". И тебе это не кажется, ведь по умолчанию, все анимируемые атрибуты изменяют свои свойства прямолинейно. Чтобы это изменить нужно прибегнуть к таким атрибутам анимирования как calcMode и keySplines.
    <animateMotion href="#rect1" to="700,0" dur="1s" calcMode="spline" keySplines="0 0 1 1" repeatCount="indefinite"></animateMotion> <animateMotion href="#rect1-8" to="700,0" dur="1s" calcMode="spline" keySplines=".5 0 .5 1" repeatCount="indefinite"></animateMotion> <animateMotion href="#rect1-8-5" to="700,0" dur="1s" calcMode="spline" keySplines="0 .75 .25 1" repeatCount="indefinite"></animateMotion> <animateMotion href="#rect1-8-5-1" to="700,0" dur="1s" calcMode="spline" keySplines="1 0 .25 .25" repeatCount="indefinite"></animateMotion>
    Нужно задать calcMode равным spline. А в атрибут keySplines придётся записать 4 числа описывающих кривую сплайна. Вместе они задают скорость изменения анимируемых атрибутов при помощи сплайнов.
    Вообще calcMode довольно интересный атрибут, который может в корне изменить стиль и поведение анимации. Я, конечно же, мог бы попытаться описать работу данного атрибута, но наверное лучше оставить это тем, кто SMIL и придумал и просто направить тебя в официальную документацию для дальнейшего ознакомления.
    Стоит учесть тот факт, что chromium браузеры не поддерживают сплайны от SMIL.
    Мне было лень делать дополнительный инструмент для генерирования таких сплайнов, может когда-нибудь и сделаю, но а пока можно использовать вот такой вот сайт, специально предназначенный для генерации кастомных сплайнов. Больше деталей о том, как это работает, читай в официальной документации.

    Интерактивные анимации

    Все мои анимации в этой статье начинаются сразу же после загрузки самого изображения в древо DOM. В коде это выглядит вот так: begin="0". И такое поведение является стандартным, то есть его не нужно прописывать самому, оно подразумевается.
    Но иногда хочется чтобы анимация выполнялась по клику на конкретный элемент или при ховере мыши, например. Это легко реализовать используя в атрибуте begin не время, но имена событий, как я это уже делал в этой главе. Так например, сможешь ли ты открыть все анимации на данном изображении:
    <animate id="one" href="#rect1" begin="mouseover" attributeName="fill" dur="1s" to="red" calcMode="spline" keySplines="1 0 .25 .25" /> <animate href="#rect1-8" begin="click" attributeName="fill" dur="1s" to="red" calcMode="spline" keySplines="1 0 .25 .25" /> <animate href="#path2" begin="mouseout" attributeName="fill" dur="1s" to="yellow" calcMode="spline" keySplines="1 0 .25 .25" /> <animate href="#path7" begin="click + 2s" attributeName="fill" dur="1s" to="green" calcMode="spline" keySplines="1 0 .25 .25" /> <animate href="#path1" begin="one.end;click" attributeName="fill" dur="1s" to="red" calcMode="spline" keySplines="1 0 .25 .25" />
    Чтобы запустить анимацию для первого квадрата, слева-вверху, нужно лишь навести мышь. На прямоугольник придётся кликнуть. Анимация для круга может быть активирована двумя путями. Первый это обычный клик, второй это после окончания анимации квадрата. Закруглённый треугольник активирует свою анимацию после того, как ты уберёшь мышь. Ну и наконец, анимация для пятиугольника будет активирована спустя 2 секунды после клика.
    События нужно использовать в связке с конкретным элементом анимации. Где сначала идёт ИД элемента анимации, а потом, через точку, идёт обращение к событию.
    Вот все, встроенные события, которые могут использоваться в begin и end атрибуте:
    1. begin - когда анимация началась
    2. end - когда анимация закончилась, то есть если ко-во повторов 5, то данное событие активируется только в конце 5-ого повтора
    3. repeat - когда анимация повторилась, то есть если ко-во повторов 5, то в конце каждого повтора.
    Подробнее об встроенных событиях можно почитать тут -> https://www.w3.org/TR/REC-smil/smil-timing.html#Timing-DOMEvents. Плюс, так как мы работает со SMIL через SVG - все остальные события будут описаны тут -> https://www.w3.org/TR/SVG11/interact.html#SVGEvents

    Заключение или что будет дальше

    Вот и всё, что я знаю об анимациях SVG изображений через SMIL. Минимальный, но вполне достаточный инструментарий, чтобы сделать довольно классные анимации для своего сайта.
    Так же как и с другими статьями такого типа, чем старше она будет, тем больше деталей эта статья соберёт, ведь и я стоять на месте не буду. И может ещё научусь парочке-другой приёмов связанных с анимациями. А так, надеюсь статья была тебе полезна и помогла в короткие сроки анимировать своё SVG-изображение.



    Не забудь поделиться, лайкнуть и оставить комментарий)

    Комментарии

    (0)

    captcha
    Отправить
    ЗАГРУЗКА ...
    Сейчас тут пусто. Буть первым (o゚v゚)ノ

    Другое

    Похожие статьи


    Quill formats (ql-formats), как их расширить и существующие виды

    Часы
    24.10.2024
    /
    Часы
    02.10.2025
    Глазик
    904
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    В этой статье я разберу типы форматеров (formats) quilljs, и объясню некоторые нюансы работы с таблицами, шрифтами, изображениями и видео. Так же покажу как переопределить форматер(ql-formats) на примере ссылки

    Как сделать собственный quill link tooltip(тултип для ссылок)

    Часы
    25.10.2024
    /
    Часы
    02.10.2025
    Глазик
    575
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    В этой статье ты найдёшь пример того как реализовать свой quill tooltip/тултип для вставки ссылок и поймёшь как это вообще работает