Когда у нас в eLama компонентов в библиотеке стало достаточно много, мы заметили, что ховеры не имеют системы: меняется цвет заливки, цвет рамки, цвет текста, появляется тень и т.д.

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

Даже у схожих компонентов ховеры были разные
Даже у схожих компонентов ховеры были разные

Не всё бывает тем, чем кажется

При разработке интерфейсов мы опираемся на принцип — то, что ты делаешь должно работать так, как того будет ожидать пользователь. Если пользователь видит перед собой кнопку, то он будет ожидать от нее поведение кнопки, а значит она должна и вести себя ожидаемо.

Например, у нас в библиотеке есть ссылка и кнопка, визуально похожая на ссылку. Из-за того, что в их поведении при ховере не было сильного различия, мог возникать вопрос, что произойдет при нажатии — перекинет на другую страницу, или действие будет на текущей странице. Поначалу даже были случаи, когда разработчики использовали кнопку, как ссылку, руководствуясь тем, что она выглядит и ведет себя при ховере похоже на ссылку.

Оказалось, не для всех может быть очевидно, что это два разных компонента
Оказалось, не для всех может быть очевидно, что это два разных компонента

Какие ховеры вообще бывают

1. Изменение фона (появление подложки или изменение ее цвета)

Так это выглядит в Notion
Так это выглядит в Notion

2. Изменение бордера (появление или смена цвета)

Так себя ведет кнопка фильтров в Jira
Так себя ведет кнопка фильтров в Jira

3. Изменение цвета иконки или текста

Пример с Хабра
Пример с Хабра

4. Изменение местоположения

Можно увидеть на главной странице Яндекса
Можно увидеть на главной странице Яндекса

5. Добавление эффектов (тени, градиенты и т.д.)

Кнопка из Google календаря
Кнопка из Google календаря

6. Сложные ховеры (изменение размера, формы и т.д.)

Необычная кнопка с сайта nyc.awwwards.com
Необычная кнопка с сайта nyc.awwwards.com

На самом деле, типов ховеров может быть и больше, здесь перечислены, наверно, самые основные, и я думаю в комментариях вы сможете упомянуть еще какие-то.

Наводим порядок

Button, SelectList, Table, Chip, Lable, Switch, Pagination, навигация в левом меню

Какой тип решили использовать: Изменение фона

Кнопки в этой группе оказались самыми проблемными — у них оказалось сразу 3 типа ховера.

Мы решили сделать появление подложки единого цвета у кнопок, которые изначально не имеют никакого фона. Кнопки визуально похожие на ссылки получают важное отличие от ссылок при ховере.

Смену цвета у иконки мы оставили для активного состояния кнопки (например: tooltip или кнопка фильтров) и для того случая, когда зона наведения больше стандартного размера кнопки (например, у нас это кнопка закрытия toast)

Пример активной кнопки
Пример активной кнопки

Rating

Какой тип решили использовать: Изменение фона и изменение цвета иконки

В этом случае мы не стали менять тот ховер, какой был. Кнопка рейтинга похожа на обычной кнопку-иконку, у нее так же есть активное состояние, но эмоциональное значение у нее больше. Поэтому, чтобы усилить его, мы используем сразу два типа ховера.

RadioLine, CheckLine и Tab

Какой тип решили использовать: Изменение цвета текста

Приводим ховер в RadioLine, CheckLine к виду текущего ховера у табов — изменяем только цвет текста при наведении.

Убиваем двух зайцев разом: избавляемся от типа ховера с появлением обводки и улучшаем анимацию у RadioLine — в варианте с обводкой при перемещении синей подложки иногда заметно исчезающую обводку, что выглядит некрасиво.

Косяк в анимации в слоууууумо
Косяк в анимации в слоууууумо

Checkbox

Какой тип решили использовать: Изменение фона и бордера

Тут все просто: у компонента есть два состояния — выбранный и не выбранный — и соответственно два типа ховера — меняется фон и меняется бордер.

Input, MultiInput, TextArea, Select, Radiobutton

Какой тип решили использовать: Изменение бордера

Ховер на сложные элементы

У сложных элементов вроде карточки задачи на канбан-доске мы решили делать анимацию добавления эффекта при ховере — появление тени. Мы выбирали между тенью и появлением обводки, но обводку отмели, потому что обводка может частично теряться в элементе, в котором есть темные части по краям.

Но есть исключения

InputFile

У этого компонента есть два типа ховера — обычное наведение мышкой и перетаскивание файлов. Появление подложки при перетаскивании файлов это привычное поведение для такой кнопки, поэтому для обычного ховера оставляем смену цвета у иконки, чтобы эти два типа оставались разграниченными между собой.

Link Button

Не добавляем появление подложки, чтобы оставить визуальное отличие от кнопки при наведении.

Про анимацию ховеров

Практически у всех наших компонентов у ховера есть плавная анимация, но она нужна не всегда.

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

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