Encodera

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

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

Как сделать всплывающую подсказку

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

Самая простая подсказка — атрибут title, её показывает сам браузер:

<button title="Copies the link to the clipboard">Copy link</button>

Она появляется с задержкой, выглядит по-разному в разных системах и не показывается на телефоне и с клавиатуры.

Своя подсказка

Текст хранится в атрибуте data-*, а рисует его псевдоэлемент ::after:

<style>
  .tip { position: relative; margin: 40px 16px 8px; }
  .tip::after { content: attr(data-tip); position: absolute; bottom: calc(100% + 6px); left: 50%; translate: -50% 0;
    padding: 4px 8px; border-radius: 4px; background: #222; color: white; font-size: 12px; white-space: nowrap;
    opacity: 0; pointer-events: none; transition: opacity 0.2s; }
  .tip:hover::after, .tip:focus-visible::after { opacity: 1; }
</style>
 
<button class="tip" data-tip="Saved to your list">Save</button>

attr(data-tip) подставляет значение атрибута в content. pointer-events: none не даёт подсказке перехватывать курсор.

Доступность

Текст из ::after экранные дикторы читают не всегда. Если подсказка важна, свяжите её с кнопкой через aria-describedby и отдельный элемент с текстом. Для подсказок с кнопками и ссылками внутри подходит popover.

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

Прятать в подсказку важную информацию — цену, условия, ошибку формы. На телефоне подсказку по наведению никто не увидит. Подсказка — это дополнение; всё нужное для действия должно быть видно сразу.

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

  • title — Дополнительная информация об элементе; показывается подсказкой при наведении мыши.
  • ::after — Создаёт виртуальный последний дочерний элемент — для значков, пометок и украшений после содержимого.
  • :hover — Срабатывает, пока над элементом находится указатель мыши.
  • data-* — Свои атрибуты для хранения данных в разметке; имя начинается с `data-`.

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

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