1111
Перейти к основному содержаниюПерейти к навигации по документам
Cмотреть на GitHub

Модальное окно

Используйте модальный JavaScript плагин Bootstrap для добавления диалоговых окнон на ваш сайт для лайтбоксов, уведомлений пользователей или полностью настраиваемого контента.

Как это работает

До того как начать работу с модальными компонентами Bootstrap, ознакомьтесь со следующей информацией, т.к. параметры недавно изменились.

  • Модальные окна сделаны на HTML, CSS и JavaScript. Они располагаются поверх всего документа и блокируют прокрутку тела документа <body>, вместо него прокручивая модальные окна
  • Клик вне модального элемента автоматически закрывает его.
  • Bootstrap позволяет активировать лишь один модальный элемент за раз. Вложенные модальные элементы не поддерживаются, т.к. мы думаем, что они принесли бы неудобства.
  • Модальные элементы имеют position: fixed, что может вызвать иногда их частичную отрисовку. Мы рекомендуем размещать модальные элементы на самом верху страницы, когда возможно, для избегания сбоев и влияния других элементов на корректную работу модальных элементов .modal.
  • Опять же – из-за position: fixed есть некоторые сложности при использовании их на мобильных устройствах. Смотри документацию поддержки в браузерах.
  • Из-за семантики HTML5 атрибут autofocus не работает с модальными элементами Bootstrap. Чтобы добиться такого же эффекта, используйте собственный JavaScript:
varmyModal=document.getElementById('myModal')varmyInput=document.getElementById('myInput')myModal.addEventListener('shown.bs.modal',function(){myInput.focus()})
Эффект анимации этого компонента зависит от медиа-запроса с ограниченным движением prefers-reduced-motion. Смотрите раздел специальных возможностей в нашей документации по редукции анимации.

Далее – демонстрация примеров и инструкции по использованию.

Примеры

Ниже – пример статичного модального компонента (это значит, что его position и display «преодолены»). В примере есть заголовок модального компонента, тело (требуется для padding), футер модального компонента (по желанию). Мы советуем включать заголовки с отклонением действия, когда возможно, или обеспечить другой явный путь отклонить действие.

<divclass="modal"tabindex="-1"><divclass="modal-dialog"><divclass="modal-content"><divclass="modal-header"><h5class="modal-title">Modal title</h5><buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button></div><divclass="modal-body"><p>Modal body text goes here.</p></div><divclass="modal-footer"><buttontype="button"class="btn btn-secondary"data-bs-dismiss="modal">Close</button><buttontype="button"class="btn btn-primary">Save changes</button></div></div></div></div>

«Живое» демо

Изменяйте (скрывайте\показывайте) рабочий пример модальной демонстрации, нажав кнопку ниже. Он будет скользить вниз и исчезать из верхней части страницы.

<!-- Button trigger modal --><buttontype="button"class="btn btn-primary"data-bs-toggle="modal"data-bs-target="#exampleModal"> Launch demo modal
</button><!-- Modal --><divclass="modal fade"id="exampleModal"tabindex="-1"aria-labelledby="exampleModalLabel"aria-hidden="true"><divclass="modal-dialog"><divclass="modal-content"><divclass="modal-header"><h5class="modal-title"id="exampleModalLabel">Modal title</h5><buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button></div><divclass="modal-body"> ... </div><divclass="modal-footer"><buttontype="button"class="btn btn-secondary"data-bs-dismiss="modal">Close</button><buttontype="button"class="btn btn-primary">Save changes</button></div></div></div></div>

Статический фон

Когда фон установлен на статический, модаль не будет закрываться при нажатии за его пределами. Нажмите кнопку ниже, чтобы попробовать.

