ブートストラップモーダルはスクロールバーを削除します


94

ページでモーダルビューをトリガーすると、スクロールバーが非表示になります。モーダルが移動/非表示になると、背景ページが動き始めるので、これは迷惑な効果です。その効果の治療法はありますか?


1
ブラウザ互換性のある回答:stackoverflow.com/a/47807685/7186739
スーパーモデル

回答:


115

これは機能であり、モーダルを表示するとクラスmodal-openがHTML bodyに追加され、モーダルを非表示にすると削除されます。

ブートストラップCSSが言うので、これはスクロールバーを非表示にします

.modal-open {
    overflow: hidden;
}

これを指定することでこれを上書きできます

.modal-open {
    overflow: scroll;
}

独自の CSS。


もっと具体的に教えてもらえますか?
El Dude

1
詳細をいくつか追加しました。今はまし?
フラップ2014

14
OPの質問の意図をより適切に扱うには、overflow-y:scrollを使用する方が適切です。overflow:scrollを使用すると、画面の下部に水平スクロールバーが追加されます。
スコット

1
完璧で、角度ストラップモーダルでも機能します。上記のCSSを<style></style>内部に単純に含めることができるtemplateUrlため、アプリの他のモーダルに影響を与えません。
davidkonrad 2016年

2
オーバーフローを使用:継承; 代わりに。このようにして、モーダルはスクロールがあるときにスクロールを削除せず、スクロールがないときにスクロールを追加しません
Alisson Alvarenga

31

モーダルを開くと、常にスクロールで開くため、継承スクロールよりも優れていると思いますが、スクロールがない場合も同じ問題が発生します。だから私はこれをします:

.modal-open {
  overflow: inherit;
}

これが本当の答えです。オーバーフロースクロールはまだ私の場合いくつかの要素に影響します。
Coisox 2018年

26

使った

.modal-open {
  overflow-y: scroll;
}

この場合、水平スクロールバーを表示することを避けます


@Alisson Alvarengaの回答と組み合わせて、overflow-y:inheritを使用できます。
duodvk 2017年

23

overflow-y:scrollを使用して本文からパディングを削除し、ページ本体にブートストラップモーダル追加パディングを追加することをお勧めします。

.modal-open {
  overflow:hidden;
  overflow-y:scroll;
  padding-right:0 !important;
}

IEブラウザー互換: IEブラウザーはデフォルトで同じことを行います。


1
どうも。さらに、モーダルポップアップがスクロールする必要があり、親が静止している必要がある場合.modal-body {max-height:calc(100vh-210px); overflow-y:auto; } .modal-open {overflow:hidden; オーバーフロー-y:スクロール。padding-right:0!重要; }
Oracular Man 2018

9

私はこの投稿に遭遇した神に感謝!私は自分の閉じるリンクを使用してウィンドウを閉じるときに、スクロールバーを元に戻す方法を理解しようとして髪を引っ張っていました。CSSの提案を試しましたが、正しく機能しませんでした。読んだあと

modal-openクラスは、モーダルを表示するとHTMLボディに追加され、モーダルを非表示にすると削除されます。-@flu​​p

私はjqueryを使用したソリューションを思いついたので、他の誰かが同じ問題を抱えており、上記の提案が機能しない場合は-

<script>
            jQuery(document).ready(function () {
jQuery('.closeit').click(function () {
 jQuery('body').removeClass('modal-open');
                });
            });
        </script>

モーダルが非表示になっているときにカスタムコードを実行できるように、hide.bs.modalイベントをオーバーライドする問題がありましたが、モーダルオープンクラスが本体から削除されないことがわかりませんでした-したがって、この特定のモーダルを閉じたときにスクロールバーが戻らない。私は自分のhide.bs.modalコードでmodal-openクラスを手動で削除していませんが、その問題は修正されています。
ジム

1
data-dismiss="modal"このようなカスタムを行う代わりに、リンクに属性を追加する必要があるだけです。ブートストラップは、そのリンクをクリックすると、適切なすべての終了アクションを実行します。
nollidge

1
角度コントローラーで関数を呼び出しているため、私の場合data-dismiss = "modal"は機能しません。提案されたjQueryソリューションは私にとって非常にうまく機能します。
ジャンニ2017

5

