Перейти к основному контенту Перейти к навигации документации

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

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

Обзор

Что нужно знать при использовании плагина всплывающих окон:

  • Всплывающие окна полагаются на стороннюю библиотеку Popper для позиционирования. Вы должны включить popper.min.js перед bootstrap.js, или использовать bootstrap.bundle.min.js, который содержит Popper.
  • Всплывающие окна требуют плагин popover в качестве зависимости.
  • Всплывающие окна отключены по соображениям производительности, поэтому вы должны инициализировать их самостоятельно.
  • Значения title и content нулевой длины никогда не покажут всплывающее окно.
  • Укажите container: 'body', чтобы избежать проблем с рендерингом в более сложных компонентах (таких как наши группы ввода, группы кнопок и т.д.).
  • Запуск всплывающих окон на скрытых элементах не будет работать.
  • Всплывающие окна для элементов .disabled или disabled должны запускаться на элементе-обертке.
  • При запуске из якорей, которые переносятся на несколько строк, всплывающие окна будут центрированы между общей шириной якорей. Используйте .text-nowrap на ваших <a>, чтобы избежать этого поведения.
  • Всплывающие окна должны быть скрыты до того, как соответствующие им элементы будут удалены из DOM.
  • Всплывающие окна могут запускаться благодаря элементу внутри shadow DOM.

По умолчанию этот компонент использует встроенный санитайзер контента, который удаляет любые HTML элементы, которые не разрешены явно. См. раздел о санитайзере в нашей документации по JavaScript для получения дополнительной информации.

Анимационный эффект этого компонента зависит от медиа-запроса 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, а содержимое body — через data-bs-content.

Не стесняйтесь использовать title или data-bs-title в своем HTML. Когда используется title, Popper автоматически заменяет его на data-bs-title при отображении элемента.

html
<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 для изменения направления.

html
<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'
})

Пользовательские всплывающие окна

Добавлено в v5.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;
}
html
<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 для закрытия всплывающих окон при следующем клике пользователя на элемент, отличный от переключающего элемента.

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

html
<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", чтобы всплывающее окно появлялось как немедленная визуальная обратная связь для ваших пользователей, поскольку они могут не ожидать нажатия на отключенный элемент.

html
<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

Переменные

Добавлено в v5.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 не могут быть предоставлены с использованием атрибутов data.

