ブートストラップ3モーダル垂直位置センター


270

これは2つの部分からなる質問です。

  1. モーダルの正確な高さがわからないときに、モーダルを垂直に中央に配置するにはどうすればよいですか?

  2. モーダルを中央に配置し、モーダル本体にoverflow:autoを含めることは可能ですか?ただし、モーダルが画面の高さを超えている場合のみですか?

私はこれを使ってみました:

.modal-dialog {
  height: 80% !important;
  padding-top:10%;
}

.modal-content {
  height: 100% !important;
  overflow:visible;
}

.modal-body {
  height: 80%;
  overflow: auto;
}

これにより、コンテンツが垂直画面サイズよりもはるかに大きい場合に必要な結果が得られますが、小さなモーダルコンテンツの場合は、ほとんど使用できません。


1
@Heiken何らかの理由で画面上にジャンプします
。Imは

回答:


374
.modal {
  text-align: center;
}

@media screen and (min-width: 768px) { 
  .modal:before {
    display: inline-block;
    vertical-align: middle;
    content: " ";
    height: 100%;
  }
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

少し.fadeクラスを調整して、中央ではなくウィンドウの上部の境界から外れるようにします。


実際には裏で動作していることを指摘してくれてありがとうございます。
ドリアン

これはおそらく、ブートストラップモーダルだけでなく、その他すべてを垂直方向に中央揃えするための最良の方法です。css-tricks.com/centering-in-the-unknown
マークS

4
これはモバイルではうまく機能しないことを明確にします。「:後」の定義の高さは100%であり、モーダルを自動的にページの下に移動できるためです。.modal {display:flex!重要;} .modal-dialog {margin:auto}。すでに92.97%の人がこのCSSプロパティの使用をサポートしていますが、一般的なサポートではJavaScriptを使用してマージンを設定できます。
Walter Chapilliquen-wZVanG 2015

21
絶対に素晴らしいですが、768px以上でのみ使用し、モバイルではデフォルト設定のままにしておくことをお勧めします。画面の高さが小さい場合、上部の位置はモーダルに最適です。また、中央から表示されるようにアニメーションを調整しました。ここでは、誰かが必要な場合の作業例を示します。codepen.io
anon

このソリューションは、モーダルウィンドウを2px右にシフトし、:before要素を発生させます。しかし、これは:afterの同じコードを追加することで解決できます
Cypher

146

1.モーダルの正確な高さがわからない場合、モーダルを垂直方向の中央に配置するにはどうすればよいですか?

高さを宣言せずにBootstrap 3 Modalを完全に中央に配置するには、最初にこれをスタイルシートに追加してBootstrap CSSを上書きする必要があります。

.modal-dialog-center { /* Edited classname 10/03/2014 */
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
}

これにより、モーダルダイアログの左上隅がウィンドウの中央に配置されます。

このメディアクエリを追加する必要があります。そうしないと、モーダルマージンレフトが小さなデバイスで間違っています。

@media (max-width: 767px) {
  .modal-dialog-center { /* Edited classname 10/03/2014 */
    width: 100%;
  }
} 

次に、JavaScriptで位置を調整する必要があります。そのためには、要素の高さと幅の半分に等しい負の上マージンと左マージンを要素に与えます。この例では、Bootstrapで使用できるため、jQueryを使用します。

$('.modal').on('shown.bs.modal', function() {
    $(this).find('.modal-dialog').css({
        'margin-top': function () {
            return -($(this).outerHeight() / 2);
        },
        'margin-left': function () {
            return -($(this).outerWidth() / 2);
        }
    });
});

アップデート(2015年1月10日):

Finikの答えを追加不明のセンタリングへのクレジット。

.modal {
  text-align: center;
  padding: 0!important;
}

.modal:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -4px; /* Adjusts for spacing */
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

負のマージン右に注意してください?これにより、インラインブロックによって追加されたスペースが削除されます。そのスペースにより、モーダルはページの下部に移動します@media width <768px。

2.モーダルを中央に配置し、モーダル本体にオーバーフロー:自動を設定することはできますか?ただし、モーダルが画面の高さを超えている場合のみですか?

これは、モーダル本体にオーバーフロー-y:autoと最大高さを与えることで可能になります。これを適切に機能させるには、もう少し作業が必要です。これをスタイルシートに追加することから始めます。

.modal-body {
    overflow-y: auto;
}
.modal-footer {
    margin-top: 0;
}

再びjQueryを使用してウィンドウの高さを取得し、最初にモーダルコンテンツの最大高さを設定します。次に、modal-contentをmodal-headerおよびmodal-footerで差し引くことにより、modal-bodyのmax-heightを設定する必要があります。

$('.modal').on('shown.bs.modal', function() {
    var contentHeight = $(window).height() - 60;
    var headerHeight = $(this).find('.modal-header').outerHeight() || 2;
    var footerHeight = $(this).find('.modal-footer').outerHeight() || 2;

    $(this).find('.modal-content').css({
        'max-height': function () {
            return contentHeight;
        }
    });

    $(this).find('.modal-body').css({
        'max-height': function () {
            return (contentHeight - (headerHeight + footerHeight));
        }
    });

    $(this).find('.modal-dialog').css({
        'margin-top': function () {
            return -($(this).outerHeight() / 2);
        },
        'margin-left': function () {
            return -($(this).outerWidth() / 2);
        }
    });
});

Bootstrap 3.0.3を使用すると、動作するデモを見つけることができます。http//cdpn.io/GwvrJ 編集:私は、より応答性の解決のために代わりに更新されたバージョンを使用することをお勧め:http://cdpn.io/mKfCc

アップデート(2015/11/30):

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() < 768 ? 20 : 60;
  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'));
  }
});

