Вертикальне центральне модальне вікно Bootstrap


181

Я хотів би сконцентрувати модальний режим у вікні перегляду (посередині), я намагався додати деякі властивості css

 .modal { position: fixed; top:50%; left:50%; }   

Я використовую цей приклад http://jsfiddle.net/rniemeyer/Wjjnd/

я намагався

$("#MyModal").modal('show').css(
    {
        'margin-top': function () {
            return -($(this).height() / 2);
        },
        'margin-left': function () {
            return -($(this).width() / 2);
        }
    })

Спробуйте .modal.fade.inтакож
перемогти


3
Спробуйте цей zerosixthree.se/… я використовую: .modal.fade.in {top: 50%; перетворення: перекластиY (-50%); }
jowan sebastian

Додано рішення флексокс (це translateY(-50%)робить верхній частині модальної недоступною, коли вміст мода вище висоти пристрою).
дао

На момент завантаження 4 додано модально-діалоговий центр, що це більше не потрібно. Перегляньте цю відповідь нижче.
jcaruso

Відповіді:


258

Це робить роботу: http://jsfiddle.net/sRmLV/1140/

Він використовує helper-div та деякі користувальницькі css. Не потрібно JavaScript або jQuery.

HTML (на основі демо-коду Bootstrap )

<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">&times;</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>

CSS

.vertical-alignment-helper {
    display:table;
    height: 100%;
    width: 100%;
    pointer-events:none; /* This makes sure that we can still click outside of the modal to close it */
}
.vertical-align-center {
    /* To center vertically */
    display: table-cell;
    vertical-align: middle;
    pointer-events:none;
}
.modal-content {
    /* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
    width:inherit;
    max-width:inherit; /* For Bootstrap 4 - to avoid the modal window stretching full width */
    height:inherit;
    /* To center horizontally */
    margin: 0 auto;
    pointer-events: all;
}

При такому розчині через висоту: 100%; і ширина: 100%; ви не можете закрити модалі, натиснувши їх. Ви можете придумати виправлення цього @Rens de Nobel?
pcatre

1
Гаразд, це рішення, здається, працює чудово (за винятком того, що це не дозволяє мені закривати модалі, натискаючи їх). Але якимось чином деякі мої тести e2e з транспортиром виходять з ладу (і я не можу знайти причину, чому я не відчуваю, що це помилка в цьому). У будь-якому випадку я повертаюся до відповіді javascript, щоб не втрачати більше часу на це. Але, як я вже сказав, це, здається, працює нормально, просто попереджаючи людей, які роблять тести e2e з транспортиром, щоб слідкувати.
pcatre

3
@pcatre, дякую за пораду! Я оновив код із виправленням цього. Встановлення покажчика-події: немає; на вирівнювання-класи робить свою справу. Тестовано в IE11, Останніх Chrome і Firefox та iOS Safari.
RNobel

4
Не впевнений, чи це було оновлено після коментарів користувачів, які говорять, що це не працює, клацаючи всередині модальних елементів, але це на 100% працює для мене на даний момент, використовуючи приклад у Скрипці вище. Дякую за вашу допомогу та всі коментарі вище.
Майкл Г

2
На момент завантаження 4 додано модально-діалоговий центр, що це більше не потрібно. Перегляньте цю відповідь нижче.
jcaruso

94

Оскільки відповідь gpcola для мене не спрацювала, я трохи відредагував, і тепер вона працює. Я використовував "margin-top" замість трансформації. Крім того, я використовую "показ" замість "показаного" події, тому що після цього він дав мені дуже поганий стрибок позиціонування (видно, коли у вас анімація завантаження). Обов'язково встановіть дисплей "блокувати" перед позиціонуванням, інакше $ dialog.height () буде 0, а модальний не буде повністю зосереджений.

(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));

6
Цей ідеальний! Просто замість $ (document) .height () правильно використовувати $ (window) .height () у рядку 4. Плюс я змінив би останній рядок на: $('.modal:visible').each(centerModal);
Denis Chmel

Для мене це працює чудово, дякую. коли ми використовуємо цей код, ми також мусимо встановити накладки зверху та внизу модального діалогового вікна на 0px, до ідеального центрування.
mina morsali

