Анимированная градиентная рамка
Для создания красивой и анимированной градиентной рамки нам понадобится всего один контейнер без дополнительных обёрток и псевдоэлементов.
Зададим контейнеру .gradient-border базовые стили. Создадим CSS-переменную --bg-angle для будущего использования в градиенте.
Добавим рамку толщиной 8 пикселей вокруг элемента .gradient-border. Временно сделаем её белой и полупрозрачной, чтобы наглядно объяснить, как будет работать эффект.
Теперь добавим фоновую заливку с использованием конусного градиента, который использует переменную --bg-angle.
Ключевуюу роль играет свойство background-origin. Благодаря значению border-box наш градиент отрисовывается и под рамкой. Чтобы показать это, мы сделали её полупрозрачной.
Давайте изменим значение на padding-box. Градиент перестал отрисовываться под рамкой.
Значение content-box даёт ещё более наглядный результат. Теперь градиент отрисовывается только под областью содержимого.
Вернём на место border-box, это ключевое значение для работы нашего приёма.
Градиенты — это изображения, а фоновых изображений у блока может быть множество. Поэтому мы можем перекрыть часть конического градиента с помощью одноцветного линейного градиента.
Добавим линейный градиент первым изображением в списке, чтобы он перекрывал конический. И зададим линейному градиенту background-origin: padding-box.
Давайте для наглядности изменим background-origin у линейный градиента на content-box. Конический градиент теперь «просвечивает» не только в области рамки, но и в области паддингов.
Вернём padding-box линейному градиенту. И подведём небольшой итог.
Такого же эффекта мы можем добиться, если во внешний контейнер с градиентным фоном добавить внутренний контейнер со сплошным фоном. Трюк с несколькими градиентами и background-origin позволяет нам избавиться от дополнительной обёртки.
Теперь сделаем рамку полностью прозрачной.
И соберём код с градиентом в одном правило. Чтобы перейти к созданию анимации.
Добавим для .gradient-border анимацию spin на 2.5 секунды, которая повторяется бесконечно и равномерно.
Добавим @keyframes spin. В нем описано изменение пользовательской CSS-переменной --bg-angle до 360 градусов.
Эта простая анимация должна работать и красиво вращать градиент, но не работает из-за бага.
Попробуем изменить значение --bg-angle в анимации на 180 градусов.
Анимация работает, но она воспроизводится рывками, а не плавно.
Чтобы починить баг с анимацией, нужно добавить директиву @property, в которой подробнее описать тип пользовательской переменной --bg-angle. Подскажем браузеру, что --bg-angle — это угол <angle> и начальное значение у него 0deg.
Этой информации браузеру достаточно, чтобы «завести» и правильно показывать анимацию.
Осталось вернуть значение 360deg для анимации. Теперь градиент делает красивый полный оборот, а мы видим это как анимацию рамки.
Временно сделаем линейный градиент полупрозрачным, а рамку толще. Теперь принцип работы эффекта анимированной градиентной рамки максимально нагляден.
Вернём все параметры на место. И сделаем так, чтобы рамка анимировалась только при наведении. Добавляем animation-play-state: paused; для .gradient-border. Это приостановит анимацию.
Добавим animation-play-state: running; при наведении на .gradient-border, чтобы анимация продолжила воспроизведение.
Наведите курсор на карточку и проверьте работу анимации.
Соберём код в итоговое состояние. Эффект анимированной градиентной рамки готов. Экспериментируйте с ним и делитесь результатами с нами и друзьями.