(2015年11月30日更新http://cdpn.io/mKfCc上記の編集)


1
素晴らしい答えと投稿!ただし、これもアニメーション化できますか?ポップインするだけでうまくいきますが、アニメーションについてはどうですか?私は仕事中でatmをテストすることはできませんが、結果を確認したいと思っています
scooterlord

モーダルにフェードクラスを追加できます。cdpn.io/mKfCcで
dimbslmh

コードペンでうまく機能しているように見えますが、プロジェクトで機能させることはできません。コードを追加するだけで、何かを置き換える必要がないと思いますか?
scooterlord 2014年

1
やあまた会ったね!次のことに気づきました。最初のモーダルが最初に開いたとき、一度サイズを変更するまで、右マージンが間違っています。これについてのアイデアはありますか?
スクーターロード2014年

1
@bernie私はdocument.ready:browserstack.com/screenshots/…で短いモーダルが開いているcodepenのフォークを使用してBrowserstackでスクリーンショットを作成しましたが、Browserstackは(まだ)スクリーンショット用のv9.3.xをサポートしていませんが、あなたが説明したものと同様のものがiOS 6.0で発生します(スクリーンショットiPad 3rd(6.0)(Portrait)を参照)。おそらくそれはv9.3.2で戻ってきた古いバグでしょう。必要に応じて
community /

37

私の解決策

.modal-dialog-center {
    margin-top: 25%;
}

    <div id="waitForm" class="modal">
        <div class="modal-dialog modal-dialog-center">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                    <h4 id="headerBlock" class="modal-title"></h4>
                </div>
                <div class="modal-body">
                    <span id="bodyBlock"></span>
                    <br/>
                    <p style="text-align: center">
                        <img src="@Url.Content("~/Content/images/progress-loader.gif")" alt="progress"/>
                    </p>   
                </div>
            </div>
        </div>
    </div>

あなたはパディングトップを使用する必要があります。マージンをクリックすると、オーバーレイをクリックすると閉じるアクションが中断されます
anvd

2
マージンの上部を25%に設定するには、モーダルの高さを50%にする必要があります。
反乱

28

簡単に修正できます display: flex

.modal-dialog {
  margin-top: 0;
  margin-bottom: 0;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.modal.fade .modal-dialog {
  transform: translate(0, -100%);
}

.modal.in .modal-dialog {
  transform: translate(0, 0);
}

接頭辞付き

.modal-dialog {
  margin-top: 0;
  margin-bottom: 0;
  height: 100vh;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
}

.modal.fade .modal-dialog {
  -webkit-transform: translate(0, -100%);
          transform: translate(0, -100%);
}
.modal.in .modal-dialog {
  -webkit-transform: translate(0, 0);
          transform: translate(0, 0);
}

2
これにより、100vhの高さのために背景がクリックされるのを防ぎます。「背景:「静的」」設定で問題ありません。
ianstigator 2016年

これにより、アニメーションの問題がフェードアウトします
Viswanath Lekshmanan 2017

23

私は純粋なCSSソリューションを思いつきました!それはcss3ですが、ie8以下はサポートされていませんが、これ以外はios、android、ie9 +、chrome、firefox、デスクトップサファリで動作しています。

私は次のcssを使用しています:

.modal-dialog {
  position:absolute;
  top:50% !important;
  transform: translate(0, -50%) !important;
  -ms-transform: translate(0, -50%) !important;
  -webkit-transform: translate(0, -50%) !important;
  margin:auto 5%;
  width:90%;
  height:80%;
}
.modal-content {
  min-height:100%;
  position:absolute;
  top:0;
  bottom:0;
  left:0;
  right:0; 
}
.modal-body {
  position:absolute;
  top:45px; /** height of header **/
  bottom:45px;  /** height of footer **/
  left:0;
  right:0;
  overflow-y:auto;
}
.modal-footer {
  position:absolute;
  bottom:0;
  left:0;
  right:0;
}

ここにフィドルがあります。 http://codepen.io/anon/pen/Hiskj

..これが正解として選択されているのは、複数のモーダルの場合にブラウザをひどく痛めるJavaScriptが余分にないためです。


8
JavaScriptを使用する全体のポイントは、モーダルの未知の高さを取得することでした。ソリューションの固定高さは80%ですが、これはあなた自身の質問に答えません。「モーダルの正確な高さがわからないときに、モーダルを中央に垂直に配置するにはどうすればよいですか?」
dimbslmh 2014

...高さ寸法は、画面の高さと比較して最大のモーダル高さを制限するように設定されています。ただし、翻訳のパーセンテージは、コンテンツの高さに応じて設定されます。
scooterlord 2014

3
あなたはモーダルボックスのサイズを変更しない解決策を取得したい場合は、同様に以下のCSSの解決方法を試してください:tweaks.klickagent.ch/#30.05.2014_TwitterBootstrapCenterModal
klickagent.ch

とても素敵です。しかし、それは私が説明しているものとは異なるアプローチを持っています。あなたの場合、モーダル全体が上下に移動しますが、私の場合、オーバーフローした要素が作成されます。とても素敵です!私はそれが好きです!
scooterlord 2014年

これは、高さを設定する必要があります。これは、ユーザーが要求するものとまったく同じではありません。
反乱

21

フレックスボックスの使用に問題がなければ、これが解決に役立つはずです。

.modal-dialog {
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
}

.modal-content {
  margin: 0 auto;
}

7
私はこの答えが私にとってうまくいくことを発見しました。あなたは、ユーザーがそれの背景をクリックすると、モーダルを閉じるようにしたい場合は、追加してくださいpointer-events: none.modal-dialogしてpointer-events: autoまで.modal-content。Becausuは.modal-dialog {height: 100%}、モーダルの上と下の列全体をカバーし、ユーザーがその領域の背景をクリックできないようにします。
2015年

@ChingTingWuからの提案と組み合わせて、最も効果的
ストライダー

そして、@ ChingTingWuの提案はどこにありますか?
giovannipds

1
ChingTingWuは@wuctに変更があるようです
xiaolin

1
@giovannipdsおっと、短くてタグ付けしやすいので、ユーザー名を変更しました。混乱して
しまい

20

私の解決策:

.modal.in .modal-dialog 
{
    -webkit-transform: translate(0, calc(50vh - 50%));
    -ms-transform: translate(0, 50vh) translate(0, -50%);
    -o-transform: translate(0, calc(50vh - 50%));
    transform: translate(0, 50vh) translate(0, -50%);
}

これはBootstrap 3で完全に動作するようです。なぜこれが受け入れられた答えではないのですか?他のものよりもはるかに単純です(4 CSSディレクティブ)。
danielricecodes 2017

@danielricecodes ビューポートユニットの問題が原因であると思います。。scooterlordによる提案された回答は、IE9およびiOとの互換性を提案しました。canIuseの問題ページを確認すると、iOおよびIE10以前に問題があることがわかります。私が同意するかどうか、これが正しい答えであるかどうかではありません。なぜ私はちょうど指摘しています多分これが答えとして選択されていません。
Malavos、2018年

1
このアプローチには、モーダルにスクロール可能なコンテンツ(ウィンドウに収まるよりも多くのコンテンツ)がある場合に問題があります
Steven Pribilinskiy

これは受け入れられる答えになるはずです。これまでのところ、これが私にとって有効な唯一の解決策です。これをありがとう。
紫府

これは、モーダルコンテンツが画面の高さより大きい場合(モーダルをスクロールする必要がある場合)は機能しません
Brett Gregson '30

18

私の場合に行ったことはすべて、モーダルの高さを知っているCSSにトップを設定することです

<div id="myModal" class="modal fade"> ... </div>

私のCSSで私は設定しました

#myModal{
    height: 400px;
    top: calc(50% - 200px) !important;
}

1
cssの初心者として、この回答は最も恐ろしいものではなく、仕事を
成し遂げ

2
これは質問の最初の部分には答えません。「モーダルの正確な高さがわからないときは?」
natec

15

この単純なcssを追加することもできます。

.modal-dialog {
  height: 100vh !important;
  display: flex;
}

.modal-content {
  margin: auto !important;
  height: fit-content !important;
}

fit-contentとは何ですか?
Marc Roussel

12

CSSを使用してこれを行う最も簡単な方法があります:

.modal-dialog {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
    width:500px;
    height:300px;
}

それでおしまい。のみに適用する必要があることに注意してください.modal-dialogコンテナーdivに。

デモ:https : //jsfiddle.net/darioferrer/0ueu4dmy/


7
幅と高さが固定されているため、モバイルでは応答しません。
ianstigator

あなたの答えは、すべてのデバイスの画面解像度が同じであることを前提としています
Patricio Rossi

誰も〜ない。あなたはこの例を理解していて、あなたはそれをそれぞれのケースに適応させることができると思います。
Dario Ferrer 2017

Bootstrap v3.3.0の実行に成功しました。ありがとう
Amin Ghaderi 2018年

11

@Finikの優れた答えを拡張して、この修正は非モバイルデバイスにのみ適用されます。IE8、Chrome、Firefox 22でテストしました-非常に長いまたは短いコンテンツで動作します。

.modal {
  text-align: center;
}
@media screen and (min-device-width: 768px) {
  .modal:before {
    display: inline-block;
    vertical-align: middle;
    content: " ";
    height: 100%;
  }
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

8

私が書いた最も普遍的なソリューション。ダイアログの高さを動的に計算します。(次のステップは、ウィンドウのサイズ変更時のダイアログの高さの再計算です。)

JSfiddle:http ://jsfiddle.net/8Fvg9/3/

// initialise on document ready
jQuery(document).ready(function ($) {
    'use strict';

    // CENTERED MODALS
    // phase one - store every dialog's height
    $('.modal').each(function () {
        var t = $(this),
            d = t.find('.modal-dialog'),
            fadeClass = (t.is('.fade') ? 'fade' : '');
        // render dialog
        t.removeClass('fade')
            .addClass('invisible')
            .css('display', 'block');
        // read and store dialog height
        d.data('height', d.height());
        // hide dialog again
        t.css('display', '')
            .removeClass('invisible')
            .addClass(fadeClass);
    });
    // phase two - set margin-top on every dialog show
    $('.modal').on('show.bs.modal', function () {
        var t = $(this),
            d = t.find('.modal-dialog'),
            dh = d.data('height'),
            w = $(window).width(),
            h = $(window).height();
        // if it is desktop & dialog is lower than viewport
        // (set your own values)
        if (w > 380 && (dh + 60) < h) {
            d.css('margin-top', Math.round(0.96 * (h - dh) / 2));
        } else {
            d.css('margin-top', '');
        }
    });

});

7

ここから完璧なソリューションを見つけました

$(function() {
    function reposition() {
        var modal = $(this),
            dialog = modal.find('.modal-dialog');
        modal.css('display', 'block');

        // Dividing by two centers the modal exactly, but dividing by three 
        // or four works better for larger screens.
        dialog.css("margin-top", Math.max(0, ($(window).height() - dialog.height()) / 2));
    }
    // Reposition when a modal is shown
    $('.modal').on('show.bs.modal', reposition);
    // Reposition when the window is resized
    $(window).on('resize', function() {
        $('.modal:visible').each(reposition);
    });
});

1
ありがとうございました。1つの変更で完璧です:dialog.css( "margin-top"、Math.max(0、($(document).scrollTop()+(($(window).height()-dialog.height()) / 2))));
Viacheslav Soldatov

4
$('#myModal').on('shown.bs.modal', function() {
    var initModalHeight = $('#modal-dialog').outerHeight(); //give an id to .mobile-dialog
    var userScreenHeight = $(document).outerHeight();
    if (initModalHeight > userScreenHeight) {
        $('#modal-dialog').css('overflow', 'auto'); //set to overflow if no fit
    } else {
        $('#modal-dialog').css('margin-top', 
        (userScreenHeight / 2) - (initModalHeight/2)); //center it if it does fit
    }
});

セレクターにいくつかの調整を加えると、これは魅力のように機能しました。@$modal = $('.fade.in'); modalBox = @$modal.find('.modal-content'); initModalHeight = modalBox.outerHeight(); userScreenHeight = @$modal.outerHeight()
juliangonzalez

4

これはかなりうまく機能し、これに基づいている他のcssのみのメソッドです:http : //zerosixthree.se/vertical-align-anything-with-just-3-lines-of-css/

sass:

.modal {
    height: 100%;

    .modal-dialog {
        top: 50% !important;
        margin-top:0;
        margin-bottom:0;
    }

    //keep proper transitions on fade in
    &.fade .modal-dialog {
        transform: translateY(-100%) !important;
    }
    &.in .modal-dialog {
        transform: translateY(-50%) !important;
    }
}

他のtransformソリューションと同様に、モーダルにスクロール可能なコンテンツ(ウィンドウに収まるよりも多くのコンテンツ)がある場合に問題が発生します
Steven Pribilinskiy

3

怒鳴るリンクからbootstrap3-dialogをダウンロードし、bootstrap-dialog.jsのopen関数を変更しました

https://github.com/nakupanda/bootstrap3-dialog

コード

open: function () {
            !this.isRealized() && this.realize();
            this.updateClosable();
            //Custom To Vertically centering Bootstrap 
            var $mymodal = this.getModal();
            $mymodal = $mymodal.append('<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%"><tr><td align="center" valign="middle" class="centerModal"></td></tr></table>');
            $mymodal = $mymodal.find(".modal-dialog").appendTo($mymodal.find(".centerModal"));
            //END
            this.getModal().modal('show');
            return this;
        }

CSS

.centerModal .modal-header{
    text-align:left;
}
.centerModal .modal-body{
    text-align:left;
} 

:ここでは、元のBSDialogソースを変更することなく、独自のコードに適用することができます修正ですgist.github.com/mahemoff/8ff6d3782d2da6f9cbb3(JSにちょうどいくつかの変更は、また、それはコーヒーで書かれていますが、アイデアを得ます)。
mahemoff 2014年

3

これは私にとってはうまくいきます:

.modal {
  text-align: center;
  padding: 0!important;
}

.modal:before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -4px;
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

2

このようなものを試してください:

.popup__overlay {
    position: fixed;
    left:  0;
    top:  0;
    width: 100%;
    height: 100%;
    z-index: 999;
    text-align: center
    }
.popup {
    display: inline-block;
    vertical-align: middle
    } 

1
これはかなりうまくいくかもしれませんが、ブートストラップモーダルには絶対、固定、内部、およびその内部があります...:/
scooterlord

1
これらのクラスはBootstrap / Bootstrapモーダルとどのように関係していますか?
lofihelsinki

1

あなたはdivの絶対的なセンタリングのためのこのメソッドのコレクションをチェックしたいかもしれません:http : //codepen.io/shshaw/full/gEiDt


1
うーん、それは私が探しているものではない高さを宣言する必要があると警告に書かれています
scooterlord

1

簡単な方法。私のために働きます。Thks rensdenobel :) http://jsfiddle.net/rensdenobel/sRmLV/13/

<style>
.vertical-alignment-helper {
    display:table;
    height: 100%;
    width: 100%;
}
.vertical-align-center {
    /* To center vertically */
    display: table-cell;
    vertical-align: middle;
}
.modal-content {
    /* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
    width:inherit;
    height:inherit;
    /* To center horizontally */
    margin: 0 auto;
}
</style>
<!-- Button trigger modal -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">Launch demo modal</button>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="vertical-alignment-helper">
        <div class="modal-dialog vertical-align-center">
            <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" id="myModalLabel">Modal title</h4>

                </div>
                <div class="modal-body">...</div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <button type="button" class="btn btn-primary">Save changes</button>
                </div>
            </div>
        </div>
    </div>
</div>    

1

window.resizeイベントおよびonの各表示モーダルに有効な位置を設定するさらに別のソリューションshow.bs.modal

(function ($) {
    "use strict";
    function centerModal() {
        $(this).css('display', 'block');
        var $dialog  = $(this).find(".modal-dialog"),
            offset       = ($(window).height() - $dialog.height()) / 2,
            bottomMargin = parseInt($dialog.css('marginBottom'), 10);

        // Make sure you don't hide the top part of the modal w/ a negative margin if it's longer than the screen height, and keep the margin equal to the bottom margin of the modal
        if(offset < bottomMargin) offset = bottomMargin;
        $dialog.css("margin-top", offset);
    }

    $(document).on('show.bs.modal', '.modal', centerModal);
    $(window).on("resize", function () {
        $('.modal:visible').each(centerModal);

    });
})(jQuery);

1
var modalVerticalCenterClass = ".modal";
function centerModals($element) {
    var $modals;
    if ($element.length) {
        $modals = $element;
    } else {
        $modals = $(modalVerticalCenterClass + ':visible');
    }
    $modals.each( function(i) {
        var $clone = $(this).clone().css('display', 'block').appendTo('body');
        var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2);
        top = top > 0 ? top : 0;
        $clone.remove();
        $(this).find('.modal-content').css("margin-top", top);
    });
}
$(modalVerticalCenterClass).on('show.bs.modal', function(e) {
    centerModals($(this));
});
$(window).on('resize', centerModals);

