Как изменить размер модального окна Twitter Bootstrap динамически в зависимости от содержимого

101

У меня есть содержимое базы данных, которое содержит разные типы данных, такие как видео Youtube, видео Vimeo, текст, изображения Imgur и т. Д. Все они имеют разную высоту и ширину. Все, что я нашел при поиске в Интернете, это изменение размера только одного параметра. Он должен совпадать с содержимым всплывающего окна.

Это мой HTML-код. Я также использую Ajax для вызова контента.

<div id="modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3 id="ModalLabel"></h3>
    </div>
    <div class="modal-body">

    </div>
</div> 
Эрдем Эдже
источник

Ответы:

112

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

.modal-body {
    position: relative;
    overflow-y: auto;
    max-height: 400px;
    padding: 15px;
}

Таким образом, вы можете динамически добавлять встроенные стили, используя cssметод jquery :

Для более новых версий бутстрапа используйте show.bs.modal

$('#modal').on('show.bs.modal', function () {
       $(this).find('.modal-body').css({
              width:'auto', //probably not needed
              height:'auto', //probably not needed 
              'max-height':'100%'
       });
});

Для более старых версий бутстрапа используйте show

$('#modal').on('show', function () {
       $(this).find('.modal-body').css({
              width:'auto', //probably not needed
              height:'auto', //probably not needed 
              'max-height':'100%'
       });
});

или используйте правило css для переопределения:

.autoModal.modal .modal-body{
    max-height: 100%;
}

и добавьте этот класс autoModalв целевые модальные окна.

Измените содержимое динамически в скрипке, вы увидите, что размер модального окна соответственно изменится. Demo

Более новая версия bootstrap см. Доступную event names.

  • show.bs.modal Это событие запускается немедленно при вызове метода экземпляра show. Если он вызван щелчком, выбранный элемент доступен как свойство relatedTarget события.
  • shown.bs.modal Это событие запускается, когда модальное окно становится видимым для пользователя (будет ожидать завершения переходов CSS). Если он вызван щелчком, выбранный элемент доступен как свойство relatedTarget события.
  • hide.bs.modal Это событие запускается сразу после вызова метода экземпляра hide.
  • hidden.bs.modal Это событие запускается, когда модальное окно перестает быть скрытым от пользователя (будет ожидать завершения переходов CSS).
  • loaded.bs.modal Это событие вызывается, когда модальное окно загружает контент с помощью удаленной опции.

modal events Поддерживается более старая версия бутстрапа .

  • Show - это событие запускается немедленно при вызове метода экземпляра show.
  • Показано - это событие запускается, когда модальное окно становится видимым для пользователя (будет ожидать завершения переходов css).
  • hide - это событие запускается сразу после вызова метода экземпляра hide.
  • hidden - это событие запускается, когда модальное окно перестает быть скрытым от пользователя (будет ожидать завершения переходов css).
