Модальна проблема Bootstrap - прокрутка стає відключеною


90

У мене є модаль, і в цьому модалі є спадне меню, яке відображає великий прихований вміст, який працює.

Тепер, коли ви відкриваєте наступний модаль, укладений поверх першого модалу, і відхиляєте його, прокрутка модалів знизу стає вимкненою.

Я створив повний приклад, включаючи кроки для відтворення проблеми, з якою я стикаюся. Ви можете побачити це тут .

<!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


Відповіді:


118

Це теж рішення

.modal {
  overflow-y:auto;
}

http://www.bootply.com/LZBqdq2jl5

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


5
Це рішення вирішити мою проблему, в той час як закриття і відкриття модальності з JQuery$('.modal').css('overflow-y', 'auto');
Gla

Спаситель життя) Дякую
Віктор Горбань

66

Це тому, що коли ви закриваєте модаль, він видаляє тег 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');
    }
});

10
(BS4) Перша відповідь, я міг приступити до роботи, просто повинен був використати ($ ('. Modal.show'). Length> 0) для Bootstrap 4.
Shoejep

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

37

Я знайшов для вас рішення. Я не впевнений, чому це не працює, але лише один рядок у вашому CSS вирішить проблему. Після закриття другого модального, перший overflow-y:hiddenякось стає . Навіть якщо його встановити autoнасправді.

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

#modal_1 {
    overflow-y:scroll;
}

Ось у вас є діюча ДЕМО

Редагувати : неправильне посилання, вибачте.


не працює, це робить контейнер прокручуваним, але робить колесо миші також
застрягло

18
$(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

3
ІМО це найкраща відповідь. Додавання зайвого css для overflow-y: auto теж працює, але, як згадувалося нижче, призводять до подвійних смуг прокрутки.
Jacob Rutherford

1
Працює і з Bootstrap 4.1. Вдячний
Віллі

1
Домовились. протестували 2-3 відповіді, і ця працює для Twitter Bootstrap 4.2.1.
Тпойка

11

Дотримуйтесь https://github.com/nakupanda/bootstrap3-dialog/issues/70 add

.modal { overflow: auto !important; }

до вашого css


2
це рішення створило б дві смуги прокрутки
Weijing Jay Lin

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

9

Для bootstrap 4 мені довелося додати! Важливо

.modal {
    overflow-y: auto !important;
}

Якщо цього не зробити, це не працює і не застосовується.

скріншот


6

По-перше, Bootstrap не підтримує кілька відкритих модалів. Дивіться тут: Bootstrap Modal docs

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

Але, якщо потрібно, ви можете додати цей біт CSS у свою спеціальну таблицю стилів, якщо вона включена після основної таблиці стилів Bootstrap:

.modal {
    overflow-y:auto;
}

3

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

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

Сподіваюся, це допоможе


Спасибі @Sunny, я не знаю, чому інші рішення для мене не працюють, але це однозначно працює
dev-masih

@MasihAkbari це може бути питання версії :) Це також мені допоможе. Я використовую BS4. Це може мати невелику проблему з продуктивністю через затримку, але це швидко, легко виправити.
Weijing Jay Lin

3

Bootstrap не підтримував кілька модалів одночасно. Це помилка Bootstrap. Просто додайте наведений нижче сценарій для BS4.

$('body').on('hidden.bs.modal', function () {
if($('.modal.show').length > 0)
{
    $('body').addClass('modal-open');
}
});


2

Я припускаю, що це через помилку в бутстрапі Twitter. Здається, це видаляє modal-openклас із корпусу, навіть якщо два модальні режими були відкриті. Ви можете скористатися тестом на removeClassфункцію jQuery і обійти її, якщо модаль все ще відкритий (кредит на базову функцію відповідає цій відповіді: 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;
    }
})();


1

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

$('body').on('hidden.bs.modal', '#SecondModal', function (e) {
  if ($('#FirstModal').is(':visible')) { // check if first modal open 
    $('body').addClass('modal-open'); // re-add class 'modal-open' to the body because it was removed when we close the second modal
    $('#FirstModal').focus(); // Focus first modal to activate scrollbar
  }
});

1

Якийсь хакер, але мені подобається просто закрити і знову відкрити його за модальним наближенням, щоб позбутися будь-якої дивної / небажаної поведінки. Якщо ви вимкнули вицвітання, ви не можете помітити його закриття та повторне відкриття:

var $ModalThatWasOnTop= $('#ModalThatWasOnTop')

$ModalThatWasOnTop.on('hidden.bs.modal', function(e) {
     console.log('closing  modal that was on top of the other modal')
     $('#ModalThatWasCovered').modal('hide');
     $('#ModalThatWasCovered').modal('show');

});

0

Додайте через JQuery клас "modal-open" до основного. Я припускаю, що сувій працює на всіх, крім модальних.

Як коментар до попередніх відповідей: додавання властивості переповнення до модального (за допомогою CSS) допомагає, але тоді у вас буде дві смуги прокрутки на сторінці.



0

Я насправді знайшов рішення для цього. Насправді вам потрібно ввімкнути прокрутку для тіла вашої сторінки, якщо ви використовуєте, $('#myModal').hide();щоб приховати модель. Просто напишіть наступний рядок після $('#myModal').hide();:

$('body').attr("style", "overflow:auto")

Це знову ввімкне прокрутку.


0

Якщо ви використовуєте bootstrap3 або 4, переконайтеся, що у вас є клас modal-open у тілі html. Я не впевнений, що це обов’язково, але, можливо, переконайтесь, що ваш z-індекс модального фона очищений.

    $('.your-second-modal').on('hidden.bs.modal', function (e) {
        $('.your-second-modal').css('z-index', "");
        $('.modal-backdrop').css('z-index', 1040);
        $('body').addClass("modal-open");
    });

0

Додайте це нижче js-коду

    $(document).on("click",".modal",function () {
       if(!$("body").hasClass('modal-open'))
           $("body").addClass('modal-open');
    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.