1

少し遅れていることは承知していますが、群衆の中で迷子にならないように、新しい回答を追加しています。あらゆる場所で適切に機能する、クロスデスクトップモバイルブラウザーソリューションです。

それはちょうど必要modal-dialog内にラップされるmodal-dialog-wrapクラスと次のコードの追加が必要です。

.modal-dialog-wrap {
  display: table;
  table-layout: fixed;
  width: 100%;
  height: 100%;
}

.modal-dialog {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}

.modal-content {
  display: inline-block;
  text-align: left;
}

ダイアログは中央揃えで始まり、コンテンツが大きい場合は、スクロールバーが表示されるまで垂直方向に拡大します。

ここにあなたの喜びのための作業フィドルがあります!

https://jsfiddle.net/v6u82mvu/1/


1

これはかなり古く、特にBootstrap 3を使用した解決策を求めていますが、疑問に思う人のために:Bootstrap 4以降には、という組み込みの解決策があり.modal-dialog-centeredます。ここに問題があります:https : //github.com/twbs/bootstrap/issues/23638

したがって、v4を使用する.modal-dialog-centered.modal-dialogは、モーダルを垂直方向に中央揃えするために追加する必要があります。

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalCenterTitle">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">
        ...
      </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>

0

ここにあるbootstrap-modalプラグインの使用を検討してください-https://github.com/jschr/bootstrap-modal

