Bootstrap 3 модальное вертикальное положение центр
это вопрос из двух частей:
Как вы можете расположить модальный вертикально в центре, когда вы не знаете точную высоту модального?
возможно ли иметь модальное центрирование и переполнение: авто в модальном теле, но только если модальное превышает высоту экрана?
Я пробовал использовать это:
.modal-dialog {
height: 80% !important;
padding-top:10%;
}
.modal-content {
height: 100% !important;
overflow:visible;
}
.modal-body {
height: 80%;
overflow: auto;
}
Это дает мне результат, который мне нужен, когда содержание намного больше чем вертикальный размер экрана, но для небольшого модального содержимого он в значительной степени непригоден.
29 ответов:
.modal { text-align: center; } @media screen and (min-width: 768px) { .modal:before { display: inline-block; vertical-align: middle; content: " "; height: 100%; } } .modal-dialog { display: inline-block; text-align: left; vertical-align: middle; }и настроить немного .fade класс, чтобы убедиться, что он появляется из верхней границы окна, а не центр
1. Как вы можете расположить модальный вертикально в центре, когда вы не знаете точную высоту модального?
для абсолютного центра Bootstrap 3 Modal без объявления высоты вам сначала нужно будет перезаписать Bootstrap CSS, добавив это в свою таблицу стилей:.modal-dialog-center { /* Edited classname 10/03/2014 */ margin: 0; position: absolute; top: 50%; left: 50%; }это расположит верхний левый угол модальных диалогов в центре окна.
мы должны добавить этот медиа-запрос или еще модальное поле слева неправильно на небольших устройствах:
@media (max-width: 767px) { .modal-dialog-center { /* Edited classname 10/03/2014 */ width: 100%; } }теперь нам нужно будет настроить его положение с помощью JavaScript. Для этого мы даем элементу отрицательный верхний и левый край, равный половине его высоты и ширины. В этом примере мы будем использовать jQuery, так как он доступен с Bootstrap.
$('.modal').on('shown.bs.modal', function() { $(this).find('.modal-dialog').css({ 'margin-top': function () { return -($(this).outerHeight() / 2); }, 'margin-left': function () { return -($(this).outerWidth() / 2); } }); });обновление (01/10/2015):
добавлять ответ финика. Кредиты на центрирования в Неизвестно!--27-->.
.modal { text-align: center; padding: 0!important; } .modal:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; margin-right: -4px; /* Adjusts for spacing */ } .modal-dialog { display: inline-block; text-align: left; vertical-align: middle; }обратите внимание на отрицательную маржу-верно? Это удаляет пространство, добавленное встроенным блоком. Это пространство заставляет модальный перейти к нижней части страницы @media width
2. Возможно ли иметь модальный центр и иметь переполнение: авто в модальном теле, но только если модальное превышает высоту экрана?
Это возможно путем придания модальному телу overflow-y:auto и максимальной высоты. Это занимает немного больше работы, чтобы заставить его работать должным образом. Начните с добавления этого в таблицу стилей:.modal-body { overflow-y: auto; } .modal-footer { margin-top: 0; }мы будем использовать jQuery снова, чтобы получить высоту окна и установить максимальную высоту модального содержимого в первую очередь. Затем мы должны установить максимальную высоту модального тела, вычитая модальное содержимое с модальным заголовком и модальным нижним колонтитулом:
$('.modal').on('shown.bs.modal', function() { var contentHeight = $(window).height() - 60; var headerHeight = $(this).find('.modal-header').outerHeight() || 2; var footerHeight = $(this).find('.modal-footer').outerHeight() || 2; $(this).find('.modal-content').css({ 'max-height': function () { return contentHeight; } }); $(this).find('.modal-body').css({ 'max-height': function () { return (contentHeight - (headerHeight + footerHeight)); } }); $(this).find('.modal-dialog').css({ 'margin-top': function () { return -($(this).outerHeight() / 2); }, 'margin-left': function () { return -($(this).outerWidth() / 2); } }); });вы можете найти рабочую демонстрацию здесь с Bootstrap 3.0.3:http://cdpn.io/GwvrJ Редактировать: я рекомендую использовать обновленная версия вместо более отзывчивого решения:http://cdpn.io/mKfCc
обновление (30/11/2015):
function setModalMaxHeight(element) { this.$element = $(element); this.$content = this.$element.find('.modal-content'); var borderWidth = this.$content.outerHeight() - this.$content.innerHeight(); var dialogMargin = $(window).width() < 768 ? 20 : 60; var contentHeight = $(window).height() - (dialogMargin + borderWidth); var headerHeight = this.$element.find('.modal-header').outerHeight() || 0; var footerHeight = this.$element.find('.modal-footer').outerHeight() || 0; var maxHeight = contentHeight - (headerHeight + footerHeight); this.$content.css({ 'overflow': 'hidden' }); this.$element .find('.modal-body').css({ 'max-height': maxHeight, 'overflow-y': 'auto' }); } $('.modal').on('show.bs.modal', function() { $(this).show(); setModalMaxHeight(this); }); $(window).resize(function() { if ($('.modal.in').length != 0) { setModalMaxHeight($('.modal.in')); } });(Обновлено 30/11/2015 http://cdpn.io/mKfCc С выше редактировать)
мое решение
.modal-dialog-center { margin-top: 25%; } <div id="waitForm" class="modal"> <div class="modal-dialog modal-dialog-center"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 id="headerBlock" class="modal-title"></h4> </div> <div class="modal-body"> <span id="bodyBlock"></span> <br/> <p style="text-align: center"> <img src="@Url.Content("~/Content/images/progress-loader.gif")" alt="progress"/> </p> </div> </div> </div> </div>
его можно просто исправить с помощью
display: flex.modal-dialog { margin-top: 0; margin-bottom: 0; height: 100vh; display: flex; flex-direction: column; justify-content: center; } .modal.fade .modal-dialog { transform: translate(0, -100%); } .modal.in .modal-dialog { transform: translate(0, 0); }С кодом
.modal-dialog { margin-top: 0; margin-bottom: 0; height: 100vh; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -100%); transform: translate(0, -100%); } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); transform: translate(0, 0); }
Я пришел с чистым раствором для CSS! Это css3, хотя, что означает, что ie8 или ниже не поддерживается, но кроме этого он протестирован и работает на ios, android, ie9+, chrome, firefox, desktop safari..
Я использую следующий css:
.modal-dialog { position:absolute; top:50% !important; transform: translate(0, -50%) !important; -ms-transform: translate(0, -50%) !important; -webkit-transform: translate(0, -50%) !important; margin:auto 5%; width:90%; height:80%; } .modal-content { min-height:100%; position:absolute; top:0; bottom:0; left:0; right:0; } .modal-body { position:absolute; top:45px; /** height of header **/ bottom:45px; /** height of footer **/ left:0; right:0; overflow-y:auto; } .modal-footer { position:absolute; bottom:0; left:0; right:0; }вот скрипка. http://codepen.io/anon/pen/Hiskj
..выбор этого в качестве правильного ответа, так как нет дополнительного тяжелого javascript, который ставит браузер на колени в случае большего чем одной модальности.
Если вы в порядке с использованием flexbox, то это должно помочь решить эту проблему.
.modal-dialog { height: 100%; width: 100%; display: flex; align-items: center; } .modal-content { margin: 0 auto; }
все, что я сделал в моем случае, это установить верхнюю часть в моем css, зная высоту модального
<div id="myModal" class="modal fade"> ... </div>в моем css я установил
#myModal{ height: 400px; top: calc(50% - 200px) !important; }
мое решение:
.modal.in .modal-dialog { -webkit-transform: translate(0, calc(50vh - 50%)); -ms-transform: translate(0, 50vh) translate(0, -50%); -o-transform: translate(0, calc(50vh - 50%)); transform: translate(0, 50vh) translate(0, -50%); }
расширяя отличный ответ @Finik, это исправление применяется только к немобильным устройствам. Я тестировал в IE8, Chrome и Firefox 22 - он работает с очень длинным или коротким контентом.
.modal { text-align: center; } @media screen and (min-device-width: 768px) { .modal:before { display: inline-block; vertical-align: middle; content: " "; height: 100%; } } .modal-dialog { display: inline-block; text-align: left; vertical-align: middle; }
есть простой способ сделать это с помощью CSS:
.modal-dialog { position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; width:500px; height:300px; }вот именно. Обратите внимание, что это необходимо только для применения к
.modal-dialogdiv-контейнера.
самое универсальное решение, которое я написал. Динамично вычисляет с помощью диалогового высоту. (Следующим шагом может быть пересчет высоты диалогов при изменении размера окна.)
JSfiddle: http://jsfiddle.net/8Fvg9/3/
// initialise on document ready jQuery(document).ready(function ($) { 'use strict'; // CENTERED MODALS // phase one - store every dialog's height $('.modal').each(function () { var t = $(this), d = t.find('.modal-dialog'), fadeClass = (t.is('.fade') ? 'fade' : ''); // render dialog t.removeClass('fade') .addClass('invisible') .css('display', 'block'); // read and store dialog height d.data('height', d.height()); // hide dialog again t.css('display', '') .removeClass('invisible') .addClass(fadeClass); }); // phase two - set margin-top on every dialog show $('.modal').on('show.bs.modal', function () { var t = $(this), d = t.find('.modal-dialog'), dh = d.data('height'), w = $(window).width(), h = $(window).height(); // if it is desktop & dialog is lower than viewport // (set your own values) if (w > 380 && (dh + 60) < h) { d.css('margin-top', Math.round(0.96 * (h - dh) / 2)); } else { d.css('margin-top', ''); } }); });
нашел идеальное решение от здесь
$(function() { function reposition() { var modal = $(this), dialog = modal.find('.modal-dialog'); modal.css('display', 'block'); // Dividing by two centers the modal exactly, but dividing by three // or four works better for larger screens. dialog.css("margin-top", Math.max(0, ($(window).height() - dialog.height()) / 2)); } // Reposition when a modal is shown $('.modal').on('show.bs.modal', reposition); // Reposition when the window is resized $(window).on('resize', function() { $('.modal:visible').each(reposition); }); });
$('#myModal').on('shown.bs.modal', function() { var initModalHeight = $('#modal-dialog').outerHeight(); //give an id to .mobile-dialog var userScreenHeight = $(document).outerHeight(); if (initModalHeight > userScreenHeight) { $('#modal-dialog').css('overflow', 'auto'); //set to overflow if no fit } else { $('#modal-dialog').css('margin-top', (userScreenHeight / 2) - (initModalHeight/2)); //center it if it does fit } });
Я загрузил bootstrap3-dialog из ссылки ниже и изменил функцию open в bootstrap-dialog.js
https://github.com/nakupanda/bootstrap3-dialog
код
open: function () { !this.isRealized() && this.realize(); this.updateClosable(); //Custom To Vertically centering Bootstrap var $mymodal = this.getModal(); $mymodal = $mymodal.append('<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%"><tr><td align="center" valign="middle" class="centerModal"></td></tr></table>'); $mymodal = $mymodal.find(".modal-dialog").appendTo($mymodal.find(".centerModal")); //END this.getModal().modal('show'); return this; }Css
.centerModal .modal-header{ text-align:left; } .centerModal .modal-body{ text-align:left; }
вот еще один метод css, который работает довольно хорошо и основан на этом: http://zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/
sass:
.modal { height: 100%; .modal-dialog { top: 50% !important; margin-top:0; margin-bottom:0; } //keep proper transitions on fade in &.fade .modal-dialog { transform: translateY(-100%) !important; } &.in .modal-dialog { transform: translateY(-50%) !important; } }
попробуйте что-то вроде этого:
.popup__overlay { position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 999; text-align: center } .popup { display: inline-block; vertical-align: middle }
вы можете проверить эту коллекцию методов для абсолютного центрирования div:http://codepen.io/shshaw/full/gEiDt
еще одно решение, которое установит допустимое положение для каждого видимого модального на
window.resizeсобытие и поshow.bs.modal:(function ($) { "use strict"; function centerModal() { $(this).css('display', 'block'); var $dialog = $(this).find(".modal-dialog"), offset = ($(window).height() - $dialog.height()) / 2, bottomMargin = parseInt($dialog.css('marginBottom'), 10); // Make sure you don't hide the top part of the modal w/ a negative margin if it's longer than the screen height, and keep the margin equal to the bottom margin of the modal if(offset < bottomMargin) offset = bottomMargin; $dialog.css("margin-top", offset); } $(document).on('show.bs.modal', '.modal', centerModal); $(window).on("resize", function () { $('.modal:visible').each(centerModal); }); })(jQuery);
var modalVerticalCenterClass = ".modal"; function centerModals($element) { var $modals; if ($element.length) { $modals = $element; } else { $modals = $(modalVerticalCenterClass + ':visible'); } $modals.each( function(i) { var $clone = $(this).clone().css('display', 'block').appendTo('body'); var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2); top = top > 0 ? top : 0; $clone.remove(); $(this).find('.modal-content').css("margin-top", top); }); } $(modalVerticalCenterClass).on('show.bs.modal', function(e) { centerModals($(this)); }); $(window).on('resize', centerModals);
Я знаю, что это немного поздно, но я добавляю новый ответ, чтобы он не терялся в толпе. Это кросс-desktop-mobile-browser решение, которое работает везде правильно, как это должно быть.
ему просто нужно
modal-dialogбыть завернутым вmodal-dialog-wrapкласс и должны иметь следующие дополнения кода:.modal-dialog-wrap { display: table; table-layout: fixed; width: 100%; height: 100%; } .modal-dialog { display: table-cell; vertical-align: middle; text-align: center; } .modal-content { display: inline-block; text-align: left; }диалог начинается по центру и в случаях большого содержания он просто растет вертикально, пока не появится полоса прокрутки.
вот рабочий скрипка для вашего удовольствия!
это работает для меня:
.modal { text-align: center; padding: 0!important; } .modal:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; margin-right: -4px; } .modal-dialog { display: inline-block; text-align: left; vertical-align: middle; }
рассмотрите возможность использования плагина bootstrap-modal, найденного здесь -https://github.com/jschr/bootstrap-modal
плагин будет центрировать все ваши модалы
для центрирования, я не понимаю, что с чрезмерно сложными решениями. bootstrap уже центрирует его горизонтально для вас, поэтому вам не нужно возиться с этим. Мое решение - просто установить верхний предел только с помощью jQuery.
$('#myModal').on('loaded.bs.modal', function() { $(this).find('.modal-dialog').css({ 'margin-top': function () { return (($(window).outerHeight() / 2) - ($(this).outerHeight() / 2)); } }); });я использовал событие loaded.bs.modal, поскольку я удаленно загружаю контент, а использование события showed.ba.modal приводит к неправильному вычислению высоты. Конечно, вы можете добавить событие для изменения размера окна, Если вам это нужно отзывчивый.
очень простой способ достичь этой концепции, и вы получите модальный всегда в моде вашего экрана с помощью css как fllow:http://jsfiddle.net/jy0zc2jc/1/
вы должны просто
modalотображение класса в виде таблицы с помощью следующего css:display:tableи
modal-dialogкакdisplay:table-cellполный рабочий пример в скрипку
это не так сложно.
пожалуйста, попробуйте это:
$(document).ready(function(){ var modalId = "#myModal"; resize: function(){ var new_margin = Math.ceil(($(window).height() - $(modalId).find('.modal-dialog').height()) / 2); $(modalId).find('.modal-dialog').css('margin-top', new_margin + 'px'); } $(window).resize(function(){ resize(); }); $(modalId).on('shown.bs.modal', function(){ resize(); }); });
простой способ. Работать на меня. Thks rensdenobel :) http://jsfiddle.net/rensdenobel/sRmLV/13/
<style> .vertical-alignment-helper { display:table; height: 100%; width: 100%; } .vertical-align-center { /* To center vertically */ display: table-cell; vertical-align: middle; } .modal-content { /* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */ width:inherit; height:inherit; /* To center horizontally */ margin: 0 auto; } </style> <!-- Button trigger modal --> <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Launch demo modal</button> <!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="vertical-alignment-helper"> <div class="modal-dialog vertical-align-center"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> <h4 class="modal-title" id="myModalLabel">Modal title</h4> </div> <div class="modal-body">...</div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </div> </div>
используйте этот простой скрипт, который центрирует модалы.
Если вы хотите, вы можете установить пользовательский класс (например,.модальный.модальный-vcenter вместо .модальные) ограничить функциональность только в определенной модальности.
var modalVerticalCenterClass = ".modal"; function centerModals($element) { var $modals; if ($element.length) { $modals = $element; } else { $modals = $(modalVerticalCenterClass + ':visible'); } $modals.each( function(i) { var $clone = $(this).clone().css('display', 'block').appendTo('body'); var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2); top = top > 0 ? top : 0; $clone.remove(); $(this).find('.modal-content').css("margin-top", top); }); } $(modalVerticalCenterClass).on('show.bs.modal', function(e) { centerModals($(this)); }); $(window).on('resize', centerModals);также добавьте это исправление CSS для горизонтального интервала модала; мы показываем прокрутку на модалах, прокрутки тела автоматически скрываются загрузкой:
/* scroll fixes */ .modal-open .modal { padding-left: 0px !important; padding-right: 0px !important; overflow-y: scroll; }
в мобильном plantform это может выглядеть немного по-другому, вот мой код.
<div class="modal-container"> <style> .modal-dialog{ margin-top: 60%; width:80%; margin-left: 10%; margin-right: 10%; margin-bottom: 100% } @media screen and (orientation:landscape){ .modal-dialog{ margin-top: 70; width:80%; margin-left: 10%; margin-right: 10%; margin-bottom: 100% } } .modal-body{ text-align: center; } .modal-body p{ margin:14px 0px; font-size: 110%; } .modal-content{ border-radius: 10px; } .modal-footer{ padding:0px; } .modal-footer a{ padding: 15px; } .modal-footer a:nth-child(1){ border-radius: 0px 0px 0px 10px; } .modal-footer a:nth-child(2){ border-radius: 0px 0px 10px 0px; } </style> <h2>Basic Modal Example</h2> <div data-toggle="modal" data-target="#myModal">Div for modal</div> <div class="modal fade" id="myModal" role="dialog"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-body"> <p>确定要取消本次订单嘛?</p> </div> <div class="modal-footer"> <div class="btn-group btn-group-justified"> <a href="#" class="btn btn-default" data-dismiss="modal">取消</a> <a href="#" class="btn btn-default" data-dismiss="modal">确定</a> </div> </div> </div> </div> </div> </div>
стиль таблицы
<!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <table height="100%" width="100%"> <tr><td valign="middle"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="myModalLabel">Modal title</h4> </div> <div class="modal-body"> ... </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </td></tr> </table> </div>
Comments