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

77

У меня есть контент базы данных, который имеет разные типы данных, такие как видео 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> 

9 ответов

83
Лучший ответ

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

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

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

Для более новых версий загрузки используйте 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 к вашим целевым модалам.

Измените содержимое динамически в скрипте, вы увидите, что модальное изменение размера будет соответствующим образом изменено. Демо

Более новая версия бутстрапа увидит доступную event names.

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

Поддерживается старая версия загрузочного модальных событий.

  • Показать. Это событие срабатывает сразу же после вызова метода show instance.
  • показано. Это событие запускается, когда модальное изображение становится видимым для пользователя (будет ждать завершения css-переходов).
  • скрыть. Это событие запускается сразу же после вызова метода экземпляра hide.
  • скрытый. Это событие запускается, когда модальное завершение скрывается от пользователя (будет ждать завершения css-переходов).
  • 0
    Я должен был изменить #modal таким же, как .moda-body, теперь он работает отлично. Большое спасибо!
  • 0
    Нет проблем .. Рад, что это сработало для вас ..
Показать ещё 5 комментариев
69

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

.modal-dialog{
    position: relative;
    display: table; /* This is important */ 
    overflow-y: auto;    
    overflow-x: auto;
    width: auto;
    min-width: 300px;   
}
  • 1
    Этот работал именно так, как я хотел. Благодарю.
  • 0
    Вот это да. Это работает. Но как и почему! ??
Показать ещё 15 комментариев
16

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

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

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

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

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

.modal-dialog{
  display: table
}

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

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

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

3

Простые Css работают для меня

.modal-dialog { 
max-width : 100% ;
}
1

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

$("#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

0

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

.modal-body {
    overflow-y: auto;
}
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;');
  });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню