Создаем удобный, доступный и рабочий тултип

Что такое тултип?

Тултип — это всплывающее уведомление, как правило работающее по наведению или по клику. Тултип: Часто — значит почти всегда)) можно увидеть в интернет-магазинах. И на слове «часто» на этой странице вы тоже можете увидеть тултип.

Казалось бы все просто — сделай див в диве да по ховеру покажи внутренний див и все. Но не тут то было. Давайте разбираться.

Что нужно для правильного тултипа?

Делать исключительно див в диве нельзя, так как это будет крайне недоступно. Пользователи с ограниченными возможностями просто не смогут никак узнать информацию из тултипа, прочесть ее и понять что в ней. Мы должны им помочь, и это делается стандартными средствами html — с помощью Тултип: Атрибуты, помогающие расширить привычные возможности HTML в план доступности. Добавляют специальные описания и т. д. .

Ну вот и представье, что на сайт заходит незрячий человек. Он не сможет никак навестись мышкой на тултип, значит ему нужно альтернативное действие. И оно есть — состояние :focus. Так, он сможет лишь с клавиши tab попасть на любой интерактивный элемент страницы, и тултип мы должны сделать таковым.

Примечание: Сперва мы сделаем первый из двух видов тултипа — описательный. Еще есть «уведомляющий», о нем позже.

HTML

<span class="tooltip">
  <button class="tooltip__btn" aria-describedby="some_id">Термин</button>
  <span class="tooltip__txt" role="tooltip" id="some_id">
    <span class="visually-hidden">Тултип: </span>
    Описание термина
  </span>
</span>

Итак, что же здесь:

  • У нас есть спан-родитель с классом .tooltip для того, чтобы удобно относительно него располагать сам тултип.
  • Внутри два элемента — кнопка, открывающая тултип, а также спан с текстом — описанием.
  • Кнопка и спан связаны между собой засчет атрибута aria-describedby и id. Тут мы просто говорим, что хотим по действию на кнопку услышать то, что в спане, если грубо говоря.
  • У тултипа есть специальный атрибут role со значением tooltip. Это позволяет превратить наш обычный спан-элемент в доступный тултип-элемент.
  • Еще внутри тултипа есть спан с текстом Тултип:. Это для того, чтобы экранная читалка явно сказала пользователю, что он слышит содержимое тултипа.

CSS

.tooltip {
  position: relative;
}

.tooltip__btn {
  border: none;
  border-bottom: 1px dashed currentColor;
  padding: 0;
  color: #000;
  background-color: transparent;
  cursor: pointer;
}

.tooltip__txt {
  position: absolute;
  left: 0;
  top: calc(100% + 5px);
  z-index: 3;
  padding: 20px;
  width: max-content;
  max-width: 370px;
  box-shadow: 0 0 29px rgb(0 0 0&nbsp;/ 32%);
  font-weight: 400;
  font-size: 14px;
  line-height: 200%;
  color: #fff;
  background: #222;
  opacity: 0;
  visibility: hidden;
  transform: translateY(10px);
  transition: opacity .3s ease-in-out,transform .3s ease-in-out,visibility .3s ease-in-out;
}

.tooltip__btn:hover + .tooltip__txt {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.tooltip__btn:focus + .tooltip__txt {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  border: 0;
  clip: rect(0 0 0 0)
}

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

Вот так делается тултип с описанием. Их примеры есть в текущей статье, а также иногда будут встречаться и в иных моих статьях. А теперь давайте к тултипу-уведомлению. CSS там будет тот же, а вот html другой.

HTML (тултип-уведомление)

<span class="tooltip">
  <button class="tooltip__btn" aria-labelledby="warn-tooltip">
    <svg><use xlink:href="#warn"></use></svg>
  </button>
  <span class="tooltip__txt" role="tooltip" id="warn-tooltip">Уведомление!</span>
</span>

В сущности, тут все тоже самое, кроме пары нюансов:

  • Отсутствует текст в кнопке. Он и не нужен, при фокусе нужно сразу читать содержимое тултипа.
  • aria-describedby поменялся на aria-labelledby. Это как раз и меняет работу тултипа.

Теперь вместо того, чтобы читать сам термин и его расшифровку, тултип просто будет о чем-то уведомлять пользователя. Удобно)

Надеюсь, вам все было понятно. Рекомендую также ознакомиться со статьей: ссылка.

Ну и увидимся еще. Удачи!

предыдущий пост следующий пост