Посмотреть на GitHub Оригинал

Всплывающие окна

Документация и примеры добавления всплывающих окон Bootstrap, подобных тем, которые есть в iOS, к любому элементу на Вашем сайте.

Обзор

Что нужно знать при использовании плагина popover:

  • Popovers полагаются на стороннюю библиотеку Popper для позиционирования. Вы должны включить popper.min.js перед bootstrap.js или использовать bootstrap.bundle.min.js / bootstrap.bundle.js, который содержит Popper чтобы поповеры работали!
  • Для всплывающих окон требуется плагин всплывающей подсказки в качестве зависимости.
  • Если Вы создаете наш JavaScript из исходного кода, для него требуется util.js.
  • Всплывающие окна включены по соображениям производительности, поэтому Вы должны инициализировать их самостоятельно.
  • Значения title и content нулевой длины никогда не будут показывать всплывающее окно.
  • Укажите container: 'body', чтобы избежать проблем с рендерингом в более сложных компонентах (например, в наших группах ввода, группах кнопок и т.д.).
  • Запуск всплывающих окон для скрытых элементов не будет работать.
  • Всплывающие окна для элементов .disabled или disabled должны запускаться в элементе оболочки.
  • При запуске от якорей, которые переносятся по нескольким строкам, всплывающие окна будут центрированы между общей шириной якорей. Используйте .text-nowrap на Ваших <a> чтобы избежать такого поведения.
  • Всплывающие окна должны быть скрыты до того, как соответствующие им элементы будут удалены из DOM.
  • Всплывающие окна могут запускаться благодаря элементу внутри теневого DOM.
По умолчанию этот компонент использует встроенное средство очистки содержимого, которое удаляет все элементы HTML, которые не разрешены явно. Дополнительные сведения смотрите в разделе sanitizer в нашей документации по JavaScript.
Эффект анимации этого компонента зависит от медиазапроса prefers-reduced-motion. См. Раздел с уменьшенным движением в нашей документации по специальным возможностям.

Продолжайте читать, чтобы увидеть, как работают всплывающие окна, на некоторых примерах.

Пример: включить всплывающие окна везде

Один из способов инициализировать все всплывающие окна на странице - выбрать их по атрибуту data-toggle:

$(function () {
  $('[data-toggle="popover"]').popover()
})

Пример: использование варианта container

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

$(function () {
  $('.example-popover').popover({
    container: 'body'
  })
})

Пример

<button type="button" class="btn btn-lg btn-danger" data-toggle="popover" title="Заголовок всплывающего окна" data-content="А вот и потрясающий контент. Это очень интересно. Верно?">Нажмите, чтобы переключить всплывающее окно</button>

Четыре направления

Доступны четыре варианта: по верхнему, правому, нижнему и левому краям.

<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="top" data-content="Top popover">
  Всплывающее окно вверху
</button>
<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="right" data-content="Right popover">
  Всплывающее окно справа
</button>
<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="bottom" data-content="Bottom popover">
  Всплывающее окно снизу
</button>
<button type="button" class="btn btn-secondary" data-container="body" data-toggle="popover" data-placement="left" data-content="Left popover">
  Всплывающее окно слева
</button>

Отклонить при следующем нажатии

Используйте триггер focus, чтобы закрыть всплывающие окна при следующем щелчке пользователем элемента, отличного от элемента переключения.

Специальная разметка, необходимая для закрытия при следующем щелчке

Для правильного кроссбраузерного и кросс-платформенного поведения Вы должны использовать тег <a>, не тег <button>, а также Вы должны включить атрибут tabindex.

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" data-trigger="focus" title="Отклоняемое всплывающее окно" data-content="А вот и потрясающий контент. Это очень интересно. Верно?">Отклоняемое всплывающее окно</a>
$('.popover-dismiss').popover({
  trigger: 'focus'
})

Отключенные элементы

Элементы с атрибутом disabled не являются интерактивными, то есть пользователи не могут навести на них курсор или щелкнуть по ним, чтобы вызвать всплывающее окно (или всплывающую подсказку). В качестве обходного пути Вы захотите вызвать всплывающее окно из оболочки <div> или <span> и переопределить pointer-events на отключенном элементе.

Для отключенных триггеров всплывающего окна Вы также можете предпочесть data-trigger="hover", чтобы всплывающее окно отображалось как немедленная визуальная обратная связь для Ваших пользователей, поскольку они могут не ожидать нажатия на отключенный элемент.

<span class="d-inline-block" data-toggle="popover" data-content="Отключенное всплывающее окно">
  <button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Отключенная кнопка</button>
</span>

Применение

Включить всплывающие окна через JavaScript:

$('#example').popover(options)
GPU ускорение

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