私はこのBootstrapモーダルの「機能」で遊んでいました。思わ.modalクラスが持つoverflow-y:auto;モーダル自体がハイになったときにモーダルラッパーが自分のスクロールバーを取得しますので。

常にスクロールバーが必要な場合(設計者はよく行います)最初に本体を設定します

body {
    overflow-y:scroll;
}

次に処理します .modal-open

.modal-open .modal {
    overflow-y:scroll; /* Force a navbar on .modal */
}

.modal-open .topnavbar-wrapper {
    padding-right:17px; /* Noticed that right aligned navbar content got overlapped by the .modal scrollbar */
}

この場合、本体のスクロールバーを無効のままにしない

このページの他のすべての答えは私のコンテンツをジャンプさせ続けました。

注意喚起!

このソリューションは常に私にとってはうまくいきましたが、昨日、モーダルがドラッグ可能であり、画面に合わせて(垂直に)大きくなると、この修正を使用するときに問題が発生しました。position:sticky追加した要素と関係があるのでしょうか?


body {overflow-y:scroll;}を追加すると、問題は解決しました。ありがとうございます。
FrenkyB 2017年

1

独自のcssファイルを作成して、ブートストラップの特定の部分をカスタマイズする場合は、さらに良い方法です。

ブートストラップのcssファイルを変更しないでください。ページの他の部分で使用すると、ブートストラップのすべてが変更されます。

ページが多少長い場合は、自動的にスクロールバーが表示されます。そして、モーダルを開くと、デフォルトでブートストラップが行うので、スクロールバーが非表示になります。

モーダルが開かれるときに非表示にしないようにするには、CSSコード(下記)を独自のcssファイルに配置してオーバーライドします。

.modal-open {
    overflow: scroll;
}

ちょうどその逆...

.modal-open {
    overflow: hidden;
}

3
これには、この質問の他の回答と同じ情報が含まれているようです。答えが異なる場合は、それを編集して正確に違う点を明確にします。新しいものがある場合にのみ、新しい回答を追加してください。
Jeffrey Bosboom 2015年

1
同じ答えが含まれていますが、それを説明する別の方法があります。時には、理解はそれがどのように説明されるかに依存します。
NormanCabilatazan 2015年

1
すべての読者が同じアイデアを得られるわけではありません。彼らがそれを明確に理解するためにそれを説明する他の方法を与える方が良い。
NormanCabilatazan 2015年

1

さらに、モーダルポップアップが内部でコンテンツをスクロールする必要があり、親が静止している必要がある場合は、Custom.cssに以下を追加します(cssをオーバーライドします)。

.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}
.modal-open {
    overflow: hidden;
    overflow-y: scroll;
    padding-right: 0 !important;
}

0

ブートストラップモーダルが開くとパディングが追加されるので、独自のCSSでこのコードを試すことができます

.modal-open {
    padding: 0 !important;
}

0

これはおそらく、1番目のモーダル(閉じたとき)がbody要素からmodal-openクラスを削除し、2番目のトリガーがmodal-openをトリガーしたときに再度追加しないことが原因です。

この場合、イベントを使用してモーダルが完全に閉じられているかどうかを確認し、別のモーダルを開きます

let modal1 = $('.modal1);
let modal2 = $('.modal2);
$modal1.on('hidden.bs.modal', function (e) {
   $modal2.modal('show');
});

これは、最初のモーダルが閉じられるまで待機して、モーダルオープンが本体から削除され、開いたときに再度追加されることを確認します。


0

私は自分自身でこの問題を抱えていました。この質問を見つけると、行動の原因を理解するのにすぐに役立ちました。ほんとありがと。

しかし、私はこれらのCSSの回避策が少し洗練されていないと感じています。それ以外の場合は、特にスクロールバーを保持したい場合を除きます(ただし、その理由は考えられません)。

本質的にブートストラップは、スクロールバーの削除を補うために特定の要素にパディング権を適用しています。

したがって、必要なのは、問題のある要素の周りにゼロのパディング権を持つ追加のラッパーを配置することです(そして、ターゲットにされているクラスをそれに移動します)。

つまり、これから変更...

<div class="fixed-top p-1 bg-dark">
    ...this content will move as padding will be modified...
</div>

...これに...

<div class="fixed-top p-0 bg-dark">
    <div class="p-1">
        ...this content won't move...
    </div>
</div>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.