НазваниеТипПо умолчаниюОписание
allowListobjectЗначение по умолчаниюОбъект, содержащий разрешенные теги и атрибуты. Те, которые не разрешены явно, будут удалены санитайзером содержимого.
Будьте осторожны при добавлении в этот список. Обратитесь к OWASP's Cross Site Scripting Prevention Cheat Sheet для получения дополнительной информации.
animationbooleantrueПрименить CSS переход исчезновения к всплывающему окну.
boundarystring, element'clippingParents'Граница ограничения переполнения всплывающего окна (применяется только к модификатору preventOverflow Popper). По умолчанию это 'clippingParents' и может принимать ссылку на HTMLElement (только через JavaScript). Для получения дополнительной информации обратитесь к документации detectOverflow Popper.
containerstring, element, falsefalseДобавляет всплывающее окно к определенному элементу. Пример: container: 'body'. Эта опция особенно полезна тем, что позволяет позиционировать всплывающее окно в потоке документа рядом с запускающим элементом, что предотвратит отплытие всплывающего окна от запускающего элемента при изменении размера окна.
contentstring, element, function''Текстовое содержимое всплывающего окна. Если дана функция, она будет вызвана с её ссылкой this, установленной на элемент, к которому прикреплено всплывающее окно.
customClassstring, function''Добавить классы к всплывающему окну при его показе. Обратите внимание, что эти классы будут добавлены в дополнение к любым классам, указанным в шаблоне. Чтобы добавить несколько классов, разделите их пробелами: 'class-1 class-2'. Вы также можете передать функцию, которая должна вернуть одну строку, содержащую дополнительные имена классов.
delaynumber, object0Задержка показа и скрытия всплывающего окна (мс) — не применяется к типу ручного триггера. Если указано число, задержка применяется как к скрытию, так и к показу. Структура объекта: delay: { "show": 500, "hide": 100 }.
fallbackPlacementsstring, array['top', 'right', 'bottom', 'left']Определите резервные размещения, предоставив список размещений в массиве (в порядке предпочтения). Для получения дополнительной информации обратитесь к документации поведения Popper.
htmlbooleanfalseРазрешить HTML во всплывающем окне. Если true, HTML теги в title всплывающего окна будут отрендерены во всплывающем окне. Если false, свойство innerText будет использовано для вставки содержимого в DOM. Предпочитайте текст при работе с пользовательским вводом для предотвращения XSS атак.
offsetnumber, string, function[0, 8]Смещение всплывающего окна относительно его цели. Вы можете передать строку в атрибутах data с значениями, разделенными запятыми, например: data-bs-offset="10,20". Когда функция используется для определения смещения, она вызывается с объектом, содержащим размещение popper, ссылку и прямоугольники popper в качестве первого аргумента. DOM узел запускающего элемента передается в качестве второго аргумента. Функция должна вернуть массив с двумя числами: skidding, distance. Для получения дополнительной информации обратитесь к документации offset Popper.
placementstring, function'right'Как позиционировать всплывающее окно: auto, top, bottom, left, right. Когда указано auto, оно будет динамически переориентировать всплывающее окно. Когда функция используется для определения размещения, она вызывается с DOM узлом всплывающего окна в качестве первого аргумента и DOM узлом запускающего элемента в качестве второго. Контекст this установлен на экземпляр всплывающего окна.
popperConfignull, object, functionnullДля изменения конфигурации Popper по умолчанию Bootstrap, см. конфигурацию Popper. Когда функция используется для создания конфигурации Popper, она вызывается с объектом, который содержит конфигурацию Popper по умолчанию Bootstrap. Это помогает вам использовать и объединять значения по умолчанию с вашей собственной конфигурацией. Функция должна вернуть объект конфигурации для Popper.
sanitizebooleantrueВключить санитизацию содержимого. Если true, опции template, content и title будут санитизированы.
Будьте осторожны при отключении санитизации содержимого. Обратитесь к OWASP's Cross Site Scripting Prevention Cheat Sheet для получения дополнительной информации. Уязвимости, вызванные исключительно отключением санитизации содержимого, не считаются в рамках модели безопасности Bootstrap.
sanitizeFnnull, functionnullПредоставить альтернативную функцию санитизации содержимого. Это может быть полезно, если вы предпочитаете использовать специализированную библиотеку для выполнения санитизации.
selectorstring, falsefalseЕсли предоставлен селектор, объекты всплывающих окон будут делегированы указанным целям. На практике это используется для применения всплывающих окон к динамически добавленным DOM элементам (поддержка jQuery.on). См. эту проблему и информативный пример. Примечание: атрибут title не должен использоваться как селектор.
templatestring'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'Базовый HTML для использования при создании всплывающего окна. title всплывающего окна будет внедрен в .popover-header. content всплывающего окна будет внедрено в .popover-body. .popover-arrow станет стрелкой всплывающего окна. Самый внешний элемент-обертка должен иметь класс .popover и role="tooltip".
titlestring, element, function''Заголовок всплывающего окна. Если дана функция, она будет вызвана с её ссылкой this, установленной на элемент, к которому прикреплено всплывающее окно.
triggerstring'click'Как запускается всплывающее окно: click, hover, focus, manual. Вы можете передать несколько триггеров; разделите их пробелом. 'manual' указывает, что всплывающее окно будет запускаться программно через методы .popover('show'), .popover('hide') и .popover('toggle'); это значение нельзя комбинировать с любым другим триггером. 'hover' само по себе приведет к всплывающим окнам, которые нельзя запустить через клавиатуру, и должно использоваться только если присутствуют альтернативные методы передачи той же информации для пользователей клавиатуры.

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

Опции для отдельных всплывающих окон также могут быть указаны с помощью data-атрибутов, как описано выше.

Using function with 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
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', () => {
  // do something...
})