Как создать эффект аккуратной скользящей кнопки

Зайдя на сайт Netlify, я заметил красивые кнопки для загрузки. Они маленькие. При этом заметные и интерактивные! Они растягиваются, если навести курсор. Но в браузере Safari эти кнопки выглядят странно.

Я воссоздал их в качестве демо-версии, убрав некоторые недостатки.

При реализации такой кнопки я использовал:

  • Свойство left для перемещения надписи «Скачать».
  • Свойство padding при наведении курсора мыши на кнопку, чтобы создать дополнительное пространство для отображения надписи «Скачать».
  • Свойство scale() со значением 1,1, чтобы при взаимодействии все содержимое оставалось внутри кнопки.
  • transition для отступов, background-position для значка кнопки и свойство transform, чтобы обеспечить плавную анимацию между состоянием кнопки по умолчанию и при наведении курсора мыши.

Ниже показано как это выглядит без стилей.

Ниже продемонстрировано, как метка «Скачать» скрыта за пределами кнопки с помощью overflow: hidden. И где она отображается при наведении курсора мыши.

С помощью отрицательных значений свойства left мы скрываем иконку и надпись «Скачать». А когда курсор мыши наводится на кнопку, задаем свойству положительные значения.

CSS

/* Состояние по умолчанию */
.button {
    background: 
      #f6bc00 
      url(data:image/svg+xml;base64,...)
      no-repeat -12px center;
    overflow: hidden;
}
  
.button span:nth-child(1) {
  position: absolute;
  left: -70px;
}

/* Состояние при наведении */
.button:hover {
  padding-left: 95px;
  background-position: 5px center;
}

.button span:nth-child(1) {
  position: absolute;
  left: -70px;
}

Если оставить код без изменений, значок кнопки будет виден и создаст достаточно места для надписи «Скачать». Но при наведении курсора она будет съезжать с кнопки.

Это можно исправить, применив к кнопке transform: scale(1, 1).

CSS

/* Состояние при наведении */
.button:hover {
  padding-left: 95px;
  background-position: 5px center;
  transform: scale(1, 1);
}

Значения свойства padding – магические числа. Они могут изменять в зависимости от используемого шрифта, его размера и других факторов.

Последний ключевой компонент – свойство transition, которое заставляет все плавно скользить.

CSS

/* Состояние по умолчанию */
.button {
    background: 
      #f6bc00 
      url(data:image/svg+xml;base64,...)
      no-repeat -12px center;
    overflow: hidden;
    transition: padding .2s ease, background-position .2s ease, transform .5s ease;
}

Добавьте несколько деталей, таких как закругленные углы, и кнопка станет идеальной.