PSL
источник
Мне пришлось изменить #modal на то же, что и .moda-body, теперь он работает отлично. Большое спасибо!
Erdem Ece
8
@PSL, +1 за ответ и за то, что познакомил меня с kbd в SO.
Роландо Исидоро
похоже, шоу-событие не работает. это сработало: $('#modal').on('show.bs.modal', function () { getbootstrap.com/javascript/#modals-events
joym8 06
+1 за детализацию и учет старого и нового. Вот если бы он не просто заполнял всю ширину экрана, а действительно был динамичным по размеру.
Luminous
@PSL во время выполнения, как можно управлять шириной модального окна? Я имею в виду сделать его меньше или больше с помощью JavaScript?
Sredny M Casanova
119

Это сработало для меня, ничего из вышеперечисленного не сработало.

.modal-dialog{
    position: relative;
    display: table; /* This is important */ 
    overflow-y: auto;    
    overflow-x: auto;
    width: auto;
    min-width: 300px;   
}
Амит Шах
источник
2
@GreenAsJade, пусть эти ссылки помогут вам понять: colintoh.com/blog/display-table-anti-hero iandevlin.com/blog/2013/06/css/css-stacking-with-display-table
Amit Shah
1
@maheshreddy Добро пожаловать, не забудьте проголосовать +1, если это поможет. так что другие могут больше доверять этому ответу и попробовать.
Амит Шах
Он динамически устанавливает высоту, но на этот раз модальный диалог открывается в левой части экрана. Как это исправить?
Джек
1
но это не работает в адаптивном мобильном представлении. Он неплохо работает в экранах ноутбуков.
четан
4
Это сработало, но произвело непреднамеренное воздействие, так как модальное окно больше не центрировалось по вертикали на странице. Ничего особенного, но я подумал, что упомяну кое-что.
Джон Аллард,
22

Мне не удалось получить ответ PSL, работающий на меня, поэтому я обнаружил, что все, что мне нужно сделать, это установить div, содержащий модальное содержимое style="display: table;". Само модальное содержимое говорит о том, насколько большим оно должно быть, и модальное его приспособление.

Светящийся
источник
5
Я тоже не мог получить ответ PSL. (Возможно, потому, что я использовал версию начальной загрузки Angular) Это сработало для меня. Просто обратите внимание, что этот стиль добавлен в класс .modal-dialog +1
user227353
Я применил ваше решение к div, имеющему в качестве класса "modal-content". Работало у меня.
Mehdi
10

Есть много способов сделать это, если вы хотите написать css, а затем добавьте следующие

.modal-dialog{
  display: table
}

Если вы хотите добавить встроенный

<div class="modal-dialog" style="display:table;">
//enter code here
</div>

Не добавляйте display:table;в класс модального содержимого. он выполнил вашу работу, но настройте модальное окно для большого размера, см. следующие снимки экрана. Первое изображение - это если вы добавляете стиль в модальное диалоговое окно, В случае, если вы добавите стиль в модальный диалог если вы добавляете стиль в модальное содержимое. это выглядит расположенным. введите описание изображения здесь

Вакас Али
источник
7

для bootstrap 3 используйте как

$('#myModal').on('hidden.bs.modal', function () {
// do something…
})
user2678868
источник
4
Просто чтобы добавить к этому, hidden.bs.modal будет срабатывать после закрытия модального окна. Используйте show.bs.modal для запуска bootstrap 3 при запуске модального окна.
d3c0y
Каким образом это изменит размер диалогового окна? Это просто функция обратного вызова, которая запускается, когда модальный диалог скрыт (или показан).
user1438038
4

Простая работа css для меня

.modal-dialog { 
max-width : 100% ;
}
Паскаль
источник
2

Я просто отменяю css:

.modal-dialog {
    max-width: 1000px;
}
Эндрю Гейл
источник
2

установлен width:fit-contentна модальном div.

Субхашис Пал
источник
1

Вы можете сделать это, если используете плагин диалога jquery от gijgo.com и установите для ширины значение auto.

$("#dialog").dialog({
  uiLibrary: 'bootstrap',
  width: 'auto'
});
<html>
<head>
  <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  <link href="http://code.gijgo.com/1.0.0/css/gijgo.css" rel="stylesheet" type="text/css">
  <script src="http://code.gijgo.com/1.0.0/js/gijgo.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
 <div id="dialog" title="Wikipedia">
   <img src="https://upload.wikimedia.org/wikipedia/en/thumb/8/80/Wikipedia-logo-v2.svg/1122px-Wikipedia-logo-v2.svg.png" width="320"/>
 </div>
</body>
</html>

Вы также можете разрешить пользователям управлять размером, если для параметра resizable установлено значение true. Вы можете увидеть демонстрацию этого на http://gijgo.com/Dialog/Demos/bootstrap-modal-resizable

Атанас Атанасов
источник
1

Простое решение CSS, которое будет центрировать модальное окно по вертикали и горизонтали:

.modal.show {
  display: flex !important;
  justify-content: center;
}

.modal-dialog {
  align-self: center;
}
Кирк Росс
источник
0

Для Bootstrap 2 Автоматическая регулировка высоты модели динамически

  //Auto adjust modal height on open 
  $('#modal').on('shown',function(){
     var offset = 0;
     $(this).find('.modal-body').attr('style','max-height:'+($(window).height()-offset)+'px !important;');
  });
СударП
источник
0

У меня была такая же проблема с bootstrap 3 и высотой div модального тела, не желающей быть больше 442 пикселей. Это все, что нужно css, чтобы исправить это в моем случае:

.modal-body {
    overflow-y: auto;
}
Бретт Дрейк
источник
0

Мое решение было просто добавить стиль ниже. <div class="modal-body" style="clear: both;overflow: hidden;">

Furquan
источник
0

Начиная с Bootstrap 4 - он имеет стиль:

@media (min-width: 576px)
.modal-dialog {
    max-width: 500px;
}

поэтому, если вы хотите изменить размер модальной ширины на несколько больше, я бы предложил использовать это, например, в вашем css:

.modal-dialog { max-width: 87vw; }

Обратите внимание, что этот параметр width: 87vw;не отменяет загрузку max-width: 500px;.

Зулкифил
источник
0

Мой поиск привел меня сюда, так что с таким же успехом можно добавить идею на два цента. Если вы используете модальный Twitter Bootstrap, дружественный к обезьянам, вы можете сделать что-то вроде этого:

    var dialog = new BootstrapDialog({
        id: 'myDialog',
        title: 'Title',
        closable: false,
        // whatever you like configuration here...
    });

    dialog.realize();
    if (isContentAYoutubeVideo()) {
        dialog.getModalDialog().css('width', '80%'); // set the width to whatever you like
    }
    dialog.open();

Надеюсь это поможет.

jpllosa
источник