Поповеры
Документация и примеры добавления всплывающих окон Bootstrap, подобных тем, что есть в iOS, к любому элементу на вашем сайте.
Обзор
Что нужно знать при использовании плагина popover:
- Поповеры полагаются на стороннюю библиотеку Popper для позиционирования. Вы должны включить popper.min.js до
bootstrap.js
или использовать тот,bootstrap.bundle.min.js
который содержит Popper. - Всплывающие окна требуют плагина всплывающих окон в качестве зависимости.
- Всплывающие окна являются дополнительными из соображений производительности, поэтому вы должны инициализировать их самостоятельно .
- Нулевая длина
title
иcontent
значения никогда не будут показывать всплывающее окно. - Укажите
container: 'body'
, чтобы избежать проблем с рендерингом в более сложных компонентах (таких как наши группы ввода, группы кнопок и т. д.). - Запуск всплывающих окон для скрытых элементов не будет работать.
- Всплывающие окна для элементов
.disabled
илиdisabled
должны запускаться на элементе-оболочке. - При запуске от якорей, которые охватывают несколько строк, всплывающие окна будут центрированы между общей шириной якорей. Используйте
.text-nowrap
на вашем<a>
s, чтобы избежать такого поведения. - Всплывающие окна должны быть скрыты до того, как соответствующие им элементы будут удалены из DOM.
- Всплывающие окна могут запускаться благодаря элементу внутри теневого 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
используется, Поппер автоматически заменит его
data-bs-title
при рендеринге элемента.
<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover title" data-bs-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</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">
Popover on top
</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">
Popover on right
</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">
Popover on bottom
</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">
Popover on left
</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(--bs-primary);
--bs-popover-header-bg: var(--bs-primary);
--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="This popover is themed via CSS variables.">
Custom popover
</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="Dismissible popover" data-bs-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</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>Disabled button</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: $white;
$popover-max-width: 276px;
$popover-border-width: $border-width;
$popover-border-color: var(--#{$prefix}border-color-translucent);
$popover-border-radius: $border-radius-lg;
$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width);
$popover-box-shadow: $box-shadow;
$popover-header-font-size: $font-size-base;
$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;
Применение
Включить всплывающие окна через JavaScript:
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)
Настройка всплывающих окон для пользователей клавиатуры и вспомогательных технологий
Чтобы позволить пользователям клавиатуры активировать ваши всплывающие окна, вы должны добавлять их только к элементам HTML, которые традиционно являются интерактивными и ориентированными на клавиатуру (такими как ссылки или элементы управления формы). Хотя произвольные элементы HTML (например, <span>
s) можно сделать фокусируемыми, добавив tabindex="0"
атрибут, это добавит потенциально раздражающие и запутанные табуляции для неинтерактивных элементов для пользователей клавиатуры, и большинство вспомогательных технологий в настоящее время не объявляют содержимое всплывающего окна в этой ситуации. . Кроме того, не полагайтесь исключительно на hover
триггер для ваших всплывающих окон, так как это сделает их невозможными для пользователей клавиатуры.
Хотя вы можете вставлять богатый структурированный HTML-код во всплывающие окна с помощью этой html
опции, мы настоятельно рекомендуем вам избегать добавления чрезмерного количества контента. В настоящее время всплывающие окна работают следующим образом: после отображения их содержимое привязывается к элементу триггера с aria-describedby
атрибутом. В результате весь контент всплывающего окна будет объявлен пользователям вспомогательных технологий одним длинным непрерывным потоком.
Кроме того, хотя в всплывающее окно можно также включать интерактивные элементы управления (такие как элементы формы или ссылки) (путем добавления этих элементов в список allowList
разрешенных атрибутов и тегов), имейте в виду, что в настоящее время всплывающее окно не управляет порядком фокуса клавиатуры. Когда пользователь с клавиатурой открывает всплывающее окно, фокус остается на вызывающем его элементе, а поскольку всплывающее окно обычно не следует сразу за триггером в структуре документа, нет гарантии, что перемещение вперед/нажатиеTABпереместит пользователя клавиатуры в само всплывающее окно. Короче говоря, простое добавление интерактивных элементов управления во всплывающее окно, вероятно, сделает эти элементы управления недоступными/непригодными для пользователей клавиатуры и пользователей вспомогательных технологий или, по крайней мере, приведет к нелогичному общему порядку фокуса. В этих случаях рассмотрите возможность использования вместо этого модального диалогового окна.
Опции
Поскольку параметры можно передавать через атрибуты данных или 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}'
.
sanitize
,
sanitizeFn
и
allowList
не могут быть предоставлены с использованием атрибутов данных.
Имя | Тип | По умолчанию | Описание |
---|---|---|---|
allowList |
объект | Значение по умолчанию | Объект, который содержит разрешенные атрибуты и теги. |
animation |
логический | true |
Примените к поповеру плавный переход CSS. |
boundary |
строка, элемент | 'clippingParents' |
Граница ограничения переполнения поповера (применяется только к модификатору preventOverflow Поппера). По умолчанию он 'clippingParents' может принимать ссылку HTMLElement (только через JavaScript). Для получения дополнительной информации обратитесь к документации Popper's detectOverflow . |
container |
строка, элемент, ложь | false |
Добавляет всплывающее окно к определенному элементу. Пример: container: 'body' . Этот параметр особенно полезен тем, что позволяет расположить всплывающее окно в потоке документа рядом с инициирующим элементом, что предотвратит перемещение всплывающего окна от инициирующего элемента во время изменения размера окна. |
content |
строка, элемент, функция | '' |
Значение содержимого по умолчанию, если data-bs-content атрибут отсутствует. Если задана функция, она будет вызываться со this ссылкой, установленной на элемент, к которому прикреплено всплывающее окно. |
customClass |
строка, функция | '' |
Добавляйте классы во всплывающее окно, когда оно отображается. Обратите внимание, что эти классы будут добавлены в дополнение к любым классам, указанным в шаблоне. Чтобы добавить несколько классов, разделите их пробелами: 'class-1 class-2' . Вы также можете передать функцию, которая должна возвращать одну строку, содержащую дополнительные имена классов. |
delay |
номер, объект | 0 |
Задержка отображения и скрытия всплывающего окна (мс) — не относится к ручному типу триггера. Если указано число, задержка применяется как для скрытия, так и для показа. Структура объекта: delay: { "show": 500, "hide": 100 } . |
fallbackPlacements |
строка, массив | ['top', 'right', 'bottom', 'left'] |
Определите резервные места размещения, предоставив список мест размещения в виде массива (в порядке предпочтения). Для получения дополнительной информации обратитесь к документам поведения Поппера . |
html |
логический | false |
Разрешить HTML во всплывающем окне. Если true, теги HTML во всплывающем окне title будут отображаться во всплывающем окне. Если false, innerText свойство будет использоваться для вставки содержимого в DOM. Используйте текст, если вы беспокоитесь о XSS-атаках. |
offset |
число, строка, функция | [0, 0] |
Смещение всплывающего окна относительно его цели. Вы можете передать строку в атрибутах данных со значениями, разделенными запятыми, например: data-bs-offset="10,20" . Когда функция используется для определения смещения, она вызывается с объектом, содержащим размещение поппера, ссылку и прямоугольники поппера в качестве первого аргумента. Узел триггерного элемента DOM передается в качестве второго аргумента. Функция должна вернуть массив с двумя числами: занос , расстояние . Для получения дополнительной информации обратитесь к документации по смещению Поппера . |
placement |
строка, функция | 'top' |
Как расположить поповер: авто, сверху, снизу, слева, справа. Когда auto указано, он будет динамически переориентировать всплывающее окно. Когда функция используется для определения размещения, она вызывается с узлом DOM всплывающего окна в качестве первого аргумента и узлом DOM триггерного элемента в качестве второго. Контекст this устанавливается на экземпляр всплывающего окна. |
popperConfig |
ноль, объект, функция | null |
Чтобы изменить конфигурацию Popper по умолчанию в Bootstrap, см . Конфигурация Popper . Когда функция используется для создания конфигурации Popper, она вызывается с объектом, который содержит конфигурацию Bootstrap по умолчанию Popper. Это поможет вам использовать и объединить настройки по умолчанию с вашей собственной конфигурацией. Функция должна возвращать объект конфигурации для Popper. |
sanitize |
логический | true |
Включите или отключите очистку. Если активировано 'template' , 'content' и 'title' параметры будут очищены. |
sanitizeFn |
ноль, функция | null |
Здесь вы можете указать свою собственную функцию дезинфекции. Это может быть полезно, если вы предпочитаете использовать выделенную библиотеку для выполнения очистки. |
selector |
строка, ложь | false |
Если предоставлен селектор, объекты всплывающих окон будут делегированы указанным целям. На практике это также используется для применения всплывающих окон к динамически добавляемым элементам DOM ( jQuery.on поддержка). См. этот выпуск и информативный пример . |
template |
нить | '<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' |
Базовый HTML для использования при создании всплывающего окна. Поповеры title будут внедрены в файл .popover-inner . .popover-arrow станет стрелкой всплывающего окна. Самый внешний элемент-оболочка должен иметь .popover класс и role="popover" . |
title |
строка, элемент, функция | '' |
Значение заголовка по умолчанию, если 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
}
})
Методы
Асинхронные методы и переходы
Все методы API являются асинхронными и запускают переход . Они возвращаются к вызывающей стороне сразу после начала перехода, но до его завершения . Кроме того, вызов метода переходного компонента будет игнорироваться .
Дополнительную информацию см. в нашей документации по JavaScript .
Метод | Описание |
---|---|
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
myPopover.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', () => {
// do something...
})