Popovers
Документация и примеры добавления всплывающих окон Bootstrap, подобных тем, которые есть в iOS, к любому элементу на вашем сайте.
Обзор
Что следует знать при использовании плагина popover:
- Всплывающие окна зависят от сторонней библиотеки Popper для позиционирования. Вы должны включить popper.min.js перед
bootstrap.jsили использовать тот,bootstrap.bundle.min.jsкоторый содержит Popper. - Для всплывающих окон требуется плагин popover в качестве зависимости.
- Всплывающие окна разрешены из соображений производительности, поэтому вы должны инициализировать их самостоятельно.
- Значения
titleиcontentнулевой длины никогда не будут показывать всплывающее окно. - Укажите
container: 'body', чтобы избежать проблем с рендерингом в более сложных компонентах (таких как наши группы ввода, группы кнопок и т.д.). - Запуск всплывающих окон для скрытых элементов не будет работать.
- Всплывающие окна для элементов
.disabledordisabledдолжны запускаться на элементе-оболочке. - При запуске из якорей, которые переносятся по нескольким строкам, всплывающие окна будут располагаться по центру между общей шириной якорей. Используйте
.text-nowrapна вашем<a>компьютере, чтобы избежать такого поведения. - Всплывающие окна должны быть скрыты до того, как соответствующие им элементы будут удалены из DOM.
- Всплывающие окна могут запускаться благодаря элементу внутри shadow DOM.
prefers-reduced-motion медиа-запроса. Смотрите раздел уменьшенное движение в документации по специальным возможностям.Продолжайте читать, чтобы увидеть, как работают всплывающие окна на некоторых примерах.
Примеры
Включить всплывающие окна
Как упоминалось выше, вы должны инициализировать всплывающие окна, прежде чем их можно будет использовать. Одним из способов инициализации всех всплывающих окон на странице было бы выбрать их по их data-bs-toggle атрибуту, например:
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
Живая демонстрация
Мы используем JavaScript, аналогичный приведенному выше фрагменту, для отображения следующего всплывающего окна в реальном времени. Заголовки задаются через data-bs-title, а основное содержимое - через data-bs-content.
title, либо data-bs-title в вашем HTML. Когда title используется, Popper автоматически заменит его на data-bs-title при рендеринге элемента.<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover title" data-bs-content="И вот потрясающий контент. Это очень увлекательно. Верно?">Нажмите, чтобы переключить всплывающее окно</button>
Четыре направления
Доступны четыре параметра: верхний, правый, нижний и левый. Направления отображаются зеркально при использовании Bootstrap в RTL. Установите data-bs-placement для изменения направления.
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
Всплывающее окно сверху
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">
Всплывающее окно справа
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">
Всплывающее окно снизу
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">
Всплывающее окно слева
</button>
Пользовательские container
Если у вас есть какие-либо стили в родительском элементе, которые мешают всплывающему окну, вы захотите указать пользовательский, container чтобы HTML-код всплывающего окна отображался внутри этого элемента. Это обычное явление в адаптивных таблицах, группах ввода и тому подобном.
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})
Другая ситуация, когда вам захочется установить явный пользовательский параметр, container - это всплывающие окна внутри модального диалогового окна, чтобы убедиться, что само всплывающее окно добавляется к модальному. Это особенно важно для всплывающих окон, содержащих интерактивные элементы – модальные диалоговые окна будут отвлекать внимание, поэтому, если всплывающее окно не является дочерним элементом модального, пользователи не смогут сфокусировать или активировать эти интерактивные элементы.
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})
Пользовательские всплывающие окна
Добавлено в версии 5.2.0
Вы можете настроить внешний вид всплывающих окон, используя переменные CSS. Мы устанавливаем пользовательский класс с помощью data-bs-custom-class="custom-popover" для определения нашего пользовательского внешнего вида и используем его для переопределения некоторых локальных переменных CSS.
.custom-popover {
--bs-popover-max-width: 200px;
--bs-popover-border-color: var(--bd-violet-bg);
--bs-popover-header-bg: var(--bd-violet-bg);
--bs-popover-header-color: var(--bs-white);
--bs-popover-body-padding-x: 1rem;
--bs-popover-body-padding-y: .5rem;
}
<button type="button" class="btn btn-secondary"
data-bs-toggle="popover" data-bs-placement="right"
data-bs-custom-class="custom-popover"
data-bs-title="Custom popover"
data-bs-content="Это всплывающее окно оформлено с помощью переменных CSS.">
Пользовательское всплывающее окно
</button>
Закрываются при следующем нажатии
Используйте focus триггер для отключения всплывающих окон при следующем нажатии пользователем элемента, отличного от элемента переключения.
<a> элементы, а не <button>, и вы должны включить tabindex.<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-title="Закрываемое всплывающее окно" data-bs-content="А вот потрясающий контент. Это очень увлекательно. Верно?">Недопустимое всплывающее окно</a>
const popover = new bootstrap.Popover('.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>
CSS
Переменные
Добавлено в версии 5.2.0
В рамках развивающегося подхода Bootstrap к CSS-переменным, всплывающие окна теперь используют локальные CSS-переменные на .popover для расширенной настройки в режиме реального времени. Значения для переменных CSS устанавливаются через Sass, поэтому настройка Sass по-прежнему поддерживается.
--#{$prefix}popover-zindex: #{$zindex-popover};
--#{$prefix}popover-max-width: #{$popover-max-width};
@include rfs($popover-font-size, --#{$prefix}popover-font-size);
--#{$prefix}popover-bg: #{$popover-bg};
--#{$prefix}popover-border-width: #{$popover-border-width};
--#{$prefix}popover-border-color: #{$popover-border-color};
--#{$prefix}popover-border-radius: #{$popover-border-radius};
--#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};
--#{$prefix}popover-box-shadow: #{$popover-box-shadow};
--#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};
--#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};
@include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);
--#{$prefix}popover-header-color: #{$popover-header-color};
--#{$prefix}popover-header-bg: #{$popover-header-bg};
--#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};
--#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};
--#{$prefix}popover-body-color: #{$popover-body-color};
--#{$prefix}popover-arrow-width: #{$popover-arrow-width};
--#{$prefix}popover-arrow-height: #{$popover-arrow-height};
--#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);
Переменные Sass
$popover-font-size: $font-size-sm;
$popover-bg: var(--#{$prefix}body-bg);
$popover-max-width: 276px;
$popover-border-width: var(--#{$prefix}border-width);
$popover-border-color: var(--#{$prefix}border-color-translucent);
$popover-border-radius: var(--#{$prefix}border-radius-lg);
$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}); // stylelint-disable-line function-disallowed-list
$popover-box-shadow: var(--#{$prefix}box-shadow);
$popover-header-font-size: $font-size-base;
$popover-header-bg: var(--#{$prefix}secondary-bg);
$popover-header-color: $headings-color;
$popover-header-padding-y: .5rem;
$popover-header-padding-x: $spacer;
$popover-body-color: var(--#{$prefix}body-color);
$popover-body-padding-y: $spacer;
$popover-body-padding-x: $spacer;
$popover-arrow-width: 1rem;
$popover-arrow-height: .5rem;
Использование
Включить всплывающие окна с помощью JavaScript:
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)
Сделайте всплывающие окна доступными для пользователей клавиатуры и вспомогательных технологий, добавляя их только к элементам HTML, которые традиционно ориентируются на клавиатуру и интерактивны (таким как ссылки или элементы управления формами). Хотя другие элементы HTML можно сфокусировать, добавив tabindex="0", это может создавать раздражающие и сбивающие с толку остановки табуляции на неинтерактивных элементах для пользователей клавиатуры, и большинство вспомогательных технологий в настоящее время не объявляют всплывающие окна в этой ситуации. Кроме того, не полагайтесь исключительно на hover в качестве триггера для всплывающих окон, поскольку это сделает невозможным их запуск для пользователей клавиатуры.
Избегайте добавления чрезмерного количества содержимого во всплывающие окна с помощью опции html. После отображения всплывающих окон их содержимое привязывается к элементу триггера с помощью aria-describedby атрибута, в результате чего все содержимое всплывающих окон объявляется пользователям вспомогательных технологий в виде одного длинного непрерывного потока.
Всплывающие окна не управляют порядком фокусировки клавиатуры, и их размещение в DOM может быть случайным, поэтому будьте осторожны при добавлении интерактивных элементов (таких как формы или ссылки), поскольку это может привести к нелогичному порядку фокусировки или сделать само содержимое всплывающих окон полностью недоступным для пользователей клавиатуры. В случаях, когда вам необходимо использовать эти элементы, рассмотрите возможность использования вместо них модального диалогового окна.
Опции
Поскольку параметры могут передаваться через атрибуты данных или JavaScript, вы можете добавить имя параметра к data-bs-, как в data-bs-animation="{value}". При передаче параметров через атрибуты данных обязательно измените регистр имени опции с “camelCase” на “kebab-case”. Например, используйте data-bs-custom-class="beautifier" вместо data-bs-customClass="beautifier".
Начиная с Bootstrap 5.2.0, все компоненты поддерживают экспериментальный атрибут зарезервированных данных data-bs-config, который может содержать простую конфигурацию компонента в виде строки JSON. Когда элемент имеет атрибуты data-bs-config='{"delay":0, "title":123}' и data-bs-title="456", конечным title значением будет 456, а отдельные атрибуты данных будут переопределять значения, указанные в data-bs-config. Кроме того, существующие атрибуты данных могут содержать значения JSON, такие как data-bs-delay='{"show":0,"hide":150}'.
Конечный объект конфигурации является объединенным результатом data-bs-config, data-bs-, и js object где последнее заданное значение ключа переопределяет остальные.
sanitize, sanitizeFn и allowList не могут быть предоставлены с использованием атрибутов данных.| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
allowList |
объект | Значение по умолчанию | Объект, содержащий разрешенные атрибуты и теги. |
animation |
логическое значение | true |
Примените CSS-плавный переход к всплывающему окну. |
boundary |
строка, элемент | 'clippingParents' |
Граница ограничения переполнения всплывающего окна (применяется только к модификатору preventOverflow от Popper). По умолчанию это 'clippingParents' и может принимать ссылку на HTMLElement (только через JavaScript). Для получения дополнительной информации обратитесь к документации по обнаружению потока Popper. |
container |
строка, элемент, false | false |
Добавляет всплывающее окно к определенному элементу. Пример: container: 'body'. Эта опция особенно полезна тем, что позволяет расположить всплывающее окно в потоке документа рядом с инициирующим элементом, что предотвратит удаление всплывающего окна от инициирующего элемента во время изменения размера окна. |
content |
строка, элемент, функция | '' |
Текстовое содержимое всплывающего окна. Если задана функция, она будет вызвана со своей this ссылкой, установленной на элемент, к которому прикреплено всплывающее окно. |
customClass |
строка, функция | '' |
Добавляйте классы во всплывающее окно, когда оно отображается. Обратите внимание, что эти классы будут добавлены в дополнение к любым классам, указанным в шаблоне. Чтобы добавить несколько классов, разделяйте их пробелами: 'class-1 class-2'. Вы также можете передать функцию, которая должна возвращать единственную строку, содержащую дополнительные имена классов. |
delay |
номер, объект | 0 |
Задержка отображения и скрытия всплывающего окна (мс) — не применяется к типу запуска вручную. Если указано число, задержка применяется как для скрытия, так и для показа. Структура объекта: delay: { "show": 500, "hide": 100 }. |
fallbackPlacements |
строка, массив | ['top', 'right', 'bottom', 'left'] |
Определите резервные места размещения, предоставив список мест размещения в array (в порядке предпочтения). Для получения дополнительной информации обратитесь к документам Popper по поведению. |
html |
логическое значение | false |
Разрешить использование HTML во всплывающем окне. Если true, HTML-теги во всплывающем окне title будут отображаться во всплывающем окне. Если значение равно false, innerText свойство будет использоваться для вставки содержимого в DOM. Используйте text, если вы опасаетесь XSS-атак. |
offset |
число, строка, функция | [0, 0] |
Смещение всплывающего окна относительно его цели. В атрибутах данных можно передать строку со значениями, разделенными запятыми, например: data-bs-offset="10,20". Когда функция используется для определения смещения, она вызывается с объектом, содержащим размещение popper, ссылку и popper rects в качестве первого аргумента. Запускающий элемент DOM node передается в качестве второго аргумента. Функция должна возвращать массив с двумя числами: занос, расстояние. Для получения дополнительной информации обратитесь к offset docs от Popper. |
placement |
строка, функция | 'top' |
Как расположить всплывающее окно: авто, сверху, снизу, слева, справа. Если задано значение auto, всплывающее окно будет динамически переориентировано. Когда функция используется для определения места размещения, она вызывается с DOM-узлом всплывающего окна в качестве первого аргумента и DOM-узлом инициирующего элемента в качестве второго. Для this контекста задается экземпляр всплывающего окна. |
popperConfig |
null, объект, функция | null |
Чтобы изменить конфигурацию поппера Bootstrap по умолчанию, см. Конфигурацию поппера. Когда функция используется для создания конфигурации Popper, она вызывается с объектом, который содержит конфигурацию Popper по умолчанию для Bootstrap. Это помогает вам использовать и объединить конфигурацию по умолчанию с вашей собственной конфигурацией. Функция должна возвращать объект конфигурации для Popper. |
sanitize |
логическое значение | true |
Включите или отключите очистку. Если активированы параметры 'template', 'content' и 'title', они будут очищены. |
sanitizeFn |
null, функция | null |
Здесь вы можете указать свою собственную функцию очистки. Это может быть полезно, если вы предпочитаете использовать специальную библиотеку для выполнения очистки. |
selector |
строка, false | false |
Если предусмотрен селектор, всплывающие объекты будут делегированы указанным целевым объектам. На практике это используется также для применения всплывающих окон к динамически добавляемым элементам DOM (jQuery.on поддержка). Смотрите эту проблему и информативный пример. Примечание: title атрибут нельзя использовать в качестве селектора. |
template |
строка | '<div class="popover" role="tooltip"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' |
Базовый HTML для использования при создании всплывающего окна. Всплывающие окна title будут введены в .popover-inner. .popover-arrow станет стрелкой всплывающего окна. Самый внешний элемент-оболочка должен иметь .popover класс и role="tooltip". |
title |
строка, элемент, функция | '' |
Заголовок всплывающего окна. Если задана функция, она будет вызвана со своей this ссылкой, установленной на элемент, к которому прикреплено всплывающее окно. |
trigger |
строка | 'hover focus' |
Как запускается всплывающее окно: щелчок, наведение курсора, фокусировка, вручную. Вы можете передавать несколько триггеров; разделяйте их пробелом. 'manual' указывает, что всплывающее окно будет запускаться программно с помощью методов .popover('show'), .popover('hide') и .popover('toggle'); это значение нельзя комбинировать с каким-либо другим триггером. 'hover' само по себе приведет к появлению всплывающих окон, которые не могут быть запущены с клавиатуры, и их следует использовать только при наличии альтернативных методов передачи той же информации для пользователей клавиатуры. |
Атрибуты данных для отдельных всплывающих окон
Параметры для отдельных всплывающих окон можно также указать с помощью атрибутов данных, как описано выше.
Использование функции с popperConfig
const popover = new bootstrap.Popover(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
Методы
| Метод | Описание |
|---|---|
disable |
Удаляет возможность отображения всплывающего окна элемента. Всплывающее окно можно будет отобразить, только если оно снова включено. |
dispose |
Скрывает и уничтожает всплывающее окно элемента (удаляет сохраненные данные в элементе DOM). Всплывающие окна, использующие делегирование (которые создаются с помощью опции selector), не могут быть уничтожены по отдельности в дочерних элементах триггера. |
enable |
Позволяет отображать всплывающее окно элемента. Всплывающие окна включены по умолчанию. |
getInstance |
Статический метод, который позволяет вам получить экземпляр всплывающего окна, связанный с элементом DOM. |
getOrCreateInstance |
Статический метод, который позволяет вам получить экземпляр всплывающего окна, связанный с элементом DOM, или создать новый, если он не был инициализирован. |
hide |
Скрывает всплывающее окно элемента. Возвращается вызывающему до того, как всплывающее окно было фактически скрыто (т.Е. До того, как произойдет hidden.bs.popover событие). Это считается запуском всплывающего окна “вручную”. |
setContent |
Предоставляет способ изменить содержимое всплывающего окна после его инициализации. |
show |
Показывает всплывающее окно элемента. Возвращается вызывающему до фактического отображения всплывающего окна (т.Е. До того, как shown.bs.popover произойдет событие). Это считается запуском всплывающего окна “вручную”. Всплывающие окна, заголовок и содержимое которых имеют нулевую длину, никогда не отображаются. |
toggle |
Переключает всплывающее окно элемента. Возвращается вызывающему до того, как всплывающее окно было фактически показано или скрыто (т.Е. До того, как произойдет событие shown.bs.popover или hidden.bs.popover). Это считается запуском всплывающего окна “вручную”. |
toggleEnabled |
Позволяет отображать или скрывать всплывающее окно элемента. |
update |
Обновляет положение всплывающего окна элемента. |
// getOrCreateInstance example
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance
// setContent example
popover.setContent({
'.popover-header': 'another title',
'.popover-body': 'another content'
})
setContent принимает object аргумент, где каждый ключ свойства является допустимым string селектором в шаблоне всплывающего окна, и каждое связанное значение свойства может быть string | element | function | nullМероприятия
| Событие | Описание |
|---|---|
hide.bs.popover |
Это событие запускается немедленно при вызове hide метода экземпляра. |
hidden.bs.popover |
Это событие запускается, когда всплывающее окно перестает быть скрытым от пользователя (будет ждать завершения CSS-переходов). |
inserted.bs.popover |
Это событие запускается после show.bs.popover события, когда шаблон всплывающего окна был добавлен в DOM. |
show.bs.popover |
Это событие срабатывает немедленно при вызове show метода экземпляра. |
shown.bs.popover |
Это событие запускается, когда всплывающее окно становится видимым для пользователя (будет ждать завершения CSS-переходов). |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// сделай что-нибудь...
})