Мастерская. Эффект сияния
В этой мастерской мы используем радиальные градиенты для создания потрясающих декоративных эффектов. Мы создадим карточку заклинания «Взрыв» из всем известной игры «Герои Меча и Магии III» с красивым эффектом сияния, которое будет отражаться на заголовке.
Во второй части курса мы разберёмся, как создать эффект сияния на иллюстрации заклинания.
В начальном состоянии у нас есть карточка с логотипом, заголовком и подписью. Анимация заголовка временно отключена.
Чтобы создать эффект сияния, нужно добавить изображение заклинания и несколько обёрток.
Используем распространённый приём для создания голографических эффектов и адаптируем его под нашу задачу.
В этом приёме используется следующая структура тегов: обертка .shader
, внутри которой содержится изображение и контейнер .shader__layer
, содержащий ещё один .shader__layer
. Внешний .shader__layer
служит для «осветления» изображения, внутренний — для создания маски.
Переходим к стилизации.
Анимацию заголовка, которую мы добавляли в первой части, временно отключим.
Изображение заклинания пока находится внизу карточки и выходит за её пределы.
Зададим карточке относительное позиционирование и CSS-свойство overflow: hidden
, чтобы обрезать изображение.
Теперь установим для контейнера .shader
абсолютное позиционирование и привяжем его к правому нижнему углу карточки так, чтобы отображалась нужная часть иллюстрации
Для реализации декоративного эффекта нужно, чтобы все внутренние элементы контейнера располагались точно друг над другом. Проще всего этого добиться, задав контейнеру фиксированные размеры и придерживаться их для его потомков.
CSS-свойство backface-visibility: hidden
помогает оптимизировать производительность этого эффекта.
Явно зададим ширину изображения внутри контейнера .shader
. Это мера предосторожности на случай, если для тега img
ширина не будет указана.
Начнём стилизовать .shader__layer
.
Задача сделать так, чтобы элементы располагались над изображением и были таких же размеров, что и .shader
. Поэтому зададим им абсолютное позиционирование и нулевые значения top
и left
...
...а также 100%
ширину и высоту.
Теперь размеры «слоёв» привязаны к размерам контейнера.
Также временно зададим чёрный полупрозрачный фон, чтобы лучше видеть, как работает эффект.
Для полноценной работы декоративного эффекта оба блока .shader__layer
должны иметь полностью чёрный фон, и мы сделаем его таким в самом конце.
Голографический эффект состоит из двух частей: маски и блика. Блик осветляет всё под собой, а маска придаёт блику нужную форму.
Наш блик должен иметь ту же форму, что и изображение, поэтому для создания маски используем то же изображение implosion.png
. Добавим его как фон блока .mask
.
Зададим фоновому изображению те же размеры, что и тегу img
. Теперь оба изображения полностью совмещены, причём контейнер с фоном расположен над img
.
В основе голографического эффекта лежит свойство mix-blend-mode
, которое управляет тем, как элемент визуально смешивается с фоном под ним.
Значение multiply
помогает «обрезать» будущую голограмму по границам фонового изображения. Именно поэтому блок называется маской.
Займёмся бликом. Для этого добавим радиальный градиент в качестве фонового изображения для блока .specular
.
Напомним, что блок .mask
вложен в .specular
, поэтому градиентный фон располагается под изображением маски. Сейчас хорошо видно, как градиент выходит за границы маски.
Если установить для .mask
полностью чёрный цвет фона, свойство mix-blend-mode: multiply
начнёт работать в полную силу. Это приведёт к тому, что градиентный фон будет обрезан точно по границам изображения, а за границами будет виден чёрный цвет.
Именно этого мы сейчас и добиваемся.
Доработаем градиент. Во-первых, немного сместим центр вправо, установив для него координаты 51% 50%
. Во-вторых, явно зададим радиус градиента. В дальнейшем мы будем анимировать градиент, изменяя радиус, чтобы получить эффект сияния.
Вы можете самостоятельно поэкспериментировать с радиусом, чтобы понять, как работает эффект. Меняйте его в диапазоне от нуля до 600px
.
Вторая составляющая для достижения голографического эффекта — это использование свойства mix-blend-mode
со значением color-dodge
, которое применяется к блоку .specular
.
Значение color-dodge
является режимом наложения, который усиливает светлые области. Если верхний цвет полностью чёрный, то цвет под ним остаётся без изменений. Если же верхний цвет светлее, то он осветляет цвет, находящийся под ним.
Давайте вернём нормальный режим наложения для блока .specular
. Ваша задача — переключиться между текущим и следующим шагом, чтобы сравнить результаты.
У блока .specular
есть фоновое изображение с градиентом и полностью чёрные края. При включении режима color-dodge
черный фон становится полностью прозрачным, а область под градиентом осветляется.
Вернём свойство mix-blend-mode: color-dodge
для .specular
.
Под чёрными участками ничего не изменилось, а под более светлыми участками изображение стало светлее.
Высветление получилось слишком сильным, потому что цвет фона у .specular
был не полностью чёрным, а полупрозрачным чёрным rgba(0, 0, 0, 0.5)
. Такой полупрозрачный чёрный цвет также осветляет фон под собой, если мы используем mix-blend-mode: color-dodge
.
Поэтому меняем фоновый цвет блика на полностью чёрный.
Перенесём чёрный цвет фона в общий класс .shader__layer
.
Мы разобрались, как устроен голографический эффект. Теперь можем приступать к анимированию градиента.
Для начала вынесем радиус градиента в отдельную переменную --radius
и используем её внутри функции radial-gradient()
.
Протестируем разные значения радиуса, чтобы понять, в каких границах должен пульсировать градиент.
Экспериментальным путём мы нашли границы от нуля до 600px
.
Вернём в код --implosion-timing-function
из первой части. Также добавим описание переменной --radius
через @property
. Это нужно для корректной работы анимации.
Добавим анимацию pulse
, в которой меняем --radius
до 600px
в конечном состоянии.
Добавим анимацию pulse
для .specular
. Не забудем установить нулевое исходное значение для --radius
.
Используем те же параметры анимации, что и у заголовка: длительность 10 секунд
, бесконечное проигрывание с переменным направлением и временную функцию --implosion-timing-function
.
Вернём анимацию заголовка и посмотрим, как два эффекта проигрываются в унисон!
На карточке заклинания происходит апокалиптический взрыв, который, разрастаясь, бросает блики на заголовок и окрашивает его в ярко-жёлтый цвет.
Напоследок покажем весь код, который использовался для создания обоих эффектов, и резюмируем роль радиальных градиентов.
Для пульсирующей заливки заголовка мы использовали радиальный градиент в сочетании с -webkit-background-clip: text
и -webkit-text-fill-color: transparent
. Для анимации применяли изменение свойства background-size
.
Для создания эффекта сияния мы использовали радиальный градиент как часть голографического эффекта. Радиус градиента анимировали с помощью переменной.