Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как показать элемент при наведении

Короткий ответ

Спрячьте элемент и показывайте его, когда курсор над родителем:

<style>
  .card { position: relative; width: 200px; }
  .card img { display: block; width: 100%; border-radius: 8px; }
  .card .actions { position: absolute; inset: auto 8px 8px; display: none; }
  .card:hover .actions { display: block; }
</style>
 
<div class="card">
  <img src="/media/photo-400x250.jpg" alt="A flower">
  <div class="actions"><button>♥ Like</button></div>
</div>

Плавное появление

display не анимируется, поэтому для плавности используют opacity и transition:

<style>
  .tip { opacity: 0; transition: opacity 0.3s; }
  .item:hover .tip, .item:focus-within .tip { opacity: 1; }
</style>
 
<div class="item">
  <button>Hover or Tab here</button>
  <span class="tip">Saved to favorites</span>
</div>

:focus-within показывает подсказку и при переходе клавишей Tab — без него пользователь клавиатуры её никогда не увидит.

Сенсорные экраны

На телефоне наведения нет. Скрывайте при наведении только второстепенное, а для устройств без мыши показывайте всё сразу через медиазапрос @media (hover: none).

Частая ошибка

Кнопки внутри карточки показывают только по :hover. Пользователь клавиатуры переходит на невидимую кнопку и не понимает, где он, а на телефоне до неё не добраться вовсе. Добавляйте к :hover правило :focus-within и подумайте, нужен ли эффект на сенсорных экранах.

Функции из этого ответа

  • :hover — Срабатывает, пока над элементом находится указатель мыши.
  • opacity — Прозрачность всего элемента вместе с содержимым.
  • transition — Плавно анимирует изменение свойства от старого значения к новому.
  • :focus — Срабатывает у элемента, на котором сейчас фокус: поле, в которое вводят текст, кнопка, выбранная клавишей Tab.
  • visibility — Скрывает элемент, но сохраняет занятое им место.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.