Введение в Popover API
из коробки.
Сначала <dialog>
, а теперь Поповеры/Всплывающие окна! Popover API, позволяющий создавать всплывающие окна, теперь доступен в большинстве современных браузеров.
В статье рассмотрены основы Popover API и то, как использовать его для создания всплывающих окон самым простым способом.
Что такое Поповер
Поповеры — это небольшие всплывающие окна, появляющиеся, когда пользователь нажимает клавишу или наводит курсор на определённый элемент на веб-странице или в приложении. Они показывают дополнительное содержимое или информацию, не перенаправляя пользователя на новую страницу. Всплывающие окна могут содержать текст, изображения, ссылки и другие интерактивные элементы.
Всплывающие окна можно использовать для самых разных целей, например:
- Всплывающие подсказки: Всплывающие окна часто предоставляют краткую и полезную информацию о конкретном элементе. Они похожи на всплывающие подсказки, но обычно более сложные и интерактивные.
- Формы: Они могут содержать формы для ввода данных пользователем, такие как формы входа в систему, строки поиска или формы обратной связи.
- Уведомления: Всплывающие окна могут использоваться для отображения уведомлений, предупреждений, оповещений или обновлений более заметным способом, чем простое текстовое сообщение.
- Меню: Выпадающие меню или контекстные меню, появляющиеся при клике на элемент, могут считаться всплывающими окнами.
- Дополнительные сведения: Они полезны для отображения дополнительных деталей или опций, связанных с конкретным элементом, не загромождая основной интерфейс.
Как уже отмечалось, для реализации всплывающих окон требовалась библиотека JavaScript вроде popper.js или собственный JavaScript, пока в браузерах не появился Popover API.
По сути, Popover API — это конгломерат HTML-атрибутов, CSS-свойств и JavaScript API, позволяющих разработчикам создавать всплывающие окна гибким и настраиваемым способом.
Базовое всплывающее окно
Чтобы создать любой HTML-элемент в виде всплывающего окна, достаточно добавить к нему новый атрибут popover
. И всё! Теперь элемент работает как всплывающее окно.
<div id="demopopover" popover>
A popover element
</div>
Когда элемент становится всплывающим окном, он будет скрыт по умолчанию.
Всплывающее окно можно, по сути, показать,
- При клике на другой элемент
- Через JavaScript API
Отображение всплывающего окна при клике на другом элементе
Чтобы показать всплывающее окно при клике на кнопку, можно использовать атрибут popovertarget
на кнопке и задать ему id
элемента всплывающего окна.
<button popovertarget="demopopover">
Toggle Popover Button
</button>
<div id="demopopover" popover>
A popover element
</div>
Вот как это выглядит в действии.
По умолчанию клик по кнопке просто переключает всплывающее окно. Но при желании можно отделить действие показа всплывающего окна от действия скрытия всплывающего окна с помощью атрибута popovertargetaction
и присвоить ему значение show
или hide
соответственно.
<button popovertarget="demopopover" popovertargetaction="show">
Show Popover Button
</button>
<button popovertarget="demopopover" popovertargetaction="hide">
Hide Popover Button
</button>
<div id="demopopover" popover>
A popover element
</div>
Вот как это выглядит в действии.
Отображение всплывающего окна с помощью JavaScript API
Чтобы показать всплывающее окно с помощью JavaScript, сначала нужно захватить popover элемент, скажем, через id
элемента, а затем вызвать метод togglePopover()
для него.
const popover = document.getElementById('demopopover');
popover.togglePopover();
В следующем примере при нажатии клавиши p переключается всплывающее окно.
Метод togglePopover()
позволяет показывать или скрывать всплывающее окно путём повторного нажатия клавиши p.
Существуют методы, которые можно использовать, чтобы показать или скрыть всплывающее окно соответственно.
showPopover()
— Показать всплывающее окноhidePopover()
— Скрыть всплывающее окно
Используйте эти методы в соответствии с вашими потребностями.
Немного о лёгком закрывании
всплывающих окон
Если атрибут popover
используется без значения, то его значение по умолчанию — auto
.
Это означает, что всплывающее окно исчезнет, когда…
- Пользователь кликает за пределами всплывающего окна
- Нажимает клавишу Esc.
Если необходимо отключить это поведение, можно использовать атрибут popover
со значением manual
.
<div id="demopopover" popover="manual">
A popover element
</div>
Теперь всплывающее окно не будет исчезать, если пользователь кликнет за его пределами или нажмёт клавишу Esc. Его можно убрать только кликнув по всплывающему окну или вызвав метод hidePopover()
.
Стилизация всплывающего окна
По умолчанию стилизация всплывающего окна довольно скромная. Но его можно стилизовать по своему усмотрению.
Для стилизации всплывающего окна используется селектор [popover]
.
[popover] {
background-color: lightblue;
color: #514f4f;
padding: 3em;
border-radius: 10px;
border: none;
font-family: sans-serif;
font-weight: bold;
font-size: 1.2em;
box-shadow: 1px 1px 5px 0px #0000005e;
}
Результат выглядит так.
Мы также можем изменить фон всплывающего окна с помощью селектора ::backdrop
. Например, можно сделать фон всплывающего окна размытым.
::backdrop {
backdrop-filter: blur(3px);
}
Результат выглядит так.
Анимация всплывающего окна
По умолчанию анимация всплывающего окна — это простой fade-in
и fade-out
. Но это поведение можно настроить, используя комбинацию псевдокласса :popover-open
и правила @starting-style
, как показано ниже.
[popover]:popover-open {
opacity: 1;
transform: rotate(0deg);
}
[popover] {
background-color: lightblue;
color: #514f4f;
padding: 3em;
border-radius: 10px;
border: none;
font-family: sans-serif;
font-weight: bold;
font-size: 1.2em;
box-shadow: 1px 1px 5px 0px #0000005e;
/* Финальное состояние анимации выхода */
opacity: 0;
transform: rotate(0deg);
transition: opacity 0.5s, transform 0.5s, overlay 0.5s allow-discrete,
display 0.5s allow-discrete;
}
/* Должно быть после предыдущего правила [popover]:popover-open
чтобы оно вступило в силу, поскольку специфика та же. */
@starting-style {
[popover]:popover-open {
opacity: 0;
transform: rotate(90deg);
}
}
::backdrop {
background-color: rgb(0 0 0 / 0%);
transition: display 0.7s allow-discrete, overlay 0.7s allow-discrete,
background-color 0.7s;
}
[popover]:popover-open::backdrop {
background-color: rgb(0 0 0 / 25%);
}
/* Селектор вложенности (&) не может представлять псевдоэлементы
поэтому это правило starting-style не может быть вложено */
@starting-style {
[popover]:popover-open::backdrop {
background-color: rgb(0 0 0 / 0%);
}
}
Конечный результат выглядит так.
Как вы можете видеть, всплывающее окно поворачивается на 90 градусов и переходит в конечное состояние после задержки в 0,5 секунды. Это достигается с помощью псевдокласса :popover-open
. С помощью at-правило @starting-style
начинается анимация, а свойство transition
используется для анимирования свойств opacity
и transform
.
Проверка поддержки Popover API
Хотя Popover API доступен в большинстве современных браузеров, может оказаться, что используемый браузер его не поддерживает.
Чтобы проверить, поддерживается ли API Popover, можно проверить, поддерживается ли свойство popover
в интерфейсе HTMLElement
или нет.
if ('popover' in HTMLElement.prototype) {
console.log('Popover API is supported');
}
Исходя из этого, можно решать, использовать ли Popover API или нет.
Заключение
Popover API улучшает взаимодействие с пользователем, позволяя разработчикам создавать контекстно-зависимые всплывающие окна, предоставляющие дополнительную информацию или действия без использования внешних библиотек или с минимальным количеством кода.
А поскольку API Popover доступен в большинстве современных браузеров, не вижу причин, по которым не стоит использовать его вместо любой другой JavaScript библиотеки.