Це руйнується, якщо модаль вище, ніж висота вікна. Тому я додав наступний рядок безпосередньо перед встановленням верхньої межі діалогового вікна: if(offset < 0) offset = 0; Я вставляю весь блок у випадок відповіді, який незрозумілий!
jetlej

Я додав ще кілька змін, щоб верхня межа
залишалася

Ідеально, не вистачало $ (this) .css ('показ', 'блок'); весь час і думав, чому зріст дорівнював 0.
Jānis Gruzis

81

Це я зробив для свого додатка. Якщо ви подивитеся на наступні класи у файлі bootstrap.css .modal-dialog має вкладене за замовчуванням 10px та екран @media та (min-width: 768px) .modal-dialog має верхню підкладку, встановлену на 30px. Таким чином, у власному файлі css я встановив, що верхнє накладка становить 15% для всіх екранів, не вказуючи ширину екрана медіа. Сподіваюся, це допомагає.

.modal-dialog {
  padding-top: 15%;
}

6
це робота лише для невеликих ящиків з альретами, а не для ящиків з
великими

Ви можете просто застосувати до невеликих модалів:.modal-dialog.modal-sm { padding-top:15%; }
Данк,

61

Найкращий спосіб, який я знайшов для всіх браузерів HTML5:

body.modal-open .modal {
    display: flex !important;
    height: 100%;
} 

body.modal-open .modal .modal-dialog {
    margin: auto;
}

2
Мені сподобалося це рішення, дуже чисте. Не впевнений у настільній чи старій версії Safari, але, здається, це добре в iOS 8.
Nicolas Galler

1
Так, я згоден з @NicolasGaller. Це добре працює і для мене. Я протестував у Chrome та Firefox. Це добре працює.
Манджунат Редді

2
Це великий CSS лише прогресивне вдосконалення. Не потрібен js, і будь-який веб-переглядач, який не підтримує flexbox, отримає модальне розташування за замовчуванням.
Крейг Харшбаргер

Закрити, але порушується можливість закриття модалів, коли на сторінці їх більше. Дивіться мою відповідь нижче, щоб виправити.
Роберт Маккі

1
Оновлення: Додавання align-items: center;до body.modal-open .modalсхоже на роботу.
bernie

20
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="table">
        <div class="table-cell">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</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>
</div>

// Стилі

.table {
 display: table;
 height:100%;
}
.table-cell {
display: table-cell;
vertical-align: middle;
}

3
Це універсальна відповідь. Я не знаю, чому ніхто не проголосував за це.
Csaba Toth

3
Я пройшов щонайменше 4 записки SO, кожен з десятком пропозицій. До речі, у віці HTML5 це повинно бути вбудовано в функціонал принаймні до якоїсь основи. Замість жонглювання.
Csaba Toth

1
Також зверніть увагу: якщо ви скажете ширину: 100% для стилю таблиці, ви отримаєте горизонтальне центрування (на випадок, якщо модальний не буде переповнений прихованим).
Csaba Toth

1
Найкраща відповідь на сьогоднішній день. Це створює панель прокрутки, але ви можете відключити її, зробивши .modal-open .modal {overflow-y: hidden; }
Крістоф

14

Верхній параметр переосмислюється в .modal.fade.in, щоб примусити значення, встановлене у вашій спеціальній декларації, додати !importantключове слово після початку. Це змушує браузер використовувати це значення та ігнорувати будь-які інші значення для ключового слова. Це має той недолік, що ви не можете змінити значення ніде більше.

.modal {
    position: fixed;
    top: 50% !important;
    left: 50%;
}

Це не дозволяє мені закрити модальний режим, коли клацніть на тлі про модал.
Скотт Сімпсон

13

Станом на Bootstrap 4 був доданий наступний клас, щоб досягти цього для вас без JavaScript.

modal-dialog-centered

Ви можете знайти їх документацію тут .

Дякуємо vd за вказівку, вам потрібно додати обидва .modal-dialog -centtered .modal-dialog, щоб вертикально центрувати модальний.


