Представляем API поповера

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

Чтобы решить эту проблему, в браузеры поступает новый набор декларативных HTML API для создания всплывающих окон, начиная с API popover в Chromium 114.

Атрибут popover

Поддержка браузера

  • Хром: 114.
  • Край: 114.
  • Фаерфокс: 125.
  • Сафари: 17.

Источник

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

  • Продвижение на верхний слой. Поповеры появятся на отдельном слое над остальной частью страницы, поэтому вам не придется возиться с z-index.
  • Функция отключения света. Щелчок за пределами области всплывающего окна закроет всплывающее окно и вернет фокус.
  • Управление фокусом по умолчанию. Открытие всплывающего окна приводит к тому, что следующая табуляция останавливается внутри всплывающего окна.
  • Доступные привязки клавиатуры. Нажатие клавиши esc закроет всплывающее окно и вернет фокус.
  • Доступные привязки компонентов. Семантическое соединение элемента popover с триггером popover.

Теперь вы можете создавать всплывающие окна со всеми этими функциями без использования JavaScript. Базовый поповер требует трёх вещей:

  • Атрибут popover для элемента, содержащего всплывающее окно.
  • id элемента, содержащего всплывающее окно.
  • popovertarget со значением id всплывающего окна в элементе, который открывает всплывающее окно.
<button popovertarget="my-popover"> Open Popover </button>

<div id="my-popover" popover>
  <p>I am a popover with more information.</p>
</div>

Теперь у вас есть полнофункциональный базовый поповер.

Это всплывающее окно можно использовать для передачи дополнительной информации или в качестве виджета раскрытия информации.

Значения по умолчанию и переопределения

По умолчанию, как и в предыдущем фрагменте кода, настройка всплывающего окна с помощью popovertarget означает, что кнопка или элемент, открывающий всплывающее окно, будет переключать его открытие и закрытие. Однако вы также можете создавать явные всплывающие окна, используя popovertargetaction . Это переопределяет действие переключения по умолчанию. Опции popovertargetaction включают в себя:

popovertargetaction="show" : показывает всплывающее окно. popovertargetaction="hide" : скрывает всплывающее окно.

Используя popovertargetaction="hide" , вы можете создать кнопку «закрыть» внутри всплывающего окна, как показано в следующем фрагменте:

<button popovertarget="my-popover" popovertargetaction="hide">
    <span aria-hidden="true">❌</span>
    <span class="sr-only">Close</span>
</button>

Автоматические и ручные поповеры

Использование атрибута popover на самом деле является ярлыком для popover="auto" . При открытии popover по умолчанию принудительно закроет другие автоматические всплывающие окна, за исключением всплывающих окон-предков. Его можно закрыть с помощью кнопки Light-Dismiss или кнопки закрытия.

С другой стороны, установка popover=manual создает другой тип всплывающего окна: всплывающее окно вручную. Они не закрывают принудительно элементы других типов и не закрываются с помощью отключения света. Вы должны закрыть их с помощью таймера или явного действия закрытия. Типы всплывающих окон, подходящие для popover=manual — это элементы, которые появляются и исчезают, но не должны влиять на остальную часть страницы, например всплывающее уведомление.

Если вы изучите приведенную выше демонстрацию, вы увидите, что щелчок за пределами области всплывающего окна не приводит к его закрытию. Кроме того, если бы были открыты другие всплывающие окна, они бы не закрылись.

Чтобы просмотреть различия:

Поповеры с popover=auto :

  • При открытии принудительно закройте другие всплывающие окна.
  • Могу свет-уволить.

Поповеры с popover=manual :

  • Не закрывайте принудительно элементы других типов.
  • Не зажигайте-увольняйте. Закройте их, используя переключатель или действие закрытия.

Стилизация всплывающих окон

Итак, вы узнали об основных всплывающих окнах в HTML. Но есть также несколько приятных стилевых возможностей, которые есть в popover . Одним из них является возможность стилизовать ::backdrop .

В auto поповерах это слой непосредственно под верхним слоем (где находится поповер), который находится над остальной частью страницы. В следующем примере элементу ::backdrop присвоен полупрозрачный цвет:

#size-guide::backdrop {
  background: rgb(190 190 190 / 50%);
}

Разница между popover и dialog

Важно отметить, что атрибут popover сам по себе не обеспечивает семантику. И хотя теперь вы можете создавать модальные диалоговые возможности с помощью popover="auto" , между ними есть несколько ключевых отличий:

Элемент dialog , открытый с помощью dialog.showModal (модальный диалог), представляет собой интерфейс, требующий явного взаимодействия с пользователем для закрытия модального окна. popover поддерживает функцию Light-Dismiss. Модальный dialog этого не делает. Модальный диалог делает остальную часть страницы инертной . popover этого не делает.

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

<button popovertarget="candle-01">
  Quick Shop
</button>
<dialog popover id="candle-01">
  <button class="close-btn" popovertarget="candle-01" popovertargetaction="hide">...</button>
  <div class="product-preview-container">
    ...
  </div>
</dialog>

Вскоре

Интерактивный вход и выход

Возможность анимировать отдельные свойства, включая анимацию display: none и анимацию верхнего слоя и обратно, пока недоступна в браузерах. Однако они запланированы для следующей версии Chromium, которая появится сразу после этого выпуска.

Благодаря возможности анимировать отдельные свойства и использованию :popover-open и @starting-style вы сможете настраивать стили до и после изменения, чтобы обеспечить плавные переходы при открытии и закрытии всплывающих окон. Возьмите предыдущий пример. Анимация появления и исчезновения выглядит намного плавнее и обеспечивает более плавный пользовательский интерфейс:

Расположение якоря

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

В следующей демонстрации радиального меню используется API-интерфейс popover вместе с позиционированием привязки CSS , чтобы гарантировать, что #menu-items всплывающего окна всегда привязаны к триггеру переключения — кнопке #menu-toggle .

Настройка якорей аналогична настройке поповеров:

<button id="menu-toggle" popovertarget="menu-items">
  Open Menu
</button>
<ul id="menu-items" popover anchor="menu-toggle">
  <li class="item">...</li>
  <li class="item">...</li>
</ul>

Вы устанавливаете привязку, присваивая ей id (в этом примере #menu-toggle ), а затем используете anchor="menu-toggle" для соединения двух элементов. Теперь вы можете использовать anchor() для стилизации всплывающего окна. Центральное всплывающее меню, привязанное к базовой линии переключателя привязки, может быть оформлено следующим образом:

#menu-items {
  bottom: anchor(bottom);
  left: anchor(center);
  translate: -50% 0;
}

Теперь у вас есть полнофункциональное всплывающее меню, привязанное к кнопке переключения и имеющее все встроенные функции всплывающего окна, JavaScript не требуется!

Заключение

API popover — это первый шаг в серии новых возможностей, которые по умолчанию упрощают создание веб-приложений и делают их более доступными. Мне очень интересно видеть, как вы используете поповеры!

Дополнительное чтение