Bootstrap 3模态垂直位置中心

sco*_*ord 261 css center modal-dialog twitter-bootstrap

这是一个两部分问题:

  1. 当您不知道模态的确切高度时,如何将模态垂直放置在中心?

  2. 是否有可能让模态居中并且在模态体中有溢出:auto,但仅当模态超过屏幕高度时?

我试过用这个:

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

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

.modal-body {
  height: 80%;
  overflow: auto;
}
Run Code Online (Sandbox Code Playgroud)

当内容比垂直屏幕尺寸大得多时,这给了我所需的结果,但对于小模态内容,它几乎无法使用.

小智 367

.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;
}
Run Code Online (Sandbox Code Playgroud)

并调整一点.fade类,以确保它出现在窗口的顶部边框之外,而不是中心

  • 非常好,但我建议仅在768px以上使用它并在移动设备上保留默认设置.当屏幕高度较小时,顶部位置最适合模态.我还调整了一个动画,让它从中心出现,这里有工作示例,如果有人需要它:http://codepen.io/anon/pen/zGBpNq (20认同)
  • 我澄清一点,这在移动设备上效果不佳.因为定义":after"具有100%的高度并且可以自动将模态移动到页面的下方.我刚刚解决了声明.modal {display:flex!重要的;} .modal-dialog {margin:auto}.92.97%的人已经拥有使用此CSS属性的支持,但是对于一般suporte可以使用JavaScript来设置边距. (3认同)

dim*_*lmh 141

1.当您不知道模态的确切高度时,如何将模态垂直放置在中心?

要在不声明高度的情况下绝对居中Bootstrap 3 Modal,首先需要通过将其添加到样式表来覆盖Bootstrap CSS:

.modal-dialog-center { /* Edited classname 10/03/2014 */
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
}
Run Code Online (Sandbox Code Playgroud)

这会将模态对话框的左上角定位在窗口的中心.

我们必须添加此媒体查询,否则模式margin-left在小型设备上是错误的:

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

现在我们需要用JavaScript调整它的位置.为此,我们给元素一个负的顶部和左边距等于其高度和宽度的一半.在这个例子中,我们将使用jQuery,因为它可以与Bootstrap一起使用.

$('.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);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

更新(2015年10月1日):

添加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;
}
Run Code Online (Sandbox Code Playgroud)

注意负边际权利?这将删除内联块添加的空间.该空间导致模态跳转到页面底部@media width <768px.

2.是否可以使模态居中并且在模态体中具有溢出:自动,但仅当模态超过屏幕高度时?

这可以通过给模态体提供overflow-y:auto和max-height来实现.这需要更多的工作才能使其正常工作.首先将其添加到样式表中:

.modal-body {
    overflow-y: auto;
}
.modal-footer {
    margin-top: 0;
}
Run Code Online (Sandbox Code Playgroud)

我们将再次使用jQuery来获取窗口高度并首先设置模态内容的最大高度.然后我们必须通过使用modal-header和modal-footer减去模态内容来设置模态体的最大高度:

$('.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);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到一个使用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'));
  }
});
Run Code Online (Sandbox Code Playgroud)

(2015年3月30日更新http://cdpn.io/mKfCc以上编辑)


Bri*_*kim 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>
Run Code Online (Sandbox Code Playgroud)

  • 边距顶部设置为 25% 要求模态高度为 50%。 (3认同)

Mo.*_*Mo. 25

它可以简单地修复 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);
}
Run Code Online (Sandbox Code Playgroud)

带前缀

.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);
}
Run Code Online (Sandbox Code Playgroud)

  • 由于 100vh 高度,这可以防止背景被点击。“背景:'静态'”设置很好。 (2认同)

sco*_*ord 21

我想出了一个纯粹的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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴. http://codepen.io/anon/pen/Hiskj

..选择这个作为正确的答案,因为没有额外的重javascript,如果有多个模态,浏览器就会瘫痪.

  • 使用JavaScript的全部意义在于获得模态的**未知**高度.你的解决方案有一个80%的固定高度,它没有回答你自己的问题:"当你不知道模态**的确切高度时,如何将模态垂直放置在中心?" (7认同)
  • 如果您想获得一个不会改变模态框大小的解决方案,请尝试以下css解决方案:http://tweaks.klickagent.ch/#30.05.2014_TwitterBootstrapCenterModal (3认同)

xia*_*lin 19

如果您对使用flexbox没问题,那么这应该有助于解决它.

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

.modal-content {
  margin: 0 auto;
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个答案对我很有用.但是,如果要让用户通过单击它的背景来关闭模式,请确保将`pointer-events:none`添加到`.modal-dialog`并将`pointer-events:auto`添加到`.modal-content`.Becausu` .modal-dialog {height:100%}`覆盖模态上方和下方的整列,并禁止用户单击该区域的背景. (6认同)

Vad*_*dim 19

我的解决方案

.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%);
}
Run Code Online (Sandbox Code Playgroud)


Moe*_*oes 16

在我的例子中,我所做的就是在知道模态高度的情况下设置我的CSS中的Top

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

在我的CSS我设置

#myModal{
    height: 400px;
    top: calc(50% - 200px) !important;
}
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答问题的第一部分:“..当你不知道模态的确切高度时?” (2认同)

roo*_*oo2 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;
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*rer 11

使用css有一种最简单的方法:

.modal-dialog {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
    width:500px;
    height:300px;
}
Run Code Online (Sandbox Code Playgroud)

而已.请注意,它只需要应用于.modal-dialog容器div.

演示:https://jsfiddle.net/darioferrer/0ueu4dmy/

  • 由于固定的宽度和高度,在移动设备上没有响应. (7认同)

小智 8

我写的最通用的解决方案.Dynamicaly计算对话框高度.(下一步可能是在窗口调整大小时重新计算对话框的高度.)

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', '');
        }
    });

});
Run Code Online (Sandbox Code Playgroud)


Tob*_*old 7

这是相当古老的,特别要求使用 Bootstrap 3 的解决方案,但对于任何想知道的人:从 Bootstrap 4 开始,有一个名为 的内置解决方案.modal-dialog-centered。这是问题:https://github.com/twbs/bootstrap/issues/23638

因此,使用 v4 你只需添加.modal-dialog-centeredto即可.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>
Run Code Online (Sandbox Code Playgroud)

演示


Nin*_*420 7

添加此简单的CSS也可以。

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

.modal-content {
  margin: auto !important;
  height: fit-content !important;
}
Run Code Online (Sandbox Code Playgroud)


Ism*_*ooq 6

这里找到完美的解决方案

$(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);
    });
});
Run Code Online (Sandbox Code Playgroud)