1
Це найкраща відповідь для завантажувальної програми 4.
broc.seib

додавання модально-діалогового та модально-діалогового центру має кращий результат
vd

1
@vd thats зрозуміло, з урахуванням документації говорять "Додати .modal-dialog-centered to .modal-dialog, щоб вертикально центрувати модальний." Я оновлю свою відповідь, щоб відобразити це також і для тих, хто цього не спіймав.
jcaruso

12

це прекрасно працює для мене:

.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;
}

заповніть демонстраційну URL-адресу: https://codepen.io/dimbslmh/full/mKfCc


11

Ви можете використовувати:

.modal {
    position: fixed;
    top: 50% !important;
    left: 50%;
    transform: translate(-50%, -50%);
}

центрувати його як вертикально, так і горизонтально.


2
Це справжнє "як централізувати щось" за допомогою CSS без використання Flex. Той факт, що контекст є Bootstrap чи модальним, має бути неактуальним. Всі інші відповіді занадто непосильні.
ESR

1
За допомогою цього методу, якщо модаль перевищує висоту екрана пристрою, верхня частина модаля стає недоступною.
тао

11

Тому що більшість відповідей тут не спрацювала або лише частково спрацювала:

body.modal-open .modal[style]:not([style='display: none;']) {
    display: flex !important;
    height: 100%;
} 

body.modal-open .modal[style]:not([style='display: none;']) .modal-dialog {
    margin: auto;
}

Ви повинні використовувати селектор [style], щоб застосувати стиль лише до модального режиму, який зараз активний, а не до всіх модалів. .inбуло б чудово, але це, мабуть, додається лише після завершення переходу, який занадто пізно і спричинить деякі по-справжньому погані переходи. На щастя, видається, що завантажувач завжди застосовує атрибут стилю на модалі так само, як він починає показувати, так що це трохи хакітно, але це працює.

Ця :not([style='display: none;'])частина - це спосіб вирішення проблеми завантаження, не видаляючи атрибут стилю правильно, а замість того, щоб встановити відображення стилю до жодного, коли ви закриєте діалогове вікно.


Чудово, дякую. Це насправді єдине, що спрацювало 2016.
AlexioVay

Минуло 4 роки. Ще корисна. Дякую, друже!
Хасан Номані

8

Ви можете досягти центру вертикального вирівнювання на модалі Bootstrap 3 таким чином:

.modal-vertical-centered {
  transform: translate(0, 50%) !important;
  -ms-transform: translate(0, 50%) !important; /* IE 9 */
  -webkit-transform: translate(0, 50%) !important; /* Safari and Chrome */
}

і додайте цей клас css до контейнера "модальний діалог"

<div class="modal-dialog modal-vertical-centered">
...

Приклад роботи jsFiddle: http://jsfiddle.net/U4NRx/


Як саме він центрирує діалог вертикально?
gkalpak

Працює чудово в більшості місць, але не працює у загорнутих програмах html5 нижче, ніж Android 4.4.
Джош

3
Мій модал перейшов на сторінку з цим
Доріан

1
ТАК! Я використовую: .modal.fade.in {top: 50%; перетворення: перекластиY (-50%); }
jowan sebastian

Просто змініть 50% до 15%, і тоді діалог буде в центрі вікна. .модально-вертикально-орієнтоване {перетворення: перекласти (0, 15%)! важливо; -ms-перетворення: перекласти (0, 15%)! важливо; / * IE 9 / -webkit-перетворення: перекласти (0, 15%)! Важливо; / Сафарі та Chrome * /}
Хаймей

8

Найчистіший і найпростіший спосіб зробити це - використовувати Flexbox! Далі буде вертикально вирівнювати модаль Bootstrap 3 в центрі екрана і він набагато чистіший і простіший за всі інші рішення, розміщені тут:

body.modal-open .modal.in {
  display: flex !important;
  align-items: center;
}

ПРИМІТКА. Хоча це найпростіше рішення, воно може працювати не для всіх завдяки підтримці браузера: http://caniuse.com/#feat=flexbox