<!-- Button trigger modal --><buttontype="button"class="btn btn-primary"data-bs-toggle="modal"data-bs-target="#staticBackdrop"> Launch static backdrop modal
</button><!-- Modal --><divclass="modal fade"id="staticBackdrop"data-bs-backdrop="static"data-bs-keyboard="false"tabindex="-1"aria-labelledby="staticBackdropLabel"aria-hidden="true"><divclass="modal-dialog"><divclass="modal-content"><divclass="modal-header"><h5class="modal-title"id="staticBackdropLabel">Modal title</h5><buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button></div><divclass="modal-body"> ... </div><divclass="modal-footer"><buttontype="button"class="btn btn-secondary"data-bs-dismiss="modal">Close</button><buttontype="button"class="btn btn-primary">Understood</button></div></div></div></div>

Прокрутка длинного содержимого

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

Вы также можете создать прокручиваемый модал, который позволяет прокручивать модальное тело, добавив .modal-dialog-scrollable в .modal-dialog.

<!-- Scrollable modal --><divclass="modal-dialog modal-dialog-scrollable"> ...
</div>

Вертикальное центрирование

Добавьте .modal-dialog-centered в .modal-dialog чтобы вертикально центрировать модальное окно.

<!-- Vertically centered modal --><divclass="modal-dialog modal-dialog-centered"> ...
</div><!-- Vertically centered scrollable modal --><divclass="modal-dialog modal-dialog-centered modal-dialog-scrollable"> ...
</div>

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

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

<divclass="modal-body"><h5>Popover in a modal</h5><p>This <ahref="#"role="button"class="btn btn-secondary popover-test"title="Popover title"data-bs-content="Popover body content is set in this attribute.">button</a> triggers a popover on click.</p><hr><h5>Tooltips in a modal</h5><p><ahref="#"class="tooltip-test"title="Tooltip">This link</a> and <ahref="#"class="tooltip-test"title="Tooltip">that link</a> have tooltips on hover.</p></div>

Использование сетки

Используйте систему сеток Bootstrap внутри модального элемента, расположив .container-fluid внутри .modal-body. После этого используйте обычную систему сеток обычным образом.

<divclass="modal-body"><divclass="container-fluid"><divclass="row"><divclass="col-md-4">.col-md-4</div><divclass="col-md-4 ms-auto">.col-md-4 .ms-auto</div></div><divclass="row"><divclass="col-md-3 ms-auto">.col-md-3 .ms-auto</div><divclass="col-md-2 ms-auto">.col-md-2 .ms-auto</div></div><divclass="row"><divclass="col-md-6 ms-auto">.col-md-6 .ms-auto</div></div><divclass="row"><divclass="col-sm-9"> Level 1: .col-sm-9 <divclass="row"><divclass="col-8 col-sm-6"> Level 2: .col-8 .col-sm-6 </div><divclass="col-4 col-sm-6"> Level 2: .col-4 .col-sm-6 </div></div></div></div></div></div>

Комбинируйте содержимое модальных элементов

Есть много кнопок, которые все запускают один модальный элемент со слегка разным содержимым? Используйте event.relatedTarget и атрибуты data-bs-* для изменения содержимого в зависимости от нажатой кнопки.

Ниже – пример демо с кодом HTML и JavaScript. Для информации по relatedTarget читайте инфо по событиям модальных элементов.

<buttontype="button"class="btn btn-primary"data-bs-toggle="modal"data-bs-target="#exampleModal"data-bs-whatever="@mdo">Open modal for @mdo</button><buttontype="button"class="btn btn-primary"data-bs-toggle="modal"data-bs-target="#exampleModal"data-bs-whatever="@fat">Open modal for @fat</button><buttontype="button"class="btn btn-primary"data-bs-toggle="modal"data-bs-target="#exampleModal"data-bs-whatever="@getbootstrap">Open modal for @getbootstrap</button><divclass="modal fade"id="exampleModal"tabindex="-1"aria-labelledby="exampleModalLabel"aria-hidden="true"><divclass="modal-dialog"><divclass="modal-content"><divclass="modal-header"><h5class="modal-title"id="exampleModalLabel">New message</h5><buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button></div><divclass="modal-body"><form><divclass="mb-3"><labelfor="recipient-name"class="col-form-label">Recipient:</label><inputtype="text"class="form-control"id="recipient-name"></div><divclass="mb-3"><labelfor="message-text"class="col-form-label">Message:</label><textareaclass="form-control"id="message-text"></textarea></div></form></div><divclass="modal-footer"><buttontype="button"class="btn btn-secondary"data-bs-dismiss="modal">Close</button><buttontype="button"class="btn btn-primary">Send message</button></div></div></div></div>
varexampleModal=document.getElementById('exampleModal')exampleModal.addEventListener('show.bs.modal',function(event){// Button that triggered the modal
varbutton=event.relatedTarget// Extract info from data-bs-* attributes
varrecipient=button.getAttribute('data-bs-whatever')// If necessary, you could initiate an AJAX request here
// and then do the updating in a callback.
//
// Update the modal's content.
varmodalTitle=exampleModal.querySelector('.modal-title')varmodalBodyInput=exampleModal.querySelector('.modal-body input')modalTitle.textContent='New message to '+recipientmodalBodyInput.value=recipient})

