Модальное окно
Используйте модальный 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. Например, Вы можете переключить модальное окно сброса пароля из уже открытого модального окна входа. Обратите внимание, что несколько модальных окон не могут быть открыты одновременно - этот метод просто переключает между двумя отдельными модальными окнами.
<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-sm | 300px |
| Стандартный (Default) | None | 500px |
| Большой (Large) | .modal-lg | 800px |
| Очень большой (Extra large) | .modal-xl | 1140px |
Наш модальный класс по умолчанию без модификаторов представляет собой модальное окно “среднего” (“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-down | Below 576px |
.modal-fullscreen-md-down | Below 768px |
.modal-fullscreen-lg-down | Below 992px |
.modal-fullscreen-xl-down | Below 1200px |
.modal-fullscreen-xxl-down | Below 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. Он также добавляет в <body> класс .modal-open для преодоления поведения при прокрутке по умолчанию, и создает зону для клика вне модального элемента, нужную для закрытия открытых модальных элементов, класс .modal-backdrop.
Через атрибуты
Активируйте модальный элемент без JavaScript. Установите data-bs-toggle="modal" в контролирующем элементе, таком как кнопка, наряду с data-bs-toggle="#foo" или href="#foo", для обращения к функциональности “toggle” для частного модального элемента.
<buttontype="button"data-bs-toggle="modal"data-bs-target="#myModal">Launch modal</button>Через JavaScript
Создайте модальное окно одной строкой в JavaScript:
varmyModal=newbootstrap.Modal(document.getElementById('myModal'),options)Параметры
Параметры можно передавать атрибутами или JavaScript. Для использования атрибутов добавьте имя параметра в data-bs-, например data-bs-backdrop="".
| Название | Тип | По умолч. | Описание |
|---|---|---|---|
backdrop | boolean or the string 'static' | true | Подключает модальный элемент с затемненным фоном. Еще – задает static для фона, который не закрывает модальный элемент по клику на фоне. |
keyboard | boolean | true | Закрывает модальный элемент по нажатию ESC |
focus | boolean | true | Фокусируется на модальном элементе по инициализации. |
Методы
Асинхронные методы и переходы
Все методы API асинхронны и запускают переход. Они возвращаются функции, вызвавшей их, с началом перехода, но до его конца. Плюс, вызов метода к компоненту, выполняющему переход, будет проигнорирован.
Параметры
Активирует содержимое как модальный элемент. Принимает object параметров.
varmyModal=newbootstrap.Modal(document.getElementById('myModal'),{keyboard:false})toggle
Вручную изменяет состояние модального элемента. Возвращается к функции-вызову до того, как модальный элемент показан или скрыт. (т.е. до того, как произойдет событие shown.bs.modal или hidden.bs.modal).
myModal.toggle()show
Вручную открывает модальный элемент. Возвращается к функции-вызову до того, как модальный элемент показан. (т.е. до того, как произойдет событие shown.bs.modal).
myModal.show()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
События
Модальный элемент в 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){// сделайте что-нибудь...
})