モーダルボディ専用のスクロールバーを配置するにはどうすればよいですか?


164

私は次の要素を持っています:

<div class="modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-dialog" style="overflow-y: scroll; max-height:85%;  margin-top: 50px; margin-bottom:50px;" > 
        <div class="modal-content"> 
            <div class="modal-header"> 
                <h3 class="modal-title"></h3> 
            </div> 
            <div class="modal-body"></div> 
            <div class="modal-footer"></div> 
        </div> 
    </div> 
</div> 

モーダルダイアログは次のように表示されます。基本的に、スクロールバーが全体に表示され、表示しようとしているコンテンツが含まれてmodal-dialogいませんmodal-body

画像は次のようになります。

ここに画像の説明を入力してください

スクロールバーmodal-bodyだけを取得するにはどうすればよいですか?

に割り当てようとstyle="overflow-y: scroll; max-height:85%; margin-top: 50px; margin-bottom:50px;"しましたmodal-bodyが、うまくいきませんでした。


1
役立つサンプルを提供してください。bootply.com/ newを使用して実行できます。
Carlos Calla 2014

次は、それだけ本体スクロールモーダルので、内部オプション流体ヘッダとフッタのブロックを許可:stackoverflow.com/questions/49173969/...
leontalbot

回答:


297

あなたは、設定する必要がありますheightのを.modal-bodyにし、それを与えますoverflow-y: auto。また、.modal-dialogオーバーフロー値をにリセットしinitialます。

実用的なサンプルをご覧ください:

http://www.bootply.com/T0yF2ZNTUd

.modal{
    display: block !important; /* I added this to see the modal, you don't need this */
}

/* Important part */
.modal-dialog{
    overflow-y: initial !important
}
.modal-body{
    height: 250px;
    overflow-y: auto;
}

これをありがとう。それは素晴らしい働きをします。CSSで私には何かがはっきりしないかもしれません。動作しないmodal-body max-height:65%を割り当ててみました。あなたが提供したソリューションは、モーダルボディに固定の高さを割り当てた場合にのみ機能します。モーダルダイアログがウィンドウの85%を占め、モーダル本体がモーダルダイアログの90%を占めると言う方法はありませんか?しかし、あなたが提供したソリューションは今のところ私のために機能します。ありがとう!
Subodh Nijsure 2014

3
@SubodhNijsure返信が遅くなってすみません。親の%を意味するため、高さを%で設定することはできません。この場合、親は.modal-contentであり、その高さは子に依存します。そのため、高さの1つを設定しないと機能しません。.modal-contentの高さを設定するか、.modal-bodyの高さを設定します。.modal-contentの高さを設定すると、.modal-bodyの高さを%で設定でき、その親の%になるため、100%未満に設定すると、下部、すべての.modal-contentの高さを埋めていないため。
Carlos Calla

CSSのinitialキーワードはEdgeでは機能しますが、Internet Explorerでは機能しません。
トリシス

18
ほんの少しのポインタ:「高さ250ピクセル」ではなく、高さが230ピクセル以下の一部の携帯電話で見苦しく見える可能性があります。または、横長のナビゲーションバーでは以下のmax-height: 80vh;ようになります。小さなポップアップです
Toskan

1
正常に動作しますが、モーダルを閉じた後、「親」ウィンドウのリンクをクリックできなくなります...次のコードで解決します:.modal .modal-body {max-height:420px; overflow-y:auto; }
cwhisperer 2016

119

IE 9以降のみをサポートしている場合は、ウィンドウのサイズにスムーズにスケーリングするこのCSSを使用できます。ただし、ヘッダーまたはフッターの高さによっては、「200px」を微調整する必要がある場合があります。

.modal-body{
    max-height: calc(100vh - 200px);
    overflow-y: auto;
}

[1]と[2]によると、これはChrome、Firefox、Safariでもサポートされています。[1] developer.mozilla.org/en-US/docs/Web/CSS/... [2] developer.mozilla.org/en-US/docs/Web/CSS/...
CTRON

注:このソリューションは、いずれかの上部または下部を参照してください作成このフィドルIを選択したオプションに依存し、ヘッダーやフッターの下でポップオーバー表示されます:jsfiddle.net/2qeo99k3/4 CSSなしではそれだけで罰金だけで見ることがフィドルでそれを取り除く働きハックうまくいく
マルク・ルーセル2017

ポップオーバーの回避策はここにあります:stackoverflow.com/questions/45666828/…–
Marc Roussel

36

@carlos callaと@jonathan marstonを組み合わせたソリューションで問題が解決しました。

    /* Important part */
.modal-dialog{
    overflow-y: initial !important
}
.modal-body{
    max-height: calc(100vh - 200px);
    overflow-y: auto;
}

20

Bootstrapバージョン> = 4.3の場合

Bootstrap 4.3では、モーダルに新しい組み込みスクロール機能が追加されました。これにより、コンテンツのサイズによってページがスクロールされる場合は、モーダルボディのコンテンツのみがスクロールされます。使用するには、modal-dialog-scrollableクラスを、modal-dialogクラスを持つ同じdivに追加するだけです。

次に例を示します。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalScrollable">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModalScrollable" tabindex="-1" role="dialog" aria-labelledby="exampleModalScrollableTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalScrollableTitle">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
        the<br>quick<br>brown<br>fox<br>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>