Переключение между модальными окнами

Переключайтесь между несколькими модальными окнами с помощью умного размещения атрибутов data-bs-target и data-bs-toggle. Например, Вы можете переключить модальное окно сброса пароля из уже открытого модального окна входа. Обратите внимание, что несколько модальных окон не могут быть открыты одновременно - этот метод просто переключает между двумя отдельными модальными окнами.

Open first modal
<divclass="modal fade"id="exampleModalToggle"aria-hidden="true"aria-labelledby="exampleModalToggleLabel"tabindex="-1"><divclass="modal-dialog modal-dialog-centered"><divclass="modal-content"><divclass="modal-header"><h5class="modal-title"id="exampleModalToggleLabel">Modal 1</h5><buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button></div><divclass="modal-body"> Show a second modal and hide this one with the button below. </div><divclass="modal-footer"><buttonclass="btn btn-primary"data-bs-target="#exampleModalToggle2"data-bs-toggle="modal"data-bs-dismiss="modal">Open second modal</button></div></div></div></div><divclass="modal fade"id="exampleModalToggle2"aria-hidden="true"aria-labelledby="exampleModalToggleLabel2"tabindex="-1"><divclass="modal-dialog modal-dialog-centered"><divclass="modal-content"><divclass="modal-header"><h5class="modal-title"id="exampleModalToggleLabel2">Modal 2</h5><buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button></div><divclass="modal-body"> Hide this modal and show the first with the button below. </div><divclass="modal-footer"><buttonclass="btn btn-primary"data-bs-target="#exampleModalToggle"data-bs-toggle="modal"data-bs-dismiss="modal">Back to first</button></div></div></div></div><aclass="btn btn-primary"data-bs-toggle="modal"href="#exampleModalToggle"role="button">Open first modal</a>

Изменение анимации

Переменная $modal-fade-transform определяет состояние преобразования .modal-dialog перед анимацией постепенного появления, переменная $modal-show-transform определяет преобразование .modal-dialog в конце модального появления анимация.

Если вы хотите, например, анимацию увеличения, вы можете установить $modal-fade-transform: scale(.8).

Анимация при удалении

Для модальных элементов, которые возникают простым способом, а не появляются плавно, удалите из кода модального элемента класс .fade.

<divclass="modal"tabindex="-1"aria-labelledby="..."aria-hidden="true"> ...
</div>

Динамическая высота

Если высота модального элемента изменяется при его открытии, вам следует вызвать myModal.handleUpdate() для обновления позиции модального элемента в случае, если возникнет полоса прокрутки.

Доступность

Удостоверьтесь, что добавили aria-labelledby="..." со ссылкой на модальный заголовок в .modal. Дополнительно вы можете описать диалог модального элемента атрибутом aria-describedby, добавленным в .modal. Обратите внимание, что вам не нужно добавлять role="dialog", поскольку мы уже добавляем его через JavaScript.

Встраивание видео из YouTube

Встраивание видео в модальные элементы требует дополнительного JavaScript для запрета автоматического воспроизведения и т.д. Дополнительная информация здесь.

Дополнительные размеры