Предлагаемое исправление:

Popper.Defaults.modifiers.computeStyle.gpuAcceleration = !(window.devicePixelRatio < 1.5 && /Win/.test(navigator.platform))

Как заставить всплывающие окна работать для пользователей клавиатуры и вспомогательных технологий

Чтобы позволить пользователям клавиатуры активировать Ваши всплывающие окна, Вы должны добавлять их только к элементам HTML, которые традиционно ориентированы на клавиатуру и являются интерактивными (например, ссылки или элементы управления формами). Хотя произвольные элементы HTML (такие как <span>) можно сделать доступными для фокусировки, добавив атрибут tabindex="0", это добавит потенциально раздражающие и сбивающие с толку позиции табуляции на неинтерактивных элементах для пользователей клавиатуры, и большинство Вспомогательные технологии в настоящее время не объявляют содержимое всплывающего окна в этой ситуации. Кроме того, не полагайтесь исключительно на hover как на триггер для ваших всплывающих окон, так как это сделает их невозможным для пользователей клавиатуры.

Хотя Вы можете вставлять богатый структурированный HTML-код в всплывающие окна с опцией html, мы настоятельно рекомендуем Вам избегать добавления чрезмерного количества контента. В настоящее время всплывающие окна работают так, что после отображения их содержимое привязывается к элементу триггера с атрибутом aria-describeby. В результате весь контент всплывающего окна будет объявлен пользователям вспомогательных технологий как один длинный непрерывный поток.

Кроме того, хотя можно также включить интерактивные элементы управления (такие как элементы формы или ссылки) в Ваше всплывающее окно (путем добавления этих элементов в белый список whiteList или разрешенные атрибуты и теги), имейте в виду, что в настоящее время всплывающее окно не управляет фокусом порядка клавиатуры. Когда пользователь клавиатуры открывает всплывающее окно, фокус остается на инициирующем элементе, и поскольку всплывающее окно обычно не следует сразу за триггером в структуре документа, нет гарантии, что перемещение вперед/нажатие TAB приведет к перемещению пользователя клавиатуры в само всплывающее окно. Короче говоря, простое добавление интерактивных элементов управления к всплывающему окну может сделать эти элементы управления недоступными/непригодными для использования пользователями клавиатуры и пользователей вспомогательных технологий или, по крайней мере, сделать общий порядок фокусировки нелогичным. В этих случаях рассмотрите возможность использования модального диалога.

Параметры

Параметры могут передаваться через атрибуты данных или JavaScript. Для атрибутов данных добавьте имя параметра к data-, как в data-animation="".

Обратите внимание, что по соображениям безопасности параметры sanitize, sanitizeFn и whiteList не могут быть предоставлены с использованием атрибутов данных.
Название тип По умолчанию Описание
animation boolean true Применить переход CSS fade к всплывающему окну
container string | element | false false

Добавляет всплывающее окно к определенному элементу. Пример: container: 'body'. Этот параметр особенно полезен тем, что позволяет размещать всплывающее окно в потоке документа рядом с элементом запуска, что предотвращает перемещение всплывающего окна в сторону от элемента запуска во время изменения размера окна.

content string | element | function ''

Значение содержимого по умолчанию, если атрибут data-content отсутствует.

Если задана функция, она будет вызываться со ссылкой this, установленной на элемент, к которому прикреплено всплывающее окно.

delay number | object 0

Задержка показа и скрытия всплывающего окна (мс) - не относится к ручному типу триггера.

Если указан номер, задержка применяется как к скрытию, так и к отображению.

Структура объекта: delay: { "show": 500, "hide": 100 }

html boolean false Вставьте HTML в всплывающее окно. Если false, метод jQuery text будет использоваться для вставки содержимого в DOM. Используйте текст, если Вас беспокоят XSS-атаки.
placement string | function 'right'

Как разместить всплывающее окно - auto | top | bottom | left | right.
Когда указано auto, всплывающее окно будет динамически переориентировано.

Когда функция используется для определения размещения, она вызывается с помощью узла DOM всплывающего окна в качестве первого аргумента и узла DOM элемента запуска в качестве второго. Контекст this установлен на экземпляр popover.

selector string | false false Если предусмотрен селектор, объекты всплывающих окон будут делегированы указанным целям. На практике это используется для включения всплывающих окон в динамический HTML-контент. Смотрите это и информативный пример.
template string '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'

Базовый HTML-код для использования при создании всплывающего окна.

title заголовок всплывающего окна будет вставлен в .popover-header.

content содержимое всплывающего окна будет вставлено в .popover-body.

.arrow станет стрелкой всплывающего окна.

Самый внешний элемент оболочки должен иметь класс .popover.

title string | element | function ''