プラグインはすべてのモーダルを中央に配置します


...残念ながら私はそれを試しましたが、少なくともMYコードでは正しく機能しませんでした。誰もが彼のニーズに合わせてこれをカスタマイズする必要があると思います!返信ありがとうございます。
スクーターロード2014

0

センタリングについては、過度に複雑なソリューションでは何が得られるのかわかりません。ブートストラップはすでに水平方向に中央に配置しているので、これをいじる必要はありません。私のソリューションは、jQueryのみを使用して上マージンを設定するだけです。

$('#myModal').on('loaded.bs.modal', function() {
    $(this).find('.modal-dialog').css({
        'margin-top': function () {
            return (($(window).outerHeight() / 2) - ($(this).outerHeight() / 2));
        }
    });
});

コンテンツをリモートでロードしているときに、loaded.bs.modalイベントを使用しました。showned.ba.modalイベントを使用すると、高さの計算が正しく行われません。もちろん、ウィンドウをレスポンシブにする必要がある場合は、ウィンドウのサイズを変更するイベントを追加できます。


モーダルが十分に大きい場合、問題が発生する可能性があります
scooterlord

0

この概念を達成するための非常に非常に簡単な方法であり、次のようにcssによって常に画面のモドルにモーダルを取得します: http

あなたはmodalCSSに従ってテーブルとして表示をクラス化する必要があります:

