Цвет · рецепт градиентаГрадиентная кнопка на CSS — с наведением

Фон кнопки вдвое шире самой кнопки, и при наведении он плавно сдвигается. Градиент между значениями не анимируется, а позиция фона — анимируется.

ТекстКнопкаРамкаАнимация← К конструктору
01Пример02Код03По шагам04Ошибки05Вопросы06Рецепты07Похожие
01

Живой пример

меняйте цвета — код ниже обновится
наведите — градиент сдвинется
Настройки рецепта
Цвета
#6C8CFF0%
#B18CFF100%
Белая подпись: худшая точка 2,6:1 — нечитаемо
Открыть в конструкторе →
02

Готовый код

анимируется background-position, а не сам градиент
.gradient-button {
  color: #fff;
  background: #6c8cff; /* фолбэк */
  background: linear-gradient(90deg, #6c8cff, #b18cff, #6c8cff);
  background-size: 200% 100%;
  background-position: 0% 50%;
  border: none;
  border-radius: 10px;
  padding: 16px 28px;
  transition: background-position .4s ease;
}

.gradient-button:hover {
  background-position: 100% 50%;
}

.gradient-button:focus-visible {
  outline: 3px solid #16130f;
  outline-offset: 3px;
}
03

По шагам

  1. 01
    background: linear-gradient(a, b, a)
    Повторите первый цвет в конце — тогда сдвиг будет бесшовным.
  2. 02
    background-size: 200% 100%
    Сделайте фон вдвое шире кнопки — видна только половина.
  3. 03
    :hover { background-position: 100% 50% }
    При наведении сдвиньте фон; transition сделает переход плавным.
  4. 04
    :focus-visible { outline: … }
    Оставьте видимый фокус для клавиатуры — градиент его не заменяет.
04

Частые ошибки

transition на background не работает

Браузер не умеет плавно менять один градиент на другой. Анимируйте background-position или opacity псевдоэлемента.

Подпись не читается на светлом конце

Белый текст проходит на тёмной половине и проваливается на светлой. Проверяйте контраст по всей длине — справа это делает инструмент.

Убран outline

outline: none без замены лишает клавиатурных пользователей фокуса — это нарушение WCAG 2.4.7.
05

Частые вопросы

Свойство transition не умеет плавно превращать один градиент в другой — фон сменится скачком. Есть два рабочих приёма. Первый — сделать фон вдвое шире кнопки и сдвигать background-position, как в коде рецепта. Второй — положить второй градиент на псевдоэлемент ::before и плавно менять его opacity от нуля до единицы. Первый проще, второй позволяет переходить к совсем другим цветам.
06

Другие рецепты

Обновлено

«» добавлен в избранное