[Перевод] Как я создал меняющую настроения анимацию с помощью масок CSS

Помните мультфильмы, которые мы смотрели в детстве? В то время они были олицетворением анимации. Сейчас анимация — это не только мультфильмы, мы встречаем ее почти каждый день, проверяя телефон или используя любое устройство, имеющее экран.

Сегодня анимация используется не только для привлечения внимания, но и для улучшения взаимодействия с пользователем, облегчения навигации. В любом хорошем дизайне анимацию добавляют таким образом, чтобы она сочеталась с общей концепцией, создавая тем самым удобный пользовательский интерфейс.

ioqe6bjn5l35asbxmqwjidk8yus.jpeg

В этой статье мы создадим простую анимацию лица с разными выражениями, а в процессе узнаем немного о CSS.

Приступим


Мы будем использовать технику CSS, редко применяемую веб-разработчиками, но к которой довольно часто прибегают дизайнеры. Она называется маскирование.

Что приходит в голову, когда вы слышите слова «маска»? Вероятно, вы представили что-то, скрывающее суть. Это все, что нам нужно знать.

Подождите —, но статья связана с написанием и использованием анимации CSS… Без паники! Все правильно!

Создание базовой маски


Положим, у нас есть тег div с background: green; и это выглядит примерно так:

se9xw108f2lpvxnn4tumkgau7ro.png

Также есть файл face.svg:

n2j-fcwq7-y-zazl8m8fs7mqpd8.png

Если мы применим свойство CSS mask-image: url (face.svg); к тегу div, то вы будете поражены, увидев результат:

cq4ffbfhvpq-nneuldmlrhqxr38.png

Вы можете подумать, что это странно. Картинка face.svg была помещена поверх div, но приняла цвет фона. Это противоречит нашим ожиданиям. Происходит подобное из-за свойства mask-type, которое делает непрозрачную часть svg прозрачной. Тем самым цвет фона становится видимым.

Давайте не будет углубляться. Просто имейте в виду, что можно использовать background-color, чтобы изменить цвет маски. Если вы знакомы с различными способами использования background-color, то можете также применять градиенты и написать простой градиент, который заполнит центр красным цветом и радиально распространит черный цвет по краям. Код будет выглядеть следующим образом:

background-image: -webkit-radial-gradient( hsla(0, 100%, 50%, .7), hsla(0, 100%, 20%, .8), hsla(0, 100%, 10%, 1));


Результат будет таким:

n5f0tkyshrtsyo8l-5juvy0muus.png

Добавление анимации


Теперь добавим анимацию на это пустое лицо. Для этого используем expression.svg, которое вы видите на изображении ниже. Для простоты я создал все файлы svg одинаковой ширины и высоты, поэтому не приходится выравнивать лица и выражения вручную.

9mzn2zfsqhljrnpjvdujksmq0-e.png

Сейчас mask-image обладает классной опцией, которая позволяет использовать несколько изображений в качестве масок. Поэтому мы можем сделать так: mask-image: url (face.svg), url (expression.svg);. Вот что получилось:

psqycrteradocjdumhk7ik1xzvc.png

Одним из самых важных свойств CSS масок является mask-position, благодаря которому маска располагается в верхнем левом углу относительно родительского элемента. И я могу расположить несколько масок, используя свойство mask-position так же, как mask-image. Чтобы сделать лицо грустным, используем что-то вроде этого: mask-position: 0 0, 0 12px;. Вот что получилось.

ouwnk2ptnvkldhtvts7kc6tke20.png

Первая позиция 0 0 для face.svg, а вторая 0 12px — для expression.svg. Это привело к переносу на 12 px и придало лицу необходимое выражение.

Применение функциональных возможностей


Теперь давайте анимируем эти выражения при наведении курсора. Полный код, который мы получим после применения псевдокласса hover будет таким:

i {
  background-image: -webkit-radial-gradient(hsla(0, 100%, 50%, .7), hsla(0, 100%, 20%, .8) 60%, hsla(0, 100%, 10%, 1));
  
  mask-image: url('face.svg'), url('expression.svg');
  mask-position: 0 0, 0 12px; /* To make the sad expression */

  transition: mask-position .5s ease-out;
}

i:hover {
  background-image: -webkit-radial-gradient(hsla(120, 100%, 50%, .7), hsla(120, 100%, 20%, .8) 60%, hsla(120, 100%, 10%, 1));

  mask-position: 0 0, 0 0; /* To make the happy expression */

  transition: mask-position .1s linear;
}


Поиграв еще чуть-чуть со свойствами CSS, мы можем сделать так:

r6ts-el340ihyeanhcklz--esvu.gif

Это один из методов, который можно использовать для создания тех самых захватывающих анимаций, с которыми мы сталкиваемся почти ежедневно.

Одно важное замечание


Маскирование может работать не во всех браузерах. Чтобы заставить его работать во всех браузерах, просто добавьте специальные метки браузера, такие как -webkit-, -moz- и -0-.

Вы можете посмотреть полный код на github и codepen. Спасибо! Надеюсь, было полезно.

op1dzdczzwfxzcisazp6zysnoxg.png

Заглядывайте на VPS.today — сайт для поиска виртуальных серверов. 1500 тарифов от 130 хостеров, удобный интерфейс и большое число критериев для поиска самого лучшего виртуального сервера.
ddkyd6kuoqn62p8il6p3oc4zilq.png

© Habrahabr.ru