Схоже, що (як правило) IE відстає. У моєму випадку всі продукти, які я розробляю для себе або для клієнтів, є IE10 +. (Не має сенсу для бізнесу розумно вкладати час на розробку, підтримуючи старіші версії IE, коли це можна було б використати для розробки продукту та швидшого виходу MVP). Це, звичайно, не розкіш, яку мають усі.

Я бачив, як більші веб-сайти визначають, підтримується чи ні флексбокс, і застосовують клас до основної частини сторінки - але цей рівень фронтальної інженерії є досить надійним, і вам все одно знадобиться резервний запас.

Я б закликав людей сприймати майбутнє Інтернету. Flexbox є приголомшливим, і ви можете почати використовувати його, якщо зможете.

PS - Цей веб-сайт справді допоміг мені зрозуміти флексбокс у цілому та застосувати його до будь-якого випадку використання: http://flexboxfroggy.com/

EDIT: У разі двох модалів на одній сторінці це має стосуватися .modal.in


Це працює інакше добре, але кінцева анімація виглядає не так добре.
користувач2061057

Чи маєте змогу виконати анімацію за допомогою CSS3 переходів?
Грег Бласс

7

Переваги:

  • модальний вміст, доступний навіть тоді, коли він вище, ніж пристрій
  • не використовується display:table-cell(це не призначено для макетів)
  • не вимагає жодних модифікацій за замовчуванням Bootstrap 3 markup
  • позиціонування - це чистий CSS. JS додається для закриття модального клацання / натискання внизу та над ним
  • Я включив без префікса SCSSдля тих, хто використовує gulpабоgrunt

Примітка. Цю відповідь я маю намір оновлювати останніми специфікаціями Bootstrap 3. Щодо рішення Bootstrap 4, дивіться цю відповідь (на даний момент вони більш-менш однакові, але з часом вони можуть розходитися). Якщо ви виявите помилку або проблему, повідомте мене, і я оновлю. Дякую.


Чистий, без префіксації SCSS(для використання з gulp/ grunt):

.modal-dialog {
  display: flex;
  flex-direction: column;
  justify-content: center;
  overflow-y: auto;
  min-height: calc(100vh - 60px);
  @media (max-width: 767px) {
    min-height: calc(100vh - 20px);
  }
}

2
Найкраще рішення ІМО.
Радіація

3

Ще одне рішення CSS. Не працює для спливаючих вікон, які перевищують порт перегляду.

.modal-dialog {
    position: absolute;
    right: 0;
    left: 0;
    margin-top: 0;
    margin-bottom: 0; 
}
.modal.fade .modal-dialog {
    transition: top 0.4s ease-out;
    transform: translate(0, -50%);
    top: 0;
}
.modal.in .modal-dialog {
    transform: translate(0, -50%);
    top: 50%;
}

У .modal-dialogкласі переосмислення позиції на абсолютне (від відносного) та центрування змістуright:0, left: 0

В .modal.fade .modal-dialog , .modal.in .modal-dialogналаштуваннях анімації переходу над , topа не на переклад.

margin-topпереміщує спливаюче вікно трохи нижче центру у разі невеликого спливаючого вікна, а у разі тривалого спливаючого вікна модальний застряг із заголовком. Звідсиmargin-top:0, margin-bottom:0

Потрібно додатково уточнити його.


3

Для тих, хто використовує bogularstrap angular-ui, можна додати нижчезазначені класи на основі наведеної вище інформації:

Примітка: інших змін не потрібно, і вони повинні вирішити всі способи.

// The 3 below classes have been placed to make the modal vertically centered
.modal-open .modal{
    display:table !important;
    height: 100%;
    width: 100%;
    pointer-events:none; /* This makes sure that we can still click outside of the modal to close it */
}

.modal-dialog{
    display: table-cell;
    vertical-align: middle;
    pointer-events: none;
}

.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;
    pointer-events: all;
}

3

Не потрібно нам JavaScript. Модальний завантажувач додає .in клас, коли він з'являється. Просто змініть цю комбінацію класів з modalclassName.fade.in за допомогою flex css, і ви закінчите.

додайте цей css до центру модалу вертикально та горизонтально.

