Как использовать SVG для создания веб-анимации под все типы устройств
Создание и программирование сложной SVG-анимации для сайтов, мобильных приложений и интерактивных проектов. Как повысить удобство интерфейсов и вызвать вау-эффект.
SVG — это двухмерная векторная графика, дословно «масштабируемая векторная графика», и, тем не менее, это текстовый формат, который можно легко править в блокноте или просто рисовать в векторных редакторах: Adobe Illustrator, CorelDRAW, Adobe Fireworks, Incscape, SVG-Edit Online, ConceptDraw PRO и другие.
Фактическое развитие SVG началось с версии 1.1 опубликованной W3C в 2011 году. Анонс улучшенной версии 2.0, превосходящей возможности Flash, намечен на 2017 год. Благодаря языку разметки XML, легко встраивается в HTML документ.
SVG-объекты ничем не отличаются от стандартных в графических редакторах.
Давайте абстрагируемся от музыкальных метафор и пробежимся по основным советам по составлению композиции. Убедитесь:
Линии и ломаные линии
Многоугольники
Окружности и эллипсы
Кривые Безье
Сложные контуры
Текст
SVG, как любой основанный на XML формат, позволяет использовать для его обработки таблицы трансформации (XSLT). Преобразуя XML-данные в SVG с помощью простого XSL, можно получить графическое представление текстовых данных, например, визуализировать графики, круговые диаграммы, гистограммы
SVG не теряет в качестве при масштабировании и не зависит от разрешения экрана
При помощи CSS3 и JavaScript можно менять стили и атрибуты для SVG-элементов
В связи с тем, что информация об объекте хранится в описательной форме, можно бесконечно увеличить графический примитив при выводе на графическое устройство
Объем данных, занимаемый описательной частью, не зависит от реальной величины объекта, что позволяет, используя минимальное количество информации, описать сколь угодно большой объект файлом минимального размера. Например, описание окружности произвольного радиуса требует задания только 3 чисел, не считая атрибутов.
С увеличением количества мелких деталей в изображении, растёт размер SVG-файла. Проще использовать jpeg или даже png. Например, изображение травы в векторе может весить 10мб, а тоже самое изображение в jpg будет весить 200кб.
Как работать с SVG. Что нужно знать в теории?
Структуру SVG документа в отдельном файле.
Для полноценной анимации будем использовать только inline-встраивание SVG.
Минимальный набор для встраивания в html:
<svg viewBox="0 0 50 81" width="50" height="81" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<path d="M 40.4106 0 L 49.8474 9.4193 L 18.8736 40.3396 L 49.8474 71.2517 L 40.4106 80.671 L 0 40.3396 L 40.4106 0 ZM 40.4106 0 L 40.4106 0 Z" />
</svg>
viewBox="x y width height" — определяет пользовательскую область просмотра
Можно использовать аналог спрайтов, когда все иконки в одном файле, а областью видимости показываем только нужную.
Выравнивание с preserveAspectRatio необходимо для настройки пропорций изображения
Ось X в области просмотра:
xMin —левая граница области просмотра
xMid —центр по оси X
xMax —правая граница области просмотра
Ось Y в области просмотра:
YMin — по верху
YMid —по центру
YMax — по низу
meet — указывает, что изображение должно сохранить свои пропорции и быть полностью видимым (CSS-аналог background-size:contain;)
slice — указывает, что изображение должно сохранить свои пропорции и будет отмасштабировано в соответствии с максимальным граничным значением области просмотра (CSS-аналог background-size:cover;)
none — означает, что внутреннее изображение потеряет свои пропорции и будет использовать пропорции viewBox.
А нас больше всего интересует тег , так как позволяет управлять любой точкой и кривыми безье в контуре. О нем будет рассказано ниже в практическом блоке. Важно знать, что существует несколько моделей построения кривых:
По опыту компании, скажу что с абсолютными координатами точек работать проще.
Клонирование объектов с помощью тегов <symbol> и <use>
У нас был проект, в котором использовалось много однотипных иконок с большим количеством цветовых оттенков. Задачу решили, создав глобальный inline-SVG для всех страниц с множеством переменных <symbol id="icon_id">. В нужных местах страницы использовали <use class="green" xlink:href="#icon_id" x="0" y="0"/>. В CSS применяли цвет use.green {fill: #ADFF2F;}.
В конце статьи даются ссылки на библиотеки, которые помогают при анимировании <path>
Приведу простые примеры из «Инструкции новичка» по Snap.SVG.
var s = Snap("#svg"); // возьмем готовый svg на странице или создадим новый s = Snap(800, 600);
// нарисуем новый контур
var p = s.path("M10-5-10,15M15,0,0,15M0-5-20,15").attr({
fill: "none",
stroke: "#bada55",
strokeWidth: 5
});
Суть анимации, плавно перейти из начального положения в конечное. Ниже описана пошаговая инструкция по созданию анимации на основе SVG.
Возможность встраивания SVG в HTML даёт преимущество управлять SVG-элементами и их атрибутами с помощью JS. На картинках ниже показано, что мы можем дотянуться не только до самих точек, а также, до кривых безье.
Любой графический редактор, обладающий возможностью работы с векторной графикой, имеет path-панель.
С ее помощью будем управлять точками и кривыми безье.
Наша задача нарисовать начальное и конечное положение кривых. А анимацию на html-странице описать Javascript’ом.
Визуально обозначим траекторию движения будущей анимации
Как видим, всё просто! Матрицы аффинных преобразований не потребовались :)
Как использовать SVG для анимации, интерактивности и микровзаимодействия
Важный момент: Почему мы не используем стандартные средства анимации в SVG? Язык SMIL (Synchronized Multimedia Integration Language) не рассматриваем, так как W3C больше не будет поддерживать SMIL.
Возьмем, к примеру, две кривые в виде XML
<path d="M 166.5 142.5 L 518 182.5 L 885.5 142.5 " stroke="#000" stroke-width="5" fill="none"/>
<path d="M 166.5 362.5 L 518 322.5 L 885.5 362.5 " stroke="#000" stroke-width="5" fill="none"/>
Программирование анимации (изменение X,Y-координат у точек) будет выглядеть примерно так:
M 166.5 142.5 L 518 182.5 L 885.5 142.5
M 166.5 150 L 518 190 L 885.5 150
M 166.5 155 L 518 195 L 885.5 155
…
M 166.5 350 L 518 170 L 885.5 350
M 166.5 355 L 518 175 L 885.5 355
M 166.5 362.5 L 518 322.5 L 885.5 362.5
!!! Важно чтобы количество точек совпадало.
Продолжаем пример. Если мы хотим сделать выпуклый квадрат. Нужно нарисовать квадрат с 8-ю точками.
Код для анимации такого квадрата:
var s = Snap($('svg'));
var path = s.path(start_path); // устанавливаем начальное положение
$('play').click(function () {
path.stop().animate({ 'path': end_path }, 500, mina.easeout); // конечное положение
(function () {
path.stop().animate({ 'path': start_path }, 500, mina.backout); // возвращаем начальное положение
}).delay(500);
});
//код передаёт только суть и не обязан работать
Библиотека Snap SVG «прорисовывает» движение между контурами по функциям плавности.
!!! Главное мы получаем 100% качественное кросс-браузерную анимацию без потери качества.
Мы коснулись технической стороны вопроса, но есть уровень более высокий, чем программирование анимации. Речь о концепте.
Концепт анимации
Просматривая различные концепты анимации, видно не правильную анимацию, которую скорее можно назвать презентационной и которую нельзя использовать в проекте. Мы собрали подборку интересных, на наш взгляд, решений, когда анимация действительно помогает пользователю и создает вау-эффект.
Хорошая анимация должна быть правильной с точки зрения достижения результата. Она должна объяснять пользователю, как работать с интерфейсом, должна помогать ориентироваться в нём — сейчас, во времена flat-дизайна, мы видим первые попытки сделать плоский дизайн живым и реалистичным.
На основе нашего практического опыта работы с интерфейсами для различных сайтов и мобильных приложений, мы смогли определить несколько правил и преимуществ анимации:
Повышение удобства использования
Оригинальность
Простота использования
Выполнение одновременно нескольких параллельных задач
Ускорение работы интерфейса
Улучшение обратной связи для пользователя
Цели анимации
Анимация, показывающая, что процесс идет
Одной из важных и основных характеристик является анимация для взаимодействия с пользователем. Анимированные детали интерфейса способны мгновенно информировать пользователя о процессах, в которых он участвует.
Показать, что действие производится или произошло (разъяснение/пояснение с помощью анимации)
Данная цель не является процессом, она показывает его завершение. Это еще один способ сообщить пользователю о важности его действий.
Группировка данных с помощью анимации
Привлечение внимания к определенным элементам
Анимация используется для выделения важного элемента в интерфейсе, чтобы пользователь не пропустил важной информации. Анимируемый элемент макета получает гораздо больше шансов быть замеченным даже если он небольшой. Данный тип анимации, предпочтительно использовать для одного элемента. Результат анимации (повышенный коэффициент внимания) можно проанализировать с помощью тепловой карты.
Поддержка общего стиля и брэндинга
Это тот случай, когда анимация может усилить эффект закрепления имиджа бренда и привлечь внимание к определенным элементам брэндинга для повышения общей узнаваемости.
Сохранение последовательности переходов
Подобного рода анимация используется в основном в веб-дизайне, чаще всего в процессе прокрутки страницы. Эффект хорошо знают и широко используют как параллакс-анимацию, для развлечения и создания вау-эффекта. Таким образом он может создать позитивное отношение в процессе взаимодействия и при необходимости сохранить элементы, требующие большего внимания.
Правила анимации
Анимация как дополнительный индикатор правильности работы интерфейса
Анимация как способ сэкономить место
Анимация как способ добавить реалистичности к интерфейсу и создать вау-эффект без вреда для использования
Анимация как способ скрыть «баги» или отвести внимание пользователя (лоадеры, параллакс-загрузки, индикаторы процесса)
Она не должна перегружать страницу или скрин, вызывая долгую и раздражающую загрузку
Нужно тщательно продумывать анимацию с учетом разных устройств и условий, с которыми целевой пользователь соприкоснется в работе с продуктом
Анимация не должна слишком отвлекать от главных функций или контента на экране или веб-странице
Она должна соответствовать общему стилистическому концепту приложения или веб-сайта, чтобы поддерживать общую гармонию в восприятии продукта
Роль SVG в эластичном дизайне
Эластичный прелоадер
Форма с плавной обратной связью
Эластичное меню
Роль качественной анимации в интерфейсах возрастает. Интерфейсы могут быть более живыми, чем просто плоские иконки и линейная анимация. Так родилось понятие эластичного дизайна.
И в первую очередь, эластичный дизайн — это дизайн, который реагирует на действия пользователя. Эластичный дизайн не ограничивает свободу движений. И помогает пользователям совершать нужные действия. Эластичный дизайн идеально вписывается в направление «интерфейсов в одном окне», а также в пространственные интерфейсы.
Как сказал один наш клиент: «Как желе, дрожит от любого прикосновения».
Роль SVG в эластичном дизайне сводится к анимированию, гибкости, текучести, взаимозависимости, плавности, наложению слоев... Вообщем сделать flat живым.
Основы эластичного дизайна
Элементы не живут сами по себе. Каждый элемент зависит от другого, создавая пространство единой системы взаимосвязей.
Эластичный дизайн адаптируется под любые разрешения.
Каждый элемент дает обратную связь на действия пользователя. У пользователя не должно остаться сомнений о совершении того или иного действия.
Эластичный дизайн направлен в первую очередь на удобство интерфейсов.
Усиливаем анимацию с помощью функций плавности и svg-фильтров
Ещё раз напомню два основных типа анимации, на которых мы сфокусировались:
Эластичная анимация
Анимация при микровзаимодействии
В стандарте SVG существует 19 фильтров:
feBlend — наложение слоёв (overlay, screen, multiply и другие)
feColorMatrix — цветовая матрица позволяет управлять цветом изображений
feComponentTransfer — используется для изменения цвета, как photoshop эффекты — brightness adjustment, contrast adjustment, color balance или thresholding.
feComposite — композитный фильтр, используется для наложения или вырезания двух слоёв.
feConvolveMatrix — аналог эффектов bevel, emboss, sharpen и edge detection.
feDiffuseLighting — направленная подсветка, чем-то похожа на bump mapping
feDisplacementMap — смещает изображение с использованием значений координат пикселей второго изображения
feFlood — по сути рисует новый квадрат
feGaussianBlur — размытие
feImage — преобразует векторную графику в растровую
feMerge — параллельное объединение SVG-фильтров
feMorphology — используется когда необходимо истончить или утолщить края исходного изображения
feOffset — сдвиг изображения по координатам x и y
feSpecularLighting — подстветка
feTile — мозаика и аналог паттернов
feTurbulence — создает фрактальный или беспорядочный шум
feDistantLight — фильтр для подсветки
fePointLight — фильтр для подсветки
feSpotLight — фильтр для подсветки
Чем не Photoshop? Мы можем использовать последовательное наложение фильтров.
Рассмотрим, как сделать «текучесть» в эластичном дизайне с помощью последовательного наложения SVG-фильтров.
Размытие на входе принимает исходное изображение, выдаёт результат blur.
Цветовая матрица принимает результат blur и выдает glow. Здесь меняется цвет входящего изображения, чтобы создать альфа-канал для композитного фильтра.
Эластичная анимация интерфейса является отличным способом удержания пользователей на сайте, так как использование интерактивных элементов позволяет решать задачи быстрее и интереснее. А развитие технологий скоро позволит перенести полноценные Photoshop-инструменты в web, с возможностью анимации. Но перед тем как применять моушн-дизайн, нужно проанализировать его потенциал для улучшения удобства. Хорошая анимация рождается на стадии концепта и преследует четкие цели. Функции плавности доводят движения до реалистичности. Нас ждет по-настоящему живой flat. Преимущества и полезность применения анимации в процессе «визуальной коммуникации» очевидны и перевешивают возможные недостатки.
Полезные ссылки
Snap SVG — snapsvg.io — библиотека для работы с SVG
Greensock — greensock.com — библиотека для анимации
easings.net — Шпаргалка функций плавности
jQuery Easing Plugin — функции плавности
anime.js — anime-js.com — библиотека для анимации
dynamics.js — dynamicsjs.com — библиотека для анимации
Эластичная анимация интерфейса является отличным способом удержания пользователей на сайте, так как использование интерактивных элементов позволяет решать задачи быстрее и интереснее. А развитие технологий скоро позволит перенести полноценные Photoshop-инструменты в web, с возможностью анимации. Но перед тем как применять моушн-дизайн, нужно проанализировать его потенциал для улучшения удобства. Хорошая анимация рождается на стадии концепта и преследует четкие цели. Функции плавности доводят движения до реалистичности. Нас ждет по-настоящему живой flat. Преимущества и полезность применения анимации в процессе «визуальной коммуникации» очевидны и перевешивают возможные недостатки.\
\r\n\r\n\
Полезные ссылки\
\r\n\
\r\n\
\
Snap SVG — snapsvg.io — библиотека для работы с SVG\
\
\r\n\
\
Greensock — greensock.com — библиотека для анимации\
\
\r\n\
\
easings.net — Шпаргалка функций плавности\
\
\r\n\
\
jQuery Easing Plugin — функции плавности\
\
\r\n\
\
anime.js — anime-js.com — библиотека для анимации\
\
\r\n\
\
dynamics.js — dynamicsjs.com — библиотека для анимации\
\Статья написана отделами AFFINAGE DESIGN и AFFINAGE PRODUCTION компании \AFFINAGE\.\\
\r\n\\r\n\\r\n\t\r\n\","code":"items-how-to-use-svg","previewText":"Создание и программирование сложной SVG-анимации для сайтов, мобильных приложений и интерактивных проектов. Как повысить удобство интерфейсов и вызвать вау-эффект.","redirectToRR":false,"title":"Как использовать SVG для создания веб-анимации под все типы устройств","companyId":12252,"tags":[{"code":"article","title":"Статья"},{"code":"design-graphical_design","title":"Графический дизайн"},{"code":"programming-graphical_design","title":"Программирование"},{"code":"image-graphical_design","title":"Изображения"}],"id":129350,"createdAt":"27 октября 2016","image":"https://images.cmsmagazine.ru/klarnetCMSlocal/resized_images/articles_elements/1013/2000/uploadotiy8fo3wi.png","company":null,"companyImage":"https://api.cabinet.cmsmagazine.ru/images/company_logos/a9bca7629c60b646a4be02e9c9449de9/1658208389Y8sFHWfCfxXXdhFAAv.png","firstLettersOfName":"AF"},"empty":false,"isAjax":false,"request":{"url":"material","params":{"code":"items-how-to-use-svg"}},"isError":false,"similarMaterials":{"response":[{"title":"Как устранить типичные ошибки сайта на WordPress","code":"items-kak-ustranit-tipichnye-oshibki-sajta-na-wordpress","type_id":1,"author":"Инна Самарина","company":null,"companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/uploads7eswkj8nb.jpg","redirectToRR":false,"firstLettersOfName":"ИС"},{"title":"Как грамотно составить RFQ для проекта разработки программного обеспечения","code":"items-kak-gramotno-sostavit-rfq-dlja-proekta-razrabotki","type_id":1,"author":"Данил Вильховский","company":"Softenq","companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/uploadi1p9t2p2xr.jpg","redirectToRR":false,"firstLettersOfName":"ДВ"},{"title":"Аттестация программистов: наш опыт","code":"authors-zavertaylov-attestacija-programmistov-nash-opyt","type_id":2,"author":"Владимир Завертайлов","company":"Сибирикс","companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/uploadeb2aargv16.jpg","redirectToRR":false,"firstLettersOfName":"ВЗ"},{"title":"Сможет ли no-code заменить разработку?","code":"items-smozhet-li-no-code-zamenit-razrabotku","type_id":1,"author":"Антон Царьков","company":"ДАЛЕЕ","companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/uploadz1ex25813f.jpg","redirectToRR":false,"firstLettersOfName":"АЦ"},{"title":"5 принципов хорошего дизайна","code":"items-5-principov-horoshego-dizajna","type_id":1,"author":"Катерина-Василиса Андреева","company":"Sibdev","companyImage":"https://api.cabinet.cmsmagazine.ru/images/company_logos/6a0143100dc167553a0128d5a66ee4d4/1636523029eaOdb7OXE7EdtRn6wg.jpeg","redirectToRR":false,"firstLettersOfName":"КА"},{"type_id":1,"author":"Дарья Ермина","code":"items-kazhdomu-segmentu-pokazyvaem-svoju-kartinku","redirectToRR":false,"title":"Каждому сегменту показываем свою картинку и текст. Как использовать мудборды в маркетинге","company":"WIM Agency","companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/uploadkvph5nqzm2.jpg","views_count":565,"firstLettersOfName":"ДЕ"},{"type_id":1,"author":"Дмитрий Лейба","code":"items-tendencii-v-razrabotke-logo-v-etom-godu","redirectToRR":false,"title":"10 тенденций в разработке лого в 2022 году","company":null,"companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/uploadeei36mt0ix.png","views_count":602,"firstLettersOfName":"ДЛ"},{"type_id":1,"author":"Нина Калаус","code":"items-vdohnovljajucshie-trendy-v-veb-dizajne","redirectToRR":false,"title":"22 вдохновляющих тренда в веб-дизайне на 2022 год","company":"Магвай","companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/upload0qr20xr7li.jpg","views_count":6005,"firstLettersOfName":"НК"},{"type_id":1,"author":"Нина Калаус","code":"items-web-design-trends","redirectToRR":false,"title":"Тренды в веб-дизайне 2021: от тёмной цветовой схемы к моушн-дизайну","company":"Магвай","companyImage":"https://cmsmagazine.ru/klarnetCMSlocal/resized_images/persons/300/500/upload0qr20xr7li.jpg","views_count":27076,"firstLettersOfName":"НК"},{"title":"Плоский веб-дизайн – тренд 2014 года","code":"items-moda-na-ploskij-i-tonkij-dizajn","type_id":1,"author":"Adrian Taylor","company":null,"companyImage":null,"redirectToRR":false,"firstLettersOfName":"AT"}],"empty":false,"isAjax":false,"request":{"url":"similarMaterials","params":{"code":"items-how-to-use-svg"}},"isError":false}},"flowsMenu":{"response":[{"title":"Маркетинг","code":"marketing","newCount":14},{"title":"Создание сайтов","code":"programming","newCount":5},{"title":"Контекстная реклама","code":"context","newCount":8},{"title":"SEO","code":"seo","newCount":5},{"title":"Комплекс услуг","code":"package_of_services","newCount":4},{"title":"Дизайн","code":"graphical_design","newCount":9},{"title":"Программирование","code":"programming","newCount":1},{"title":"SMM","code":"smm","newCount":1},{"title":"Digital","code":"digital","newCount":3},{"title":"Использование сервиса","code":"service_use","newCount":1},{"title":"Мобильная разработка","code":"moblile","newCount":1},{"title":"Юзабилити","code":"usability","newCount":2},{"title":"Брендинг","code":"branding","newCount":5},{"title":"Менеджмент","code":"management","newCount":2},{"title":"Интернет-маркетинг","code":"internet_marketing","newCount":1},{"title":"Интранет","code":"intranet","newCount":0}],"empty":false,"isAjax":false,"request":{"params":{},"url":"flowsMenu"},"isError":false}},"badges":{"isAjax":false,"isError":false,"data":{}},"abTest":{},"catalogList":{"view":"card","sort":null,"sort_direction":null},"favorites":{},"reviewForms":{"criteria":[],"isAjax":false,"success":false,"fields_errors":{}},"flowsSortType":{"sort_type":"fresh"},"agency_cookie":{}}