2015-01-21 2 views
25

У меня модальный и внутри этого модального есть раскрывающийся список, который отображает большой скрытый контент, который работает.Bootstrap Modal Issue - Scrolling Gets Disabled

Теперь, когда вы открываете следующий модальный, уложенный поверх первого модального и отклоняющий его, прокрутка по модальному внизу становится отключенной.

Я создал полный пример, включая шаги для повторения проблемы, с которой я столкнулся. Вы можете видеть это here.

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"> 
    <title></title> 
    <style> 

    </style> 
</head> 
<body> 


    <input type="button" data-toggle="modal" data-target="#modal_1" class="btn btn-lg btn-primary" value="Open Modal 1" > 

    <div class="modal fade" id="modal_1"> 
     <div class="modal-dialog modal-sm"> 
      <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">First Modal</h4> 
       </div> 
       <div class="modal-body"> 



        <form class="form"> 

         <div class="form-group"> 
          <label>1) Open This First: </label> 
          <input type="button" data-toggle="modal" data-target="#modal_2" class="btn btn-primary" value="Open Modal 2" > 
         </div> 

         <div class="form-group"> 
          <label>2) Change this once you have opened the modal above.</label> 
          <select id="change" class="form-control"> 
           <option value="small">Show Small Content</option> 
           <option value="large">Show Large Content</option> 
          </select> 
         </div> 

         <div id="large" class='content-div'> 
          <label>Large Textarea Content.. Try and scroll to the bottom..</label> 
          <textarea rows="30" class="form-control"></textarea> 

         </div> 

         <div id="small" class='content-div'> 
          <label> Example Text Box</label> 
          <input type="text" class="form-control"> 
         </div> 


        </form> 
       </div> 
       <div class="modal-footer"> 
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
       </div> 
      </div> 
     </div> 
    </div> 


    <div class="modal fade" id="modal_2"> 
     <div class="modal-dialog modal-sm"> 
      <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">Second Modal</h4> 
       </div> 
       <div class="modal-body"> 

        <hp>This is the stacked modal.. Close this modal, then chenge the dropdown menu, you cannot scroll... </h5> 

       </div> 
       <div class="modal-footer"> 
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
       </div> 
      </div> 
     </div> 
    </div> 


</body> 
<script src="http://code.jquery.com/jquery-1.11.0.min.js" type="text/javascript"></script> 
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js" type="text/javascript"></script> 
<script> 

    $(document).ready(function() { 


     $(".content-div").hide(); 
     $("#change").change(function() { 
      $(".content-div").hide(); 
      $("#" + $(this).val()).show(); 
     }); 


    }); 

</script> 
</html> 

Вот Bootply, чтобы показать поведение в действии:

Bootply

+1

[ "Будь уверены, чтобы не открыть модальный, а другое по-прежнему виден. Отображение более одного модальности в то время, требуется специальный код "] (http://getbootstrap.com/javascript/#modals), а также нарушает цель, для которой были предназначены модалы. – Blazemonger

ответ

26

Я нашел решение для Вас. Я не уверен, почему это не работает, но только один код строки в вашем CSS решит проблему. После закрытия второго модального, первый получает overflow-y:hidden как-то. Даже если его установить на auto на самом деле.

Вам нужно переписать и установить собственную декларацию в CSS:

#modal_1 { 
    overflow-y:scroll; 
} 

Здесь вы рабочий DEMO

Редактировать: неправильная ссылка, извините.

22

Это также решение

.modal { 
    overflow-y:auto; 
} 

http://www.bootply.com/LZBqdq2jl5

Auto работает отлично :) Это будет на самом деле зафиксировать любую модальность, которая работает больше, чем размер экрана.

+0

Работал как шарм, спасибо большое. – Pruthviraj

+0

Работает отлично! Спасибо –

2

Я предполагаю, что это из-за ошибки в twitter bootstrap. Кажется, что удалить класс modal-open из тела, даже если были открыты два модала. Вы можете ботинок в тесте для функции jQuery removeClass и обходить его, если есть модальный, все еще открытый (кредит для базовой функции идет на этот ответ: https://stackoverflow.com/a/1950199/854246).

(function(){ 
    var originalRemoveClassMethod = jQuery.fn.removeClass; 

    jQuery.fn.removeClass = function(){ 
     if (arguments[0] === 'modal-open' && jQuery('.modal.in').length > 1) { 
      return this; 
     } 
     var result = originalRemoveClassMethod.apply(this, arguments); 
     return result; 
    } 
})(); 
+0

Как упоминалось @Blazemonger, [Bootstrap явно не поддерживает стилистические модальности] (http://getbootstrap.com/javascript/#modals) – cvrebert

2
$(document).ready(function() { 

$('.modal').on("hidden.bs.modal", function (e) { //fire on closing modal box 
     if ($('.modal:visible').length) { // check whether parent modal is opend after child modal close 
      $('body').addClass('modal-open'); // if open mean length is 1 then add a bootstrap css class to body of the page 
     } 
    }); 
}); 
//this code segment will activate parent modal dialog 
//after child modal box close then scroll problem will automatically fixed 
+1

IMO это лучший ответ. Добавление дополнительного css для overflow-y: авто работает тоже, но, как указано ниже, приводит к двойным полосам прокрутки. –

14

Это происходит потому, что при закрытии модального, он удаляет modal-open из <body> тега. Bootstrap не поддерживает несколько модалов на одной странице (по крайней мере до BS3).

Один из способов заставить его работать, использовать событие hidden.bs.modal, вызванное BS при закрытии модального кода, а затем проверить, есть ли какой-либо другой модальный открытый, чтобы заставить класс modal-open на корпусе.

// Hack to enable multiple modals by making sure the .modal-open class 
// is set to the <body> when there is at least one modal open left 
$('body').on('hidden.bs.modal', function() { 
    if($('.modal.in').length > 0) 
    { 
     $('body').addClass('modal-open'); 
    } 
}); 
1

Во-первых, несколько открытых модальности не поддерживаются Bootstrap.См. Здесь: Bootstrap Modal docs

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

Но, если вы должны, вы можете добавить немного CSS в пользовательской таблице стилей, пока он включен после основной Bootstrap таблицы стилей:

.modal { 
    overflow-y:auto; 
} 
0

Добавить через JQuery в класс «модально-открытый» для тела. Я полагаю, что свиток работает на всем, кроме модального.

В качестве комментария к предыдущим ответам: добавление свойства переполнения в модальное (через CSS) помогает, но тогда у вас будет две полосы прокрутки на странице.

1

Я решил проблему путем удаления data-dismiss="modal" и добавления

setTimeout(function(){ $('#myModal2').modal('show') }, 500); 
$('#myModal1').modal('hide'); 

Надеется, что это помогает

+0

Спасибо @Sunny Я не знаю, почему другие решения не работают для меня, но это определенно сработало –