У модальных элементов есть два размера, доступных к изменению через классы-модификаторы, которые надо размещать в элементе .modal-dialog. Эти размеры включаются на определенных брейкпойнтах, чтобы избежать появления горизонтальных полос прокрутки на более узких зонах просмотра.

РазмерКласМаксимальная ширина модали (max-width)
Маленький (Small).modal-sm300px
Стандартный (Default)None500px
Большой (Large).modal-lg800px
Очень большой (Extra large).modal-xl1140px

Наш модальный класс по умолчанию без модификаторов представляет собой модальное окно “среднего” (“medium”) размера.

<divclass="modal-dialog modal-xl">...</div><divclass="modal-dialog modal-lg">...</div><divclass="modal-dialog modal-sm">...</div>

Полноэкранная модаль

Для охвата всей области просмотра возможно переопределение отображения модального окна через классы модификаторов, размещенных в диалоговом окне .modal-dialog.

КлассДоступность
.modal-fullscreenВсегода
.modal-fullscreen-sm-downBelow 576px
.modal-fullscreen-md-downBelow 768px
.modal-fullscreen-lg-downBelow 992px
.modal-fullscreen-xl-downBelow 1200px
.modal-fullscreen-xxl-downBelow 1400px
<!-- Full screen modal --><divclass="modal-dialog modal-fullscreen-sm-down"> ...
</div>

Sass

Переменные

$modal-inner-padding:$spacer;$modal-footer-margin-between:.5rem;$modal-dialog-margin:.5rem;$modal-dialog-margin-y-sm-up:1.75rem;$modal-title-line-height:$line-height-base;$modal-content-color:null;$modal-content-bg:$white;$modal-content-border-color:rgba($black,.2);$modal-content-border-width:$border-width;$modal-content-border-radius:$border-radius-lg;$modal-content-inner-border-radius:subtract($modal-content-border-radius,$modal-content-border-width);$modal-content-box-shadow-xs:$box-shadow-sm;$modal-content-box-shadow-sm-up:$box-shadow;$modal-backdrop-bg:$black;$modal-backdrop-opacity:.5;$modal-header-border-color:$border-color;$modal-footer-border-color:$modal-header-border-color;$modal-header-border-width:$modal-content-border-width;$modal-footer-border-width:$modal-header-border-width;$modal-header-padding-y:$modal-inner-padding;$modal-header-padding-x:$modal-inner-padding;$modal-header-padding:$modal-header-padding-y$modal-header-padding-x;// Keep this for backwards compatibility
$modal-sm:300px;$modal-md:500px;$modal-lg:800px;$modal-xl:1140px;$modal-fade-transform:translate(0,-50px);$modal-show-transform:none;$modal-transition:transform.3sease-out;$modal-scale-transform:scale(1.02);

Цикл

Адаптивные полноэкранные модальные окна генерируются с помощью карты $breakpoints и цикла в scss/_modal.scss.

@each$breakpointinmap-keys($grid-breakpoints){$infix:breakpoint-infix($breakpoint,$grid-breakpoints);$postfix:if($infix!="",$infix+"-down","");@include media-breakpoint-down($breakpoint){.modal-fullscreen#{$postfix}{width:100vw;max-width:none;height:100%;margin:0;.modal-content{height:100%;border:0;@include border-radius(0);}.modal-header{@include border-radius(0);}.modal-body{overflow-y:auto;}.modal-footer{@include border-radius(0);}}}}

Использование

Модальный плагин переключает ваш скрытый контент по запросу с помощью атрибутов данных или JavaScript. Он также переопределяет поведение прокрутки по умолчанию и генерирует .modal-backdrop, чтобы предоставить область клика для отклонения отображаемых модальных окон при щелчке вне модального окна.

Через атрибуты данных

Переключение

Активируйте модальное окно без написания JavaScript. Установите data-bs-toggle="modal" на элемент контроллера, например кнопку, вместе с data-bs-target="#foo" или href="#foo" для нацеливания на конкретное модальное окно для переключения.

<buttontype="button"data-bs-toggle="modal"data-bs-target="#myModal">Запустить модальное окно</button>

Отклонение

Отклонение может быть достигнуто с помощью атрибута data на кнопке внутри modal, как показано ниже:

<buttontype="button"class="btn-close"data-bs-dismiss="modal"aria-label="Close"></button>

или на кнопке за пределами modal с помощью data-bs-target, как показано ниже:

<buttontype="button"class="btn-close"data-bs-dismiss="modal"data-bs-target="#my-modal"aria-label="Close"></button>
Хотя поддерживаются оба способа отклонения модального окна, имейте в виду, что удаление модального окна извне не соответствует шаблону проектирования модального диалога WAI-ARIA. Делайте это на свой страх и риск.

Через JavaScript

Создайте модальное окно одной строкой в JavaScript:

varmyModal=newbootstrap.Modal(document.getElementById('myModal'),options)

Параметры

Параметры можно передавать атрибутами или JavaScript. Для использования атрибутов добавьте имя параметра в data-bs-, например data-bs-backdrop="".

НазваниеТипПо умолч.Описание
backdropboolean or the string 'static'trueПодключает модальный элемент с затемненным фоном. Еще – задает static для фона, который не закрывает модальный элемент по клику на фоне.
keyboardbooleantrueЗакрывает модальный элемент по нажатию ESC
focusbooleantrueФокусируется на модальном элементе по инициализации.

Методы

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

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

Смотрите документацию JavaScript

Параметры

Активирует содержимое как модальный элемент. Принимает object параметров.

varmyModal=newbootstrap.Modal(document.getElementById('myModal'),{keyboard:false})

toggle

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

myModal.toggle()

show

Открывает модальное окно вручную. Возврат к вызывающей стороне до фактического отображения модального окна (т.е. до того, как произойдет событие shown.bs.modal).

myModal.show()

Also, you can pass a DOM element as an argument that can be received in the modal events (as the relatedTarget property).

varmodalToggle=document.getElementById('toggleMyModal')// relatedTarget
myModal.show(modalToggle)

hide

Вручную прячет модальный элемент. Возвращается к функции-вызову до того, как модальный элемент показан. (т.е. до того, как произойдет событие hidden.bs.modal).

myModal.hide()

handleUpdate

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

myModal.handleUpdate()

dispose

Уничтожает модальный элемент.

myModal.dispose()

getInstance

Статический метод, который позволяет вам получить модальный экземпляр, связанный с элементом DOM.

varmyModalEl=document.getElementById('myModal')varmodal=bootstrap.Modal.getInstance(myModalEl)// Returns a Bootstrap modal instance

getOrCreateInstance

Статический метод, который позволяет вам получить модальный экземпляр, связанный с элементом DOM, или создать новый, если он не был инициализирован.

varmyModalEl=document.querySelector('#myModal')varmodal=bootstrap.Modal.getOrCreateInstance(myModalEl)// Возвращает экземпляр модалки Bootstrap

События

Модальный элемент в Bootstrap имеет несколько событий для встраивания в функциональность. Все события модальных элементов запускаются внутри самих элементов (т.е. в <div class="modal">).

Тип событияОписание
show.bs.modalЭто событие запускается немедленно, когда экземпляр метода show вызван. Если оно вызвано кликом, элемент, на который кликнули, доступен как свойство события relatedTarget.
shown.bs.modalЭто событие запускается, когда модальный элемент сделан видимым юзеру (будет ждать завершения переходов CSS). Если оно вызвано кликом, элемент, на который кликнули, доступен как свойство события relatedTarget.
hide.bs.modalЭто событие запускается немедленно, когда экземпляр метода hide вызван.
hidden.bs.modalЭто событие запускается, когда модальный элемент больше не является скрытым (будет ждать завершения переходов CSS).
hidePrevented.bs.modalЭто событие вызывается, когда отображается модальное изображение, его фон статичен static, и выполняется щелчок за пределами модального режима или нажатие клавиши выхода с параметром клавиатуры или data-bs-keyboard, установленным в значение false.
varmyModalEl=document.getElementById('myModal')myModalEl.addEventListener('hidden.bs.modal',function(event){// сделайте что-нибудь...
})
222