我想将我的模态放在视口中间(中间)我试图添加一些css属性
.modal { position: fixed; top:50%; left:50%; }
我正在使用此示例http://jsfiddle.net/rniemeyer/Wjjnd/
我试过
$("#MyModal").modal('show').css(
{
'margin-top': function () {
return -($(this).height() / 2);
},
'margin-left': function () {
return -($(this).width() / 2);
}
})
答案 0 :(得分:243)
这可以完成工作:http://jsfiddle.net/sRmLV/1140/
它使用helper-div和一些自定义css。不需要javascript或jQuery。
HTML (基于Bootstrap的demo-code)
<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">×</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>
<强> CSS 强>
.vertical-alignment-helper {
display:table;
height: 100%;
width: 100%;
pointer-events:none; /* This makes sure that we can still click outside of the modal to close it */
}
.vertical-align-center {
/* To center vertically */
display: table-cell;
vertical-align: middle;
pointer-events:none;
}
.modal-content {
/* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
width:inherit;
max-width:inherit; /* For Bootstrap 4 - to avoid the modal window stretching full width */
height:inherit;
/* To center horizontally */
margin: 0 auto;
pointer-events: all;
}
答案 1 :(得分:93)
因为gpcola的回答对我不起作用,所以我编辑了一下它的作品。 我使用“margin-top”而不是transform。此外,我使用“显示”而不是“显示”事件,因为它给我一个非常糟糕的定位跳跃(当你有自举动画时可见)。确保在定位前将显示设置为“阻止”,否则$ dialog.height()将为0并且模态将不会完全居中。
(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));
答案 2 :(得分:73)
这就是我为我的应用所做的。如果您查看bootstrap.css文件中的以下类.modal-dialog的默认填充为10px和@media屏幕,并且(min-width:768px).modal-dialog的顶部填充设置为30px。因此,在我的自定义css文件中,我将所有屏幕的顶部填充设置为15%,而未指定媒体屏幕宽度。希望这可以帮助。
.modal-dialog {
padding-top: 15%;
}
答案 3 :(得分:59)
我发现所有HTML5浏览器的最佳方式:
body.modal-open .modal {
display: flex !important;
height: 100%;
}
body.modal-open .modal .modal-dialog {
margin: auto;
}
答案 4 :(得分:18)
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="table">
<div class="table-cell">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</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>
</div>
//样式
.table {
display: table;
height:100%;
}
.table-cell {
display: table-cell;
vertical-align: middle;
}
答案 5 :(得分:13)
在.modal.fade.in中重写top参数以强制在自定义声明中设置的值,在顶部后面添加!important
关键字。这会强制浏览器使用该值并忽略关键字的任何其他值。这样做的缺点是你不能在其他任何地方覆盖这个值。
.modal {
position: fixed;
top: 50% !important;
left: 50%;
}
答案 6 :(得分:11)
这对我来说很完美:
.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;
}
答案 7 :(得分:9)
因为这里的大部分答案都不起作用,或者只是部分起作用:
body.modal-open .modal[style]:not([style='display: none;']) {
display: flex !important;
height: 100%;
}
body.modal-open .modal[style]:not([style='display: none;']) .modal-dialog {
margin: auto;
}
您必须使用[样式]选择器仅将样式应用于当前活动的模态而不是所有模态。 .in
会很棒,但它似乎只是在转换完成后添加,这太晚了,并且会导致一些非常糟糕的转换。幸运的是,似乎bootstrap始终在模态上应用了一个样式属性,就像它开始显示一样,这有点hacky,但它有效。
:not([style='display: none;'])
部分是一种解决方法,无法正确删除样式属性,而是在关闭对话框时将样式显示设置为无。
答案 8 :(得分:9)
你可以使用:
.modal {
position: fixed;
top: 50% !important;
left: 50%;
transform: translate(-50%, -50%);
}
垂直和水平居中。
答案 9 :(得分:8)
您可以在Bootstrap 3模式上实现垂直对齐中心:
.modal-vertical-centered {
transform: translate(0, 50%) !important;
-ms-transform: translate(0, 50%) !important; /* IE 9 */
-webkit-transform: translate(0, 50%) !important; /* Safari and Chrome */
}
并将此css类添加到“模态对话框”容器
<div class="modal-dialog modal-vertical-centered">
...
jsFiddle工作示例:http://jsfiddle.net/U4NRx/
答案 10 :(得分:8)
最简洁,最简单的方法是使用Flexbox!以下内容将垂直对齐屏幕中央的Bootstrap 3模式,并且比这里发布的所有其他解决方案更清晰,更简单:
body.modal-open .modal.in {
display: flex !important;
align-items: center;
}
注意:虽然这是最简单的解决方案,但由于浏览器的支持,它可能不适用于所有人:http://caniuse.com/#feat=flexbox
看起来(通常)IE落后了。就我而言,我为自己或客户开发的所有产品都是IE10 +。 (如果可以用来实际开发产品并更快地获得MVP,那么投入支持旧版本IE的开发时间是不明智的。这当然不是每个人都拥有的奢侈品。
我已经看到较大的网站会检测是否支持flexbox并将类应用于页面正文 - 但前端工程的级别非常强大,而且您仍然需要回退。 / p>
我鼓励人们接受网络的未来。 Flexbox非常棒,如果可以,你应该开始使用它。
P.S。 - 这个网站真的帮助我整体掌握了flexbox并将其应用于任何用例:http://flexboxfroggy.com/
编辑:如果在一个页面上有两个模态,这应该适用于.modal.in
答案 11 :(得分:7)
答案 12 :(得分:5)
<强>优点:强>
display:table-cell
(这不适用于布局)markup
SCSS
或gulp
grunt
// closes the modal on click/tap below/above the modal
$('.modal-dialog').on('click tap', function(e){
if (e.target.classList.contains('modal-dialog')) {
$('.modal').modal('hide');
}
})
.modal-dialog {
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
-moz-box-orient: vertical;
-moz-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
-webkit-box-pack: center;
-webkit-justify-content: center;
-moz-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
overflow-y: auto;
min-height: -webkit-calc(100vh - 60px);
min-height: -moz-calc(100vh - 60px);
min-height: calc(100vh - 60px);
}
@media (max-width: 767px) {
.modal-dialog {
min-height: -webkit-calc(100vh - 20px);
min-height: -moz-calc(100vh - 20px);
min-height: calc(100vh - 20px);
}
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
Launch demo modal
</button>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" 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">×</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>
注意:我打算使用Bootstrap 3的最新规范更新此答案。对于Bootstrap 4解决方案,请参阅this answer(现在它们或多或少是同样,但他们可能会分歧)。如果您发现任何错误或问题,请告诉我,我会更新。感谢。
清晰,无需加前缀SCSS
(与gulp
/ grunt
一起使用):
.modal-dialog {
display: flex;
flex-direction: column;
justify-content: center;
overflow-y: auto;
min-height: calc(100vh - 60px);
@media (max-width: 767px) {
min-height: calc(100vh - 20px);
}
}
答案 13 :(得分:3)
无需我们的javascript。 Boostrap模态在出现时会添加.in类。 只需使用flex css修改modalclassName.fade.in的这个类组合即可完成。
添加此css以垂直和水平居中模式。
.modal.fade.in {
display: flex !important;
justify-content: center;
align-items: center;
}
.modal.fade.in .modal-dialog {
width: 100%;
}
答案 14 :(得分:3)
又一个CSS解决方案。 对于大于视口的弹出窗口不起作用。
.modal-dialog {
position: absolute;
right: 0;
left: 0;
margin-top: 0;
margin-bottom: 0;
}
.modal.fade .modal-dialog {
transition: top 0.4s ease-out;
transform: translate(0, -50%);
top: 0;
}
.modal.in .modal-dialog {
transform: translate(0, -50%);
top: 50%;
}
在.modal-dialog
类中将位置覆盖为绝对位置(来自相对位置)并使内容居中right:0, left: 0
在.modal.fade .modal-dialog , .modal.in .modal-dialog
中设置过渡动画超过top
而不是翻译。
margin-top
会将弹出窗口略微移动到中心以下,如果弹出窗口较长,则模式会被标头卡住。因此margin-top:0, margin-bottom:0
需要进一步完善它。
答案 15 :(得分:3)
对于那些使用angular-ui bootstrap的人,可以根据以上信息添加以下类:
注意:不需要进行任何其他更改,它将解决所有模态。
// The 3 below classes have been placed to make the modal vertically centered
.modal-open .modal{
display:table !important;
height: 100%;
width: 100%;
pointer-events:none; /* This makes sure that we can still click outside of the modal to close it */
}
.modal-dialog{
display: table-cell;
vertical-align: middle;
pointer-events: none;
}
.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;
pointer-events: all;
}
答案 16 :(得分:2)
只需将以下CSS添加到现有的CSS中,它对我来说很好用
.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;
}
答案 17 :(得分:2)
我认为这比Rens de Nobel的解决方案更纯粹的纯CSS解决方案。此外,这不会阻止通过单击对话框关闭对话框。
http://plnkr.co/edit/JCGVZQ?p=preview
只需使用.modal-dialog类将一些CSS类添加到DIV容器中,以获得比bootstraps CSS更高的特异性,例如: .centered。
<强> HTML 强>
<div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
<div class="modal-dialog centered modal-lg">
<div class="modal-content">
...
</div>
</div>
</div>
使这个.modal-dialog.centered容器固定并正确定位。
<强> CSS 强>
.modal .modal-dialog.centered {
position: fixed;
bottom: 50%;
right: 50%;
transform: translate(50%, 50%);
}
甚至更简单地使用flexbox。
<强> CSS 强>
.modal {
display: flex;
align-items: center;
justify-content: center;
}
答案 18 :(得分:2)
基于Arany's answer,但也考虑了页面滚动。
(function($) {
"use strict";
function positionModals(e) {
var $this = $(this).css('display', 'block'),
$window = $(window),
$dialog = $this.find('.modal-dialog'),
offset = ($window.height() - $window.scrollTop() - $dialog.height()) / 2,
marginBottom = parseInt($dialog.css('margin-bottom'), 10);
$dialog.css('margin-top', offset < marginBottom ? marginBottom : offset);
}
$(document).on('show.bs.modal', '.modal', positionModals);
$(window).on('resize', function(e) {
$('.modal:visible').each(positionModals);
});
}(jQuery));
答案 19 :(得分:2)
我的选择,只是一点点CSS :(不在IE8中工作)
.modal.fade .modal-dialog {
transform: translate(-50%, -80%);
}
.modal.in .modal-dialog {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
margin-top: 0px;
}
您可以使用第一条规则来更改模态的显示方式。
使用:Bootstrap 3.3.4
答案 20 :(得分:1)
要在bootstrap modal.js中添加垂直模态居中,我在Modal.prototype.show
函数的末尾添加了这个:
var $modalDialog = $('.modal-dialog'),
modalHeight = $modalDialog.height(),
browserHeight = window.innerHeight;
$modalDialog.css({'margin-top' : modalHeight >= browserHeight ? 0 : (browserHeight - modalHeight)/2});
答案 21 :(得分:1)
使模态真正对齐中间对话。
/ *注意:
1.即使您不需要指定选择器,它也会从文档中找到所有模态并使其垂直居中
2.为了避免中间某个特定模态为中心,您可以使用:不在点击事件中使用选择器
* /
$( "[data-toggle='modal']" ).click(function(){
var d_tar = $(this).attr('data-target');
$(d_tar).show();
var modal_he = $(d_tar).find('.modal-dialog .modal-content').height();
var win_height = $(window).height();
var marr = win_height - modal_he;
$('.modal-dialog').css('margin-top',marr/2);
});
来自米兰潘迪亚
答案 22 :(得分:1)
如果模态高于屏幕的高度,这需要Arany的回答并使其有效:
function centerModal() {
$(this).css('display', 'block');
var $dialog = $(this).find(".modal-dialog");
var offset = ($(window).height() - $dialog.height()) / 2;
//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
var bottomMargin = $dialog.css('marginBottom');
bottomMargin = parseInt(bottomMargin);
if(offset < bottomMargin) offset = bottomMargin;
$dialog.css("margin-top", offset);
}
$('.modal').on('show.bs.modal', centerModal);
$(window).on("resize", function () {
$('.modal:visible').each(centerModal);
});
答案 23 :(得分:1)
e(document).on('show.bs.modal', function () {
if($winWidth < $(window).width()){
$('body.modal-open,.navbar-fixed-top,.navbar-fixed-bottom').css('marginRight',$(window).width()-$winWidth)
}
});
e(document).on('hidden.bs.modal', function () {
$('body,.navbar-fixed-top,.navbar-fixed-bottom').css('marginRight',0)
});
答案 24 :(得分:1)
这适用于BS3,未在v2中测试过。它将模态垂直居中。请注意,它会在那里转换 - 如果您希望它只显示在transition
.modal-dialog
属性中
centerModal = function() {
var $dialog = $(this).find(".modal-dialog"),
offset = ($(window).height() - $dialog.height()) / 2;
// Center modal vertically in window
$dialog.css({
'transform': 'translateY(' + offset + 'px) !important',
});
};
$('.modal').on('shown.bs.modal', centerModal);
$(window).on("resize", function() {
$('.modal').each(centerModal);
});
答案 25 :(得分:1)
.modal.in .modal-dialog {
position: relative;
top: 50%;
transform: translateY(-50%);
}
&#13;
答案 26 :(得分:0)
这个问题的另一个CSS答案...
此解决方案仅使用CSS来实现所需的效果,同时仍然保持通过单击其外部来关闭模式的能力。它还允许您设置.modal-content
高度和宽度最大值,以便弹出窗口不会超出视口。当内容超出模态大小时,将自动显示滚动
注意:强>
应该省略建议的.modal-dialog
div
的Bootstrap,以使其正常工作(似乎没有破坏任何东西)。在Chrome 51和IE 11中测试过
CSS代码:
.modal {
height: 100%;
width: 100%;
}
.modal-content {
margin: 0 auto;
max-height: 600px;
max-width: 50%;
overflow: auto;
transform: translateY(-50%);
}
修改强>
.modal-dialog
类允许您选择用户是否可以通过单击模态本身外部来关闭模态。大多数模态都有明确的“关闭”或“取消”按钮。使用此解决方法时请记住这一点。
答案 27 :(得分:0)
使用宽度和高度集中你的模态的最佳解决方案是,在css add和in modal中将这个'centralize'添加为一个类..
.centralize{
position:absolute;
left:50%;
top:50%;
background-color:#fff;
transform: translate(-50%, -50%);
width: 40%; //specify watever u want
height: 50%;
}
答案 28 :(得分:0)
垂直居中 将.modal-dialog-centered添加到.modal-dialog以使模式垂直居中
启动演示模态
<!-- 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">×</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>
答案 29 :(得分:-6)
<强>的index.php 强>
<! - Bootstrap core CSS ->
<link href=".../css/bootstrap-modal-bs3patch.css" rel="stylesheet">
<link href=".../css/bootstrap-modal.css" rel="stylesheet">
文件 bootstrap-modal-bs3patch.css 我是从https://github.com/jschr/bootstrap-modal下载的
然后我修改了这个文件。 Css如下:
body.modal-open,
. modal-open. navbar-fixed-top,
. modal-open. navbar-fixed-bottom {
margin-right: 0;
}
. {modal
padding: 0;
}
. modal.container {
max-width: none;
}
@ media (min-width: 768px) and (max-width: 992px) {
. {modal-dialog
background-color: black;
position: fixed;
top: 20%! important;
left: 15%! important;
}
}
@ media (min-width: 992px) and (max-width: 1300px) {
. {modal-dialog
background-color: red;
position: fixed;
top: 20%! important;
left: 20%! important;
}
}
@ media (min-width: 1300px) {
. {modal-dialog
background-color: # 6e7ec3;
position: fixed;
top: 40%! important;
left: 35%! important;
}
}
我对不同的分辨率进行了测试,并且可行!