如何垂直居中模态框?

19

我想要在页面中垂直居中一个弹窗。我在谷歌上搜索过很多资料,但都没有找到有用的东西。这是我的代码:

 function inactive(id, ths) {
   $("#confirmation").modal("show");
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="modal fade bs-example-modal-sm" id="confirmation" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
  <div class="modal-dialog modal-sm" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
        </button>
        <h4 class="modal-title">Are you sure you want to inactivate it?</h4>
      </div>
      <div class="modal-body">
        <div class="form-group">
          <input type="text" class="form-control" name="captcha" id="cval" placeholder="enter captcha">
        </div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
        <button type="button" class="btn btn-primary" id="yes">Yes</button>
      </div>
    </div>
  </div>
</div>

如何垂直居中?


模态框出现在屏幕的哪个位置? - rhinosforhire
在顶部,我的导航栏覆盖了模态框。 - Rushabh Shah
点击事件中尝试检查ID。 - brk
8个回答

42

未经测试,但你可以尝试这样做。

.yourElement{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

如何检查哪个按钮被点击了? - Rushabh Shah
3
如果模态框比视口高度还要大,那么这个解决方案将无法正常工作,因为内容会被裁剪。相反,您应该在容器上执行以下操作: display: flex; flex-direction: column; justify-content: center; min-height: 100vh; - Andrew

11

8

作为一个Bootstrap模态框,可以查看这个Fiddle(jsFiddle)。

试试看。

.modal-dialog {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) !important;
}

希望这能帮到你!

感谢 @D.Malakhov - Saurav Rastogi

6
通过添加位置和变换属性,您无法使其在所有宽度和设备上居中,而且每次都需要计算可能会很繁琐。以下是仅通过为“.modal-dialog”类设置样式来实现的方法。
/* Center a bootstrap modal Vertically and horizontally */

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

/* and Viola! */

1
真是太好了!更加简洁的解决方案。 - isaac

1
尝试这个:-

// Vertical centered modals
// you can give custom class like this // var modalVerticalCenterClass = ".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);
/* scroll fixes */
.modal-open .modal {
  padding-left: 0px !important;
  padding-right: 0px !important;
  overflow-y: scroll;
}

/* centering styles for jsbin */
html,
body {
  width:100%;
  height:100%;
}
html {
  display:table;
}
body {
  display:table-cell;
  vertical-align:middle;
}
body > .btn {
  display: block;
  margin: 0 auto;
}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Bootstrap 3 vertically centered modal and scroll fixes</title>
    <meta name="description" content="Bootstrap 3 vertically centered modal and scroll fixes">
    <!-- include bootstrap -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
</head>
<body>
  
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Launch modal
</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <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>
      </div>
    </div>
  </div>
</div>
  
<!-- include jQuery -->
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
  
<!-- include bootstrap -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
  
</body>
</html>


1

最简单的方法(未经过跨浏览器测试,但应该可以):

HTML:

<div class="container">
<p>Container</p>
<div class="modal">
<p>Modal</p>
</div>
</div>

CSS:

.container {
position:relative;
}

.modal {
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
margin:auto; 
}

这是代码片段:

http://jsfiddle.net/o9pbgnz5/

重要的是你设置top:0bottom:0。然后,margin-top:automargin-bottom:auto会处理垂直居中。在这个例子中,简写的'margin:auto'可以水平和垂直居中。

P.S. 也适用于position:fixed;


1
使用CSS的calc()函数,可以在top属性上实现垂直居中模态框。假设模态框高度为600像素,使用vh单位并设置值为50,将获得屏幕垂直高度的中点。然后只需减去模态框元素高度的一半即可。
#modal {
   position:  fixed;
   height: 600px;
   top: calc(50vh - 300px);
   z-index: 100;
}

0
如果您正在使用Bootstrap 4或更高版本,您可以简单地使用Bootstrap类modal-dialog modal-dialog-centered。

 function inactive(id, ths) {
   $("#confirmation").modal("show");
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="modal-dialog modal-dialog-centered fade bs-example-modal-sm" id="confirmation" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
  <div class="modal-dialog modal-sm" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
        </button>
        <h4 class="modal-title">Are you sure you want to inactivate it?</h4>
      </div>
      <div class="modal-body">
        <div class="form-group">
          <input type="text" class="form-control" name="captcha" id="cval" placeholder="enter captcha">
        </div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
        <button type="button" class="btn btn-primary" id="yes">Yes</button>
      </div>
    </div>
  </div>
</div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接