ブートストラップモーダルの問題-スクロールが無効になります


91

私はモーダルを持っており、そのモーダル内に、機能している大きな非表示のコンテンツを表示するドロップダウンがあります。

これで、最初のモーダルの上に積み重ねられた次のモーダルを開いて閉じると、下のモーダルのスクロールが無効になります。

直面している問題を再現する手順を含む、完全な例を作成しました。あなたはそれをここで見ることができます

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


回答:


119

これも解決策です

.modal {
  overflow-y:auto;
}

http://www.bootply.com/LZBqdq2jl5

自動は正常に機能します:)これにより、画面サイズよりも大きく実行されるモーダルが実際に修正されます。


5
このソリューションは、jQueryからモーダルを開閉しながら私の問題を解決しました$('.modal').css('overflow-y', 'auto');
Gla

命の救世主)ありがとう
ビクターゴーバン

66

これは、モーダルを閉じるとmodal-open<body>タグからが削除されるためです。Bootstrapは、同じページで複数のモーダルをサポートしていません(少なくともBS3まで)。

これを機能させる1つの方法は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)私は仕事に得ることができる最初の答え、ちょうど使用していたブートストラップ4の($(「modal.show。」)の長さ> 0。)
Shoejep

ありがとう-私の問題はまったく同じではありませんでしたが、あなたのコメントは、失われたページスクロールアクションの原因であるbodyのモーダルオープンクラスを指摘しました。
ジョン

37

私はあなたのための解決策を見つけました。なぜそれが機能しないのかわかりませんが、CSSの1行のコードだけで問題が解決します。2番目のモーダルを閉じた後、最初のモーダルはoverflow-y:hiddenどういうわけか取得しています。auto実際に設定しても。

これを書き直して、CSSで独自の宣言を設定する必要があります。

#modal_1 {
    overflow-y:scroll;
}

ここに動作するデモがあります

編集:間違ったリンク、ごめんなさい。


動作しないため、コンテナはスクロール可能になりますが、マウスホイールも動かなくなります
Kiran

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
IMOこれがベストアンサーです。オーバーフロー用にcssを追加します-y:autoも機能しますが、以下で説明するように、二重スクロールバーになります。
ジェイコブラザフォード

1
Bootstrap4.1でも動作します。感謝
ウィリ

1
同意しました。2〜3の回答をテストしましたが、これはTwitter Bootstrap4.2.1で機能します。
Tpojka

11

https://github.com/nakupanda/bootstrap3-dialog/issues/70をフォローする追加

.modal { overflow: auto !important; }

あなたのCSSに


2
このソリューションでは、2つのスクロールバーが作成されます
Weijing Jay Lin

ここには非常に多くの解決策があるので、彼らはうまくいっていると言いました、私は単純さのためにこれを選びました。私のために完璧に働いた。賛成。
カピタン

9

ブートストラップ4の場合、追加する必要がありました!重要

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

これを行わないと、機能せず、適用されません。

スクリーンショット


6

まず、複数のオープンモーダルはBootstrapではサポートされていません。ここを参照してください:Bootstrap Modal docs

複数のオープンモーダルはサポートされていません。別のモーダルがまだ表示されている間は、モーダルを開かないように注意してください。一度に複数のモーダルを表示するには、カスタムコードが必要です。

ただし、必要に応じて、メインのBootstrapスタイルシートのに含まれている限り、カスタムスタイルシートにこのCSSを追加できます。

.modal {
    overflow-y:auto;
}

3

削除data-dismiss="modal" して追加することで問題を解決しました

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

それが役に立てば幸い


ありがとう@Sunnyなぜ他のソリューションが機能しないのかわかりませんが、これは間違いなく機能します
dev-masih 2017

@MasihAkbariバージョンの問題である可能性があります:)これも私を助けてくれます。BS4を使用しています。遅延が原因でパフォーマンスに少し問題がある可能性がありますが、これはすばやく簡単に修正できます。
Weijing Jay Lin

3

ブートストラップは、同時に複数のモーダルをサポートしていませんでした。ブートストラップバグです。BS4用に以下のスクリプトを追加するだけです。

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


2

これはTwitterブートストラップのバグが原因だと思います。modal-open2つのモーダルが開いていても、クラスがボディから削除されているようです。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;
    }
})();


1

このコードは私の問題を解決しました。2番目のポップアップが閉じると、最初のポップアップはそれ以上スクロールできなくなります。

$('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を介して)モーダルにオーバーフロープロパティを追加すると役立ちますが、ページに2つのスクロールバーがあります。



0

私は実際にこれに対する解決策を考え出しました。$('#myModal').hide();モデルを非表示にするために使用している場合は、実際にはページ本体のスクロールを有効にする必要があります。後に次の行を書くだけ$('#myModal').hide();です:

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

これにより、スクロールが再び有効になります。


0

bootstrap3または4を使用している場合は、html本体にモーダルオープンクラスがあることを確認してください。これが必須かどうかはわかりませんが、モーダル背景のz-indexがクリアされていることを確認してください。

    $('.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');
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.