Всплывающие окна
Документация и примеры добавления всплывающих окон Bootstrap, подобных тем, которые есть в iOS, к любому элементу на вашем сайте.
Обзор
Что нужно знать при использовании плагина всплывающих окон:
- Всплывающие окна полагаются на стороннюю библиотеку Popper для позиционирования. Вы должны включить popper.min.js перед bootstrap.js или использовать
bootstrap.bundle.min.js
/bootstrap.bundle.js
, который содержит Popper.js, чтобы всплывающие окна работали! - Всплывающие окна требуют [плагина всплывающей подсказки]](/docs/5.1/components/tooltips/) в качестве зависимости.
- Всплывающие окна выбираются из соображений производительности, поэтому Вы должны инициализировать их самостоятельно.
- Значения
title
иcontent
нулевой длины никогда не будут показывать всплывающее окно. - Укажите
container: 'body'
чтобы избежать проблем с рендерингом в более сложных компонентах (например, в наших группах ввода, группах кнопок и т.д.). - Запуск всплывающих окон для скрытых элементов не работает.
- Всплывающие окна для элементов
.disabled
илиdisabled
должны запускаться на элементе оболочки. - При запуске из якорей, которые переносятся по нескольким строкам, всплывающие окна будут центрированы между общей шириной якорей. Используйте
.text-nowrap
на Ваших<a>
, чтобы избежать такого поведения. - Всплывающие окна необходимо скрыть до того, как соответствующие им элементы будут удалены из DOM.
- Всплывающие окна могут запускаться благодаря элементу внутри теневой DOM.
prefers-reduced-motion
. См. раздел с уменьшенным движением в нашей документации по специальным возможностям.
Продолжайте читать, чтобы увидеть, как работают всплывающие окна, на некоторых примерах.
Пример: Включить всплывающие окна везде
Один из способов инициализировать все всплывающие окна на странице - выбрать их по атрибуту data-bs-toggle
:
var popoverTriggerList = Array.prototype.slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'))
var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
return new bootstrap.Popover(popoverTriggerEl)
})
Пример: Использование опции container
Если у Вас есть стили родительского элемента, которые мешают отображению всплывающего окна, Вы захотите указать собственный container
, чтобы HTML всплывающего окна отображался внутри этого элемента.
var popover = new bootstrap.Popover(document.querySelector('.example-popover'), {
container: 'body'
})
Пример
<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" title="Заголовок всплывающего сообщения" data-bs-content="А вот и потрясающий контент. Это очень интересно. Правильно?">Нажмите, чтобы переключить всплывающее окно</button>
Четыре направления
Доступны четыре варианта: по верхнему, правому, нижнему и левому краям. Направления зеркалируются при использовании Bootstrap в RTL.
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Верхнее всплывающее окно">
Всплывающее окно вверху
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Правое всплывающее окно">
Всплывающее окно справа
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Нижнее всплывающее окно">
Всплывающее окно внизу
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Левое всплывающее окно">
Всплывающее окно слева
</button>
Отклонить при следующем нажатии
Используйте триггер focus
, чтобы закрыть всплывающие окна при следующем щелчке пользователем элемента, отличного от элемента переключения.
Специальная разметка, необходимая для закрытия при следующем клике
Для правильного кроссбраузерного и кроссплатформенного поведения Вы должны использовать тег <a>
, не тег <button>
, и Вы также должны включить tabindex
.
<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-bs-toggle="popover" data-bs-trigger="focus" title="Отклоняемое всплывающее окно" data-bs-content="А вот и потрясающий контент. Это очень интересно. Правильно?">Отклоняемое всплывающее окно</a>
var popover = new bootstrap.Popover(document.querySelector('.popover-dismiss'), {
trigger: 'focus'
})
Отключенные элементы
Элементы с атрибутом disabled
не являются интерактивными, то есть пользователи не могут навести на них курсор или щелкнуть по ним, чтобы вызвать всплывающее окно (или всплывающую подсказку). В качестве обходного пути Вы захотите запускать всплывающее окно из оболочки <div>
или <span>
, в идеале сделанной с фокусировкой на клавиатуре, используя tabindex="0"
.
Для отключенных триггеров всплывающего окна Вы также можете предпочесть data-bs-trigger="hover focus"
, чтобы всплывающее окно отображалось как немедленная визуальная обратная связь для ваших пользователей, поскольку они могут не ожидать клик на отключенный элемент.
<span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Disabled popover">
<button class="btn btn-primary" type="button" disabled>Отключенная кнопка</button>
</span>
Sass
Переменные
$popover-font-size: $font-size-sm;
$popover-bg: $white;
$popover-max-width: 276px;
$popover-border-width: $border-width;
$popover-border-color: rgba($black, .2);
$popover-border-radius: $border-radius-lg;
$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width);
$popover-box-shadow: $box-shadow;
$popover-header-bg: shade-color($popover-bg, 6%);
$popover-header-color: $headings-color;
$popover-header-padding-y: .5rem;
$popover-header-padding-x: $spacer;
$popover-body-color: $body-color;
$popover-body-padding-y: $spacer;
$popover-body-padding-x: $spacer;
$popover-arrow-width: 1rem;
$popover-arrow-height: .5rem;
$popover-arrow-color: $popover-bg;
$popover-arrow-outer-color: fade-in($popover-border-color, .05);
Использование
Включить всплывающие окна через JavaScript:
var exampleEl = document.getElementById('example')
var popover = new bootstrap.Popover(exampleEl, options)
Как заставить всплывающие окна работать для пользователей клавиатуры и вспомогательных технологий
Чтобы позволить пользователям клавиатуры активировать Ваши всплывающие окна, Вам следует добавлять их только к элементам HTML, которые традиционно ориентированы на клавиатуру и являются интерактивными (например, ссылки или элементы управления формами). Хотя произвольные элементы HTML (такие как <span>
) можно сделать доступными для фокусировки, добавив атрибут tabindex="0"
, это добавит потенциально раздражающие и сбивающие с толку позиции табуляции на неинтерактивных элементах для пользователей клавиатуры, и большинство Вспомогательные технологии в настоящее время не объявляют содержимое всплывающего окна в этой ситуации. Кроме того, не полагайтесь исключительно на hover
как на триггер для Ваших всплывающих окон, так как это сделает их невозможным для пользователей клавиатуры.
Хотя Вы можете вставлять богатый структурированный HTML-код в всплывающие окна с опцией html
, мы настоятельно рекомендуем Вам избегать добавления чрезмерного количества контента. В настоящее время всплывающие окна работают так, что после отображения их содержимое привязывается к элементу триггера с атрибутом aria-describedby
. В результате весь контент всплывающего окна будет объявлен пользователям вспомогательных технологий как один длинный непрерывный поток.
Кроме того, хотя можно также включить интерактивные элементы управления (например, элементы формы или ссылки) в Ваше всплывающее окно (путем добавления этих элементов в allowList
разрешенных атрибутов и тегов), имейте в виду, что в настоящее время всплывающее окно не управляет фокусом клавиатуры. Когда пользователь клавиатуры открывает всплывающее окно, фокус остается на инициирующем элементе, и поскольку всплывающее окно обычно не следует сразу за триггером в структуре документа, нет гарантии, что перемещение вперед/нажатие TAB приведет к перемещению пользователя клавиатуры в само всплывающее окно. Короче говоря, простое добавление интерактивных элементов управления к всплывающему окну может сделать эти элементы управления недоступными/непригодными для использования пользователями клавиатуры и пользователей вспомогательных технологий или, по крайней мере, сделать общий порядок фокусировки нелогичным. В этих случаях рассмотрите возможность использования модального диалога.
Параметры
Параметры можно передавать через атрибуты данных или JavaScript. Для атрибутов данных добавьте имя параметра в data-bs-
, как в data-bs-animation=""
. Обязательно измените тип case имени параметра с camelCase на kebab-case при передаче параметров через атрибуты данных. Например, вместо использования data-bs-customClass="beautifier"
используйте data-bs-custom-class="beautifier"
.
sanitize
, sanitizeFn
и allowList
не могут быть предоставлены с использованием атрибутов данных.
Наименование | Тип | По умолчанию | Описание |
---|---|---|---|
animation |
boolean | true |
Применить переход CSS fade к всплывающему окну |
container |
string | element | false | false |
Добавляет всплывающее окно к определенному элементу. Пример: |
content |
string | element | function | '' |
Значение содержимого по умолчанию, если атрибут Если задана функция, она будет вызываться со ссылкой |
delay |
number | object | 0 |
Задержка показа и скрытия всплывающего окна (мс) - не относится к ручному типу триггера Если указан номер, задержка применяется как к скрытию, так и к отображению. Структура объекта: |
html |
boolean | false |
Вставьте HTML в всплывающее окно. Если false, свойство, innerText будет использоваться для вставки содержимого в DOM. Используйте текст, если Вас беспокоят XSS-атаки. |
placement |
string | function | 'right' |
Как разместить всплывающее сообщение - auto | top | bottom | left | right. Когда функция используется для определения размещения, она вызывается с помощью узла DOM всплывающего окна в качестве первого аргумента и узла DOM элемента запуска в качестве второго. Контекст |
selector |
string | false | false |
Если указан селектор, объекты всплывающих окон будут делегированы указанным целям. На практике это используется для включения всплывающих окон динамического HTML-контента. См. это и информативный пример. |
template |
string | '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>' |
Базовый HTML-код для использования при создании всплывающего окна.
Самый внешний элемент оболочки должен иметь класс |
title |
string | element | function | '' |
Значение заголовка по умолчанию, если атрибут Если задана функция, она будет вызываться со ссылкой |
trigger |
string | 'click' |
Как запускается всплывающее окно - click | hover | focus | manual. Вы можете передать несколько триггеров; разделите их пробелом. manual нельзя комбинировать с другими триггерами. |
fallbackPlacements |
array | ['top', 'right', 'bottom', 'left'] |
Определите резервные места размещения, предоставив список мест размещения в массиве (в порядке предпочтения). Дополнительную информацию смотрите в документации о поведении Popper. |
boundary |
string | element | 'clippingParents' |
Граница ограничения переполнения всплывающего окна (применяется только к модификатору Popper preventOverflow). По умолчанию это 'clippingParents' и может принимать ссылку HTMLElement (только через JavaScript). Дополнительную информацию смотрите в detectOverflow документации Popper. |
customClass |
string | function | '' |
Добавляйте классы в всплывающее окно, когда оно отображается. Обратите внимание, что эти классы будут добавлены в дополнение к любым классам, указанным в шаблоне. Чтобы добавить несколько классов, разделите их пробелами: Вы также можете передать функцию, которая должна возвращать одну строку, содержащую дополнительные имена классов. |
sanitize |
boolean | true |
Включите или отключите дезинфекцию. Если активированы параметры 'template' , 'content' и 'title' , будут очищены. Смотрите раздел очистки в нашей документации по JavaScript. |
allowList |
object | Значение по умолчанию | Объект, содержащий разрешенные атрибуты и теги |
sanitizeFn |
null | function | null |
Здесь Вы можете предоставить свою собственную функцию дезинфекции. Это может быть полезно, если Вы предпочитаете использовать специальную библиотеку для выполнения очистки. |
offset |
array | string | function | [0, 0] |
Смещение всплывающего окна относительно его цели. Вы можете передать строку в атрибутах данных со значениями, разделенными запятыми, например: Когда функция используется для определения смещения, она вызывается с объектом, содержащим размещение popper, ссылку и popper rects в качестве первого аргумента. Узел DOM запускающего элемента передается в качестве второго аргумента. Функция должна возвращать массив с двумя числами: Дополнительную информацию смотрите в offset документации Popper. |
offset |
array | string | function | [0, 8] |
Смещение всплывающего окна относительно его цели. Вы можете передать строку в атрибутах данных со значениями, разделенными запятыми, например: Когда функция используется для определения смещения, она вызывается с объектом, содержащим размещение popper, ссылку и popper rects в качестве первого аргумента. Узел DOM запускающего элемента передается в качестве второго аргумента. Функция должна возвращать массив с двумя числами: Дополнительную информацию смотрите в offset документации Popper. |
popperConfig |
null | object | function | null |
Чтобы изменить конфигурацию Popper по умолчанию для Bootstrap, смотрите конфигурацию Popper. Когда функция используется для создания конфигурации Popper, она вызывается с объектом, который содержит конфигурацию Popper по умолчанию для Bootstrap. Это поможет вам использовать и объединить настройки по умолчанию с вашей собственной конфигурацией. Функция должна возвращать объект конфигурации для Popper. |
Атрибуты данных для отдельных всплывающих окон
В качестве альтернативы параметры для отдельных всплывающих окон можно указать с помощью атрибутов данных, как описано выше.
Использование функции с popperConfig
var popover = new bootstrap.Popover(element, {
popperConfig: function (defaultBsPopperConfig) {
// var newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
Методы
Асинхронные методы и переходы
Все методы API асинхронны и запускают переход. Они возвращаются к вызывающей стороне, как только переход начинается, но до его завершения. Кроме того, вызов метода переходного компонента будет проигнорирован.
Дополнительную информацию см. в нашей документации по JavaScript.
show
Показывает всплывающее окно элемента. Возврат к вызывающей стороне до того, как всплывающее окно было показано (то есть до того, как произойдет событие shown.bs.popover
). Это считается “ручным” запуском всплывающего окна. Всплывающие окна, заголовок и содержимое которых имеют нулевую длину, никогда не отображаются.
myPopover.show()
hide
Скрывает всплывающее окно элемента. Возврат к вызывающей стороне до того, как всплывающее окно было фактически скрыто (т.е. до того, как произойдет событие hidden.bs.popover
). Это считается “ручным” запуском всплывающего окна.
myPopover.hide()
toggle
Переключает всплывающее окно элемента (Удаляет сохраненные данные в элементе DOM). Возврат к вызывающей стороне до того, как всплывающее окно было фактически показано или скрыто (то есть до того, как произойдет событие shown.bs.popover
или hidden.bs.popover
). Это считается “ручным” запуском всплывающего окна.
myPopover.toggle()
dispose
Скрывает и уничтожает всплывающее окно элемента. Всплывающие окна, использующие делегирование (которые создаются с использованием параметр selector
), не могут быть уничтожены индивидуально для дочерних элементов триггера.
myPopover.dispose()
enable
Дает возможность отображения всплывающего окна элемента. По умолчанию всплывающие окна включены.
myPopover.enable()
disable
Удаляет возможность отображения всплывающего окна элемента. Всплывающее окно будет отображаться, только если оно будет повторно включено.
myPopover.disable()
toggleEnabled
Переключает возможность отображения или скрытия всплывающего окна элемента.
myPopover.toggleEnabled()
update
Обновляет позицию всплывающего окна элемента.
myPopover.update()
getInstance
Статический метод, который позволяет Вам получить экземпляр всплывающего окна, связанный с элементом DOM
var exampleTriggerEl = document.getElementById('example')
var popover = bootstrap.Popover.getInstance(exampleTriggerEl) // Возвращает экземпляр всплывающего окна Bootstrap
getOrCreateInstance
Статический метод, который позволяет вам получить экземпляр всплывающего окна, связанный с элементом DOM, или создать новый, если он не был инициализирован.
var exampleTriggerEl = document.getElementById('example')
var popover = bootstrap.Popover.getOrCreateInstance(exampleTriggerEl) // Возвращает экземпляр всплывающего окна Bootstrap
События
Тип события | Описание |
---|---|
show.bs.popover | Это событие запускается немедленно при вызове метода экземпляра show . |
shown.bs.popover | Это событие запускается, когда всплывающее окно становится видимым для пользователя (будет ожидать завершения переходов CSS). |
hide.bs.popover | Это событие запускается сразу после вызова метода экземпляра hide . |
hidden.bs.popover | Это событие запускается, когда всплывающее окно перестало быть скрытым от пользователя (будет ожидать завершения переходов CSS). |
inserted.bs.popover | Это событие запускается после события show.bs.popover , когда шаблон всплывающего окна добавлен в DOM. |
var myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', function () {
// сделайте что-нибудь...
})