Идея этой анимации навеяна великолепным докладом Владимира Кузнецова об использовании SVG в сайтостроении. Иконка – “разбитое сердце” составлена из двух половинок, которые нарисованы с помощью двух путей – path. Анимация происходит за счет вращения – ‘rotate’ этих путей в разные стороны, относительно одной общей точки. Как нарисовать в векторном редакторе эти половинки сердца, чтобы они идеально, без шва соединялись друг с другом, я расскажу в отдельной статье.
Ниже код левой и правой половинок иконки.
1 2 3 4 5 6 |
<g> <path id="right-half" d="M63.9 24C58.5 24 53.5 27 50.2 32.5 49.8 35.3 50.5 40.6 50.5 40.6L48.8 45.2 53.8 49.7 47.6 55.5 54 57.8 49.8 61.6C49.7 69.1 50.2 69 50.1 75.4 50.1 75.4 50.2 75.7 50.2 75.7 50.6 75.7 51 75.5 51.1 75.1 53 70.1 58 66.3 63.4 62.2 70.9 56.5 78.6 50.7 79.2 41.1 79.4 36.4 77.9 32 74.8 28.8 73.5 27.4 72 26.3 70.4 25.5 68.4 24.5 66.1 24 63.9 24z"/> </g> <g > <path id="left-half" d="m50.1 75.4c0 0 0.1 0.3 0.1 0.3-0.4 0-0.8-0.3-0.9-0.7-1.9-5.1-7-9-12.4-13-7.3-5.5-14.9-11.2-15.6-20.9-0.3-4.5 1.1-8.8 4.2-12 3-3.2 7.2-5.1 11.5-5.1 5.5 0 10.3 3.1 13.4 8.5-0.4 2.9 0.3 8.1 0.3 8.1l-1.7 4.6 5 4.5-6.2 5.8 6.4 2.4-4.2 3.8c0 7.4 0.4 7.4 0.3 13.7z" /> </g> |
Добавляем анимацию к каждой половинке иконки. Правая половинка должна повернуться на некоторый угол вправо – values=”0 50 75; 7 50 75″, в нашем примере угол поворота по часовой стрелке от “0” до “7” градусов (первая цифра из трех в двух группах цифр, разделенных точкой с запятой в атрибуте ‘values’), соответственно левая половинка иконки должна вращаться влево, против часовой стрелки, поэтому значение угла поворота будет отрицательным от “0” до “-7” – values=”0 50 75; -7 50 75″
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<svg id="heart" xmlns:svg="//www.w3.org/2000/svg" xmlns="//www.w3.org/2000/svg" version="1.1" width="200" height="200" viewBox="0 0 100 100"> <!-- Анимация для правой половинки иконки --> <g> <path id="right-half" d="M63.9 .... 63.9 24z"> <animateTransform id="break" attributeName="transform" type="rotate" begin="heart.click" dur="1s" repeatCount="1" values="0 50 75.7;7 50 75.7" fill="freeze" restart="whenNotActive"/> </path> </g> <!-- Анимация для левой половинки иконки --> <g > <path id="left-half" d="m50.1 ... 13.7z" > <animateTransform attributeName="transform" type="rotate" begin="heart.click" dur="1s" repeatCount="1" values="0 50 75.7;-7 50 75.7" fill="freeze" restart="whenNotActive"/> </path> </g> </svg> |
Обратите внимание, что после добавления команды анимации внутрь тэга <path> он из одинарного должен превратиться в парный тэг – <path>…</path> Подробнее здесь.
begin=”heart.click” – начало анимации после клика по видимой части SVG, взгляните на первую строчку листинга выше – <svg id=”heart”> Это сделано для того, чтобы анимация левой и правой половинки иконки начиналась одновременно, так как id=”heart” это общая область просмотра для обоих половинок иконки.
dur=”1s” – продолжительности анимации – 1 секунда.
repeatCount=”1″ – повторение один раз.
values=”0 50 75.7;-7 50 75.7″ – первая цифра начальный угол поворота, вторая и третья цифры – координаты точки, относительно, которой происходит поворот. После точки с запятой конечное значение угла поворота, координаты точки те же.
fill=”freeze” – после завершения анимации изображение ‘замерзает’.
restart=”whenNotActive” – запрет повторного запуска анимации пока не закончится текущая анимация.
*.Svg файл готов с работающей анимацией, теперь его можно клонировать, масштабировать, стилизовать.
Добавляем *.svg файлы с иконками в Html страницу с помощью ‘object’ для того, чтобы иконки были интерактивны. Подробнее здесь.
Все иконки кликабельны.
1 2 3 4 5 |
<div class="alignleft"> <object type="image/svg+xml" data="heart-break.svg" width="200" height="200"> <img src="heart-break.png" width="200" height="200" alt="icon heart-break" /> </object> </div> |
Добавим ещё несколько штрихов к анимации, а именно,- обратное слияние половинок иконок в одну целую иконку. Для этого надо сделать обратную операцию – заставить левую и правую половинки иконки вернуться к центру. Для этого используем те же команды анимации, но поменяем значение углов вращения половинок на обратное. Этот блок анимации – склеивание половинок, должен начать работать после окончания работы первой анимации на раскол иконки, допустим через паузу в 3 секунды. Ниже показан код анимации с возвратом к центру для одной половинки иконки, для второй половинки всё аналогично.
1 2 3 4 5 6 7 |
<!-- анимация раскола и склеивания для правой половинки иконки --> <g> <path id="right-half" d="M63.9 24C58.5 24 53.5 27 50.2 32.5 49.8 35.3 50.5 40.6 50.5 40.6L48.8 45.2 53.8 49.7 47.6 55.5 54 57.8 49.8 61.6C49.7 69.1 50.2 69 50.1 75.4 50.1 75.4 50.2 75.7 50.2 75.7 50.6 75.7 51 75.5 51.1 75.1 53 70.1 58 66.3 63.4 62.2 70.9 56.5 78.6 50.7 79.2 41.1 79.4 36.4 77.9 32 74.8 28.8 73.5 27.4 72 26.3 70.4 25.5 68.4 24.5 66.1 24 63.9 24z"> <animateTransform id="break" attributeName="transform" type="rotate" begin="heart.click" dur="3s" repeatCount="1" values="0 50 75.7;7 50 75.7" fill="freeze" restart="whenNotActive"/> <animateTransform attributeName="transform" type="rotate" begin="break.end+3s" dur="1s" repeatCount="1" values="7 50 75.7;0 50 75.7" fill="freeze" restart="whenNotActive"/> </path> </g> |
begin=”heart.click” – первая анимация – раскол иконки, начинается после клика мышкой по иконке или любому месту рядом с ней.
begin=”break.end+3s” – вторая анимация – склеивание половинок, начинается после окончания первой анимации, имеющей уникальный идентификатор – id=”break”, плюс 3 секунды паузы.
Все иконки кликабельны.