display:table

そして modal-dialogなどdisplay:table-cell

与えられたフィドルで完全な動作例を見る


モーダルがまったく表示され
ません

私が(Google Chromeで)目にするのは、赤い十字アイコンと背景だけです
ThaDafinser

モーダルにウィンドウに収まるよりも多くのコンテンツがある場合は、スクロールバーではありません
Steven Pribilinskiy 2018

0

それほど複雑ではありません。

これを試してください:

$(document).ready(function(){
    var modalId = "#myModal";
    resize: function(){
            var new_margin = Math.ceil(($(window).height() - $(modalId).find('.modal-dialog').height()) / 2);
            $(modalId).find('.modal-dialog').css('margin-top', new_margin + 'px');
    }
    $(window).resize(function(){
        resize();
    });
    $(modalId).on('shown.bs.modal', function(){
        resize();
    });
});

0

モーダルを中央揃えするこの単純なスクリプトを使用します。

必要に応じて、カスタムクラス(例:.modalではなく.modal.modal-vcenter)を設定して、機能を一部のモーダルのみに制限できます。

var modalVerticalCenterClass = ".modal";

function centerModals($element) {
    var $modals;
    if ($element.length) {
    $modals = $element;
    } else {
    $modals = $(modalVerticalCenterClass + ':visible');
}
$modals.each( function(i) {
    var $clone = $(this).clone().css('display', 'block').appendTo('body');
    var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2);
    top = top > 0 ? top : 0;
    $clone.remove();
    $(this).find('.modal-content').css("margin-top", top);
    });
}
$(modalVerticalCenterClass).on('show.bs.modal', function(e) {
    centerModals($(this));
});
$(window).on('resize', centerModals);