.modal.fade.in {
    display: flex !important;
    justify-content: center;
    align-items: center;
}
.modal.fade.in .modal-dialog {
    width: 100%;
}

2

Мій вибір, лише невеликий CSS: (НЕ працює в IE8)

.modal.fade .modal-dialog {
    transform: translate(-50%, -80%);
}

.modal.in .modal-dialog {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    margin-top: 0px;
}

Ви можете грати з першим правилом, щоб змінити, як виглядає модальний.

Використання: Bootstrap 3.3.4


2

Просто додайте наступний CSS до наявного, він працює для мене чудово

.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;
}

2

На основі відповіді Арані , а також обліку прокрутки сторінки.

(function($) {
    "use strict";
    function positionModals(e) {
        var $this = $(this).css('display', 'block'),
            $window = $(window),
            $dialog = $this.find('.modal-dialog'),
            offset = ($window.height() - $window.scrollTop() - $dialog.height()) / 2,
            marginBottom = parseInt($dialog.css('margin-bottom'), 10);

        $dialog.css('margin-top', offset < marginBottom ? marginBottom : offset);
    }

    $(document).on('show.bs.modal', '.modal', positionModals);

    $(window).on('resize', function(e) {
        $('.modal:visible').each(positionModals);
    });
}(jQuery));

2

Я думаю, що це дещо чистіше чисте рішення CSS, ніж рішення Ренса де Нобеля. Також це не заважає закрити діалогове вікно, клацнувши поза ним.

http://plnkr.co/edit/JCGVZQ?p=preview

Просто додайте якийсь клас CSS до контейнера DIV з класом .modal-dialog, щоб отримати більш високу специфічність, ніж CSS для завантаження, наприклад .centered.

HTML

<div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
  <div class="modal-dialog centered modal-lg">
    <div class="modal-content">
      ...
    </div>
  </div>
</div>

І зробіть цей .modal-dialog.centrated контейнер фіксованим та правильним.

CSS

.modal .modal-dialog.centered {
    position: fixed;
    bottom: 50%;
    right: 50%;
    transform: translate(50%, 50%);
}

Або ще простіше, використовуючи флексбокс.

CSS

.modal {
    display: flex;
    align-items: center;
    justify-content: center;
}

Ця версія flexbox не працює, як очікувалося. Тестуючи на останньому Chrome (52.0.x), .modal-діалогове вікно належним чином зосереджено, але його змістова взаємодія здається замороженою на старому місці (дивно). Однак ви можете спробувати використовувати цю техніку прямо у .modal-dialog (не на .modal), а з деякими іншими властивостями це, здається, працює. =)
giovannipds


1

Це працює в BS3, не перевіряється в v2. Він центрує модально вертикально. Зауважте, що він буде перехід туди - якщо ви хочете, щоб він просто з'явився у редагуванні transitionвластивості CSS для.modal-dialog

centerModal = function() {
    var $dialog = $(this).find(".modal-dialog"),
        offset = ($(window).height() - $dialog.height()) / 2;

    // Center modal vertically in window
    $dialog.css({
        'transform': 'translateY(' + offset + 'px) !important',
    });
};

$('.modal').on('shown.bs.modal', centerModal);
$(window).on("resize", function() {
    $('.modal').each(centerModal);
});

1
e(document).on('show.bs.modal', function () {
        if($winWidth < $(window).width()){
            $('body.modal-open,.navbar-fixed-top,.navbar-fixed-bottom').css('marginRight',$(window).width()-$winWidth)
        }
    });
    e(document).on('hidden.bs.modal', function () {
        $('body,.navbar-fixed-top,.navbar-fixed-bottom').css('marginRight',0)
    });

Чи можете ви уточнити, яка функція 'е' у вашій відповіді?
Майкл Батлер

1

Це вимагає відповіді Арані і змушує її працювати, якщо модаль перевищує висоту екрана:

function centerModal() {
    $(this).css('display', 'block');
    var $dialog = $(this).find(".modal-dialog");
    var offset = ($(window).height() - $dialog.height()) / 2;
    //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
    var bottomMargin = $dialog.css('marginBottom');
    bottomMargin = parseInt(bottomMargin);
    if(offset < bottomMargin) offset = bottomMargin;
    $dialog.css("margin-top", offset);
}