Значение заголовка по умолчанию, если атрибут title отсутствует.

Если задана функция, она будет вызываться со ссылкой thisустановленной на элемент, к которому прикреплено всплывающее окно.

trigger string 'click' Как запускается всплывающее окно - click | hover | focus | manual. Вы можете передать несколько триггеров; разделите их пробелом. manual нельзя комбинировать с другими триггерами.
offset number | string 0 Смещение всплывающего окна относительно его цели. Дополнительную информацию смотрите в документации Popper по смещению.
fallbackPlacement string | array 'flip' Разрешить указать, какую позицию Поппер будет использовать при откате. Для получения дополнительной информации смотрите документацию Popper о поведении
customClass string | function ''

Добавляйте классы в всплывающее окно, когда оно отображается. Обратите внимание, что эти классы будут добавлены в дополнение к любым классам, указанным в шаблоне. Чтобы добавить несколько классов, разделите их пробелами: 'a b'.

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

boundary string | element 'scrollParent' Граница ограничения переполнения всплывающего окна. Принимает значения 'viewport', 'window', 'scrollParent' или ссылку HTMLElement (только JavaScript). Дополнительную информацию смотрите документацию Popper по preventOverflow.
sanitize boolean true Включите или отключите дезинфекцию. Если активирован параметр 'template', 'content' и 'title' будут очищены. Смотрите раздел sanitizer в нашей документации по JavaScript.
whiteList object Значение по умолчанию Объект, содержащий разрешенные атрибуты и теги
sanitizeFn null | function null Здесь Вы можете предоставить свою собственную функцию очистки. Это может быть полезно, если Вы предпочитаете использовать специальную библиотеку для выполнения очистки.
popperConfig null | object null Чтобы изменить конфигурацию Popper по умолчанию для Bootstrap, смотрите конфигурацию Popper.

Атрибуты данных для отдельных всплывающих окон

В качестве альтернативы параметры для отдельных всплывающих окон можно указать с помощью атрибутов данных, как описано выше.

Методы

Асинхронные методы и переходы

Все методы API асинхронны и запускают переход. Они возвращаются к вызывающей стороне, как только переход начинается, но до его завершения. Кроме того, вызов метода переходного компонента будет проигнорирован.

Дополнительную информацию см. в нашей документации по JavaScript.

$().popover(options)

Инициализирует всплывающие окна для коллекции элементов.

.popover('show')

Показывает всплывающее окно элемента. Возврат к вызывающей стороне до того, как всплывающее окно было показано (то есть до того, как произойдет событие shown.bs.popover). Это считается “ручным” запуском всплывающего окна. Всплывающие окна, заголовок и содержимое которых имеют нулевую длину, никогда не отображаются.

$('#element').popover('show')

.popover('hide')

Скрывает всплывающее окно элемента. Возврат к вызывающей стороне до того, как всплывающее окно было фактически скрыто (т.е. до того, как произойдет событие hidden.bs.popover). Это считается “ручным” запуском всплывающего окна.

$('#element').popover('hide')

.popover('toggle')

Переключает всплывающее окно элемента. Возврат к вызывающей стороне до того, как всплывающее окно было фактически показано или скрыто (то есть до того, как произойдет событие shown.bs.popover или hidden.bs.popover). Это считается “ручным” запуском всплывающего окна.

$('#element').popover('toggle')

.popover('dispose')

Скрывает и уничтожает всплывающее окно элемента. Всплывающие окна, использующие делегирование (которые создаются с использованием опции selector), не могут быть уничтожены индивидуально для дочерних триггерных элементов.

$('#element').popover('dispose')

.popover('enable')

Дает возможность отображения всплывающего окна элемента. Всплывающие окна включены по умолчанию.

$('#element').popover('enable')

.popover('disable')

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

$('#element').popover('disable')

.popover('toggleEnabled')

Переключает возможность отображения или скрытия всплывающего окна элемента.

$('#element').popover('toggleEnabled')

.popover('update')

Обновляет позицию всплывающего окна элемента.

$('#element').popover('update')

События

Тип события Описание
show.bs.popover Это событие запускается немедленно при вызове метода экземпляра show.
shown.bs.popover Это событие запускается, когда всплывающее окно становится видимым для пользователя (будет ожидать завершения переходов CSS).
hide.bs.popover Это событие запускается сразу после вызова метода экземпляра hide.
hidden.bs.popover Это событие запускается, когда всплывающее окно перестает быть скрытым от пользователя (будет ждать завершения переходов CSS).
inserted.bs.popover Это событие запускается после события show.bs.popover, когда шаблон всплывающего окна добавлен в DOM.
$('#myPopover').on('hidden.bs.popover', function () {
  // сделайте что-нибудь...
})