14

Carlos Callaの素晴らしい答えを追加します。

.modal-bodyの高さを設定する必要がありますが、メディアクエリを使用して画面サイズに適切であることを確認できます。

.modal-body{
    height: 250px;
    overflow-y: auto;
}

@media (min-height: 500px) {
    .modal-body { height: 400px; }
}

@media (min-height: 800px) {
    .modal-body { height: 600px; }
}

モバイルデバイスで高さが400ピクセル以上になると想定することは誤りです。幅を使用して高さを決定することは、現実的な解決策ではありません。これが壊れる原因となるユースケースが多すぎます。
2015

2
@Strawberry彼は実際にはmin-height(min-widthではなく)を使用し、指定された高さがメディアクエリのmin-heightよりも低くなるようにしました。さらに、メディアクエリはOPが何を達成したいかによって大きく異なるため、彼は自分の考えの例を挙げているだけです。
Carlos Calla

12

オプション:モーダルがウィンドウの高さを超えないようにし、.modal-bodyでスクロールバーを使用する場合は、このレスポンシブソリューションを使用できます。ここで動作するデモを参照してください:http : //codepen.io/dimbslmh/full/mKfCc/

function setModalMaxHeight(element) {
  this.$element     = $(element);
  this.$content     = this.$element.find('.modal-content');
  var borderWidth   = this.$content.outerHeight() - this.$content.innerHeight();
  var dialogMargin  = $(window).width() > 767 ? 60 : 20;
  var contentHeight = $(window).height() - (dialogMargin + borderWidth);
  var headerHeight  = this.$element.find('.modal-header').outerHeight() || 0;
  var footerHeight  = this.$element.find('.modal-footer').outerHeight() || 0;
  var maxHeight     = contentHeight - (headerHeight + footerHeight);

  this.$content.css({
      'overflow': 'hidden'
  });

  this.$element
    .find('.modal-body').css({
      'max-height': maxHeight,
      'overflow-y': 'auto'
  });
}

$('.modal').on('show.bs.modal', function() {
  $(this).show();
  setModalMaxHeight(this);
});

$(window).resize(function() {
  if ($('.modal.in').length != 0) {
    setModalMaxHeight($('.modal.in'));
  }
});

5

私はこれが古いトピックであることを知っていますが、これは他の誰かを助けるかもしれません。

モーダルダイアログエレメントの位置を固定することで、本体をスクロールさせることができました。また、ブラウザーウィンドウの正確な高さは決してわからないので、ヘッダーとフッターの高さを確認しました。その後、モーダルボディ要素の上下の余白をこれらの高さに合わせることができました。これにより、私が探していた結果が得られました。私は自分の作品を示すためにフィドルを一緒に投げました。

また、全画面ダイアログが必要な場合は、width:autoのコメントを外してください。.modal-dialog.full-screenセクション内。

https://jsfiddle.net/lot224/znrktLej/

そして、これが、ブートストラップダイアログを変更するために使用したcssです。

.modal-dialog.full-screen {
    position:fixed;
    //width:auto;  // uncomment to make the width based on the left/right attributes.
    margin:auto;                        
    left:0px;
    right:0px;
    top:0px;
    bottom:0px;
}

.modal-dialog.full-screen .modal-content {
      position:absolute;
      left:10px;
      right:10px;
      top:10px;
      bottom:10px;
}

.modal-dialog.full-screen .modal-content .modal-header {
        height:55px;  // adjust as needed.
}

.modal-dialog.full-screen .modal-content .modal-body {
        overflow-y: auto;
          position: absolute;
          top: 0;
          bottom: 0;
        left:0;
        right:0;
          margin-top: 55px; // .modal-header height
          margin-bottom: 80px;  // .modal-footer height
}

.modal-dialog.full-screen .modal-content .modal-footer {
        height:80px;  // adjust as needed.
        position:absolute;
        bottom:0;
        left:0;
        right:0;
}

5

あるいは、最初にタグの間に置き、次にcssクラスに置くこともできます。

<div style="height: 35px;overflow-y: auto;"> Some text o othre div scroll </div>

1
#scroll-wrap {
    max-height: 50vh;
    overflow-y: auto;
}

max-heightwith vhのユニットmodal-bodyまたは内のラッパーdiv として使用しmodal-bodyます。これによりmodal-body、ユーザーがウィンドウのサイズを変更すると、(この例では)ラッピングdivの高さが自動的に変更されます。

vh ビューポートの高さのビューポートサイズの1%を表す長さの単位です。

vhユニットのブラウザ互換性チャート。

例:https : //jsfiddle.net/q3xwr53f/


1

私のために働いたのは、高さを100%に設定することです。

   <div style="height: 100%;overflow-y: auto;"> Some text o othre div scroll </div>

0

ボディの高さに比例してモーダル高さを設定する簡単なjsソリューション:

$(document).ready(function () {
    $('head').append('<style type="text/css">.modal .modal-body {max-height: ' + ($('body').height() * .8) + 'px;overflow-y: auto;}.modal-open .modal{overflow-y: hidden !important;}</style>');
});

ボディの高さは100%でなければなりません:

html, body {
    height: 100%;
    min-height: 100%;
}

モーダルボディの高さをボディの80%に設定しましたが、これはもちろんカスタマイズできます。

それが役に立てば幸い。


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