$('.modal').on('show.bs.modal', centerModal);
$(window).on("resize", function () {
    $('.modal:visible').each(centerModal);
});

Привіт @jetlej, чому ти просто не відредагуєш відповідь Арані, щоб включити це? Ви вирішите велику помилку в його коді.
pcatre

@pcatre - я не знав, що можу надсилати зміни! Дякуємо, що
вказали на це

1

Щоб додати вертикальне модальне центрування до bootstrap modal.js, я додав це в кінці Modal.prototype.showфункції:

var $modalDialog = $('.modal-dialog'),
        modalHeight = $modalDialog.height(),
        browserHeight = window.innerHeight;

    $modalDialog.css({'margin-top' : modalHeight >= browserHeight ? 0 : (browserHeight - modalHeight)/2});

Не буде добре, якщо діалогове вікно змінить висоту, щойно відображається, завдяки зміні розміру сторінки або матеріалів всередині нього розширюється / згортається.
Дірбайо

0

Щоб встановити модуль вертикально, вирівняйте діалогове вікно "Середнє все".

/* Примітка:

1. Якщо вам не потрібно призначити селектор, він знайде весь модальний документ і зробить його вертикально посередині

2.Щоб уникнути середнього деякого конкретного модалу, щоб бути його центром, ви можете використовувати: не селектор у події клацання

* /

 $( "[data-toggle='modal']" ).click(function(){
     var d_tar = $(this).attr('data-target'); 
     $(d_tar).show();   
     var modal_he = $(d_tar).find('.modal-dialog .modal-content').height(); 
     var win_height = $(window).height();
     var marr = win_height - modal_he;
     $('.modal-dialog').css('margin-top',marr/2);
  });

Від Мілана Панді


0

Скористайтеся цим простим сценарієм, який центрирує модалі.

Якщо ви хочете, ви можете встановити спеціальний клас (наприклад: .modal.modal-vcenter замість .modal), щоб обмежити функціональність лише деякими модами.

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 для горизонтального проміжку модалу; ми показуємо прокрутку на модалях, скрутки тіла автоматично приховані Bootstrap:

/* scroll fixes */
.modal-open .modal {
  padding-left: 0px !important;
  padding-right: 0px !important;
  overflow-y: scroll;
}

0

Ще одна відповідь CSS на це запитання ...
Це рішення використовує CSS лише для досягнення бажаного ефекту, зберігаючи при цьому можливість закрити модальний клавішу, клацнувши поза ним. Це також дозволяє встановити .modal-contentмаксимум висоти та ширини, щоб спливаючі вікна не зростали за межами області перегляду. Прокрутка автоматично з’явиться, коли вміст перевищить модальний розмір.

Примітка:
Рекомендовану програму Bootstrap .modal-dialog divслід опустити, щоб це нормально працювало (схоже, нічого не порушує). Тестовано в Chrome 51 та IE 11.

Код CSS:

.modal {
   height: 100%;
   width: 100%;
}

.modal-content {
   margin: 0 auto;
   max-height: 600px;
   max-width: 50%;
   overflow: auto;
   transform: translateY(-50%);
}

EDIT:.modal-dialog клас дозволяє вибрати , чи може користувач закрити модальний, клацнувши поза самого модальний. У більшості модалів є чітка кнопка "закрити" або "скасувати". Майте це на увазі, використовуючи цей спосіб вирішення.


0

Найкраще рішення для централізації вашого модаля за шириною та висотою - в css add і в модальному режимі додайте цей «централізатор» як клас ..

.centralize{
   position:absolute;
   left:50%;
   top:50%;

   background-color:#fff;
   transform: translate(-50%, -50%);
   width: 40%; //specify watever u want
   height: 50%;
   }

0

Вертикально-по центру Додайте .modal-dialog-centered to .modal-dialog, щоб вертикально центрувати модальний

Запустіть демонстраційний модал

<!-- Modal -->
<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalCenterTitle">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.