また、モーダルの水平方向の間隔にこのCSS修正を追加します。モーダルにスクロールを表示します。本体のスクロールはBootstrapによって自動的に非表示になります。

/* scroll fixes */
.modal-open .modal {
    padding-left: 0px !important;
    padding-right: 0px !important;
    overflow-y: scroll;
}

0

モバイルのプラントフォームでは少し違って見えるかもしれませんが、これが私のコードです。

<div class="modal-container">
  <style>
  .modal-dialog{
    margin-top: 60%;
    width:80%;
    margin-left: 10%;
    margin-right: 10%;
    margin-bottom: 100%
  }
  @media screen and (orientation:landscape){
    .modal-dialog{
      margin-top: 70;
      width:80%;
      margin-left: 10%;
      margin-right: 10%;
      margin-bottom: 100%
    }
  }
  .modal-body{
    text-align: center;
  }
  .modal-body p{
    margin:14px 0px;
    font-size: 110%;
  }
  .modal-content{
    border-radius: 10px;
  }
  .modal-footer{
    padding:0px;
  }
  .modal-footer a{
    padding: 15px;
  }
  .modal-footer a:nth-child(1){
    border-radius: 0px 0px 0px 10px;
  }
  .modal-footer a:nth-child(2){
    border-radius: 0px 0px 10px 0px;
  }
  </style>
  <h2>Basic Modal Example</h2>
  <div data-toggle="modal" data-target="#myModal">Div for modal</div>
    <div class="modal fade" id="myModal" role="dialog">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-body">
            <p>确定要取消本次订单嘛?</p>
          </div>
          <div class="modal-footer">
            <div class="btn-group btn-group-justified">
              <a href="#" class="btn btn-default" data-dismiss="modal">取消</a>
              <a href="#" class="btn btn-default" data-dismiss="modal">确定</a>
            </div>
          </div>
        </div>
      </div>
    </div>
</div>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.