使用margin:auto来垂直对齐div

sav*_*ger 95 html css centering

所以我知道如果我们使用,我们可以将div水平居中margin:0 auto;.应该margin:auto auto;如何工作我认为它应该工作?垂直居中也是如此?

为什么不起作用vertical-align:middle;

.black {
    position:absolute;
    top:0;
    bottom:0;
    left:0;
    right:0;
    background:rgba(0,0,0,.5);
}
.message {
    background:yellow;
    width:200px;
    margin:auto auto;
    padding:10px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="black">
    <div class="message">
        This is a popup message.
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

o.v*_*.v. 159

你不能使用:

vertical-align:middle因为它是不是适用于块级元素

margin-top:auto并且margin-bottom:auto因为他们使用的值将计算为零

margin-top:-50%因为基于百分比的边距值是相对于包含块的宽度计算的

实际上,文档流和元素高度计算算法的性质使得无法使用边距将元素垂直居中于其父元素内.每当垂直边距的值改变时,它将触发父元素高度重新计算(重新流动),这将反过来触发原始元素的重新中心...使其成为无限循环.

您可以使用:

这样的一些解决方法适用于您的场景; 这三个元素必须嵌套如下:

.container {
    display: table;
    height: 100%;
    position: absolute;
    overflow: hidden;
    width: 100%;
}
.helper {
    #position: absolute;
    #top: 50%;
    display: table-cell;
    vertical-align: middle;
}
.content {
    #position: relative;
    #top: -50%;
    margin: 0 auto;
    width: 200px;
    border: 1px solid orange;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
    <div class="helper">
        <div class="content">
            <p>stuff</p>
        </div>
    </div>
</div
Run Code Online (Sandbox Code Playgroud)

根据Browsershot,JSFiddle运行良好.

  • 几年前人类已经登月,我们仍然需要处理这个背叛.耶稣在浏览器中垂直对齐东西 (79认同)
  • ```是一个黑客,它的前缀是只有IE7及以下解释的规则.您可能更愿意将这些规则包含在IE特定的样式表中[通过使用条件注释](http://www.quirksmode.org/css/condcom.html)等. (10认同)
  • 在> = IE9时代,`position:absolute; 最高:50%; 变换:translateY(-50%);`也是可行且非常受欢迎...(不像`top:50%; margin: - $ halfHeight`你不必提前知道高度......) (3认同)
  • 出于这种原因的理由+1,基于宽度的保证金百分比计算非常令人惊讶。 (2认同)
  • 我怀疑'无限循环'的陈述. (2认同)

zpr*_*zpr 85

由于这个问题是在2012年提出的,我们在浏览器支持flexbox方面取得了很大进展,我觉得这个答案是强制性的.

如果父容器的显示是flex,则,margin: auto auto(也称为margin: auto)将工作水平和垂直居中,如果无论它是一个inlineblock元件.

#parent {
    width: 50vw;
    height: 50vh;
    background-color: gray;
    display: flex;
}
#child {
    margin: auto auto;
}
Run Code Online (Sandbox Code Playgroud)
<div id="parent">
    <div id="child">hello world</div>
</div>
Run Code Online (Sandbox Code Playgroud)

请注意,宽度/高度不必绝对指定,如本中使用相对于视口的大小调整的jfiddle.

虽然浏览器对flexboxes的支持在发布时处于历史最高水平,但许多浏览器仍然不支持它或需要供应商前缀.有关更新的浏览器支持信息,请参阅http://caniuse.com/flexbox.

更新

由于这个答案得到了一些关注,我还想指出,margin如果您正在使用display: flex并且想要将容器中的所有元素集中在一起,则根本不需要指定:

#parent {
    width: 50vw;
    height: 50vh;
    background-color: gray;
    display: flex;
    align-items: center; /* horizontal */
    justify-content: center; /* vertical */
}
Run Code Online (Sandbox Code Playgroud)
<div id="parent">
    <div>hello world</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 父{显示:flex; }子{保证金:自动0;}简直很棒。 (3认同)
  • 2017:现在这是正确的答案 (2认同)

shs*_*haw 59

这是我发现的最佳解决方案:http://jsfiddle.net/yWnZ2/446/适用于Chrome,Firefox,Safari,IE8-11和Edge.

如果你有一个声明height(height: 1em,height: 50%,等),或者是在浏览器知道的高度(元素img,svgcanvas例如),那么所有你需要的垂直居中是这样的:

.message {
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
    margin: auto;
}
Run Code Online (Sandbox Code Playgroud)

您通常会希望指定widthmax-width使内容不拉伸屏幕/容器的整个长度.

如果您使用此模式,您希望始终在视口中居中重叠其他内容,请使用position: fixed;两个元素而不是position: absolute.http://jsfiddle.net/yWnZ2/445/

这是一个更完整的文章:http://codepen.io/shshaw/pen/gEiDt

  • 这并不一定将其置于其父元素中.不错的黑客,如果你只是想在页面的中心. (3认同)
  • 只需将`position:relative`添加到父级,元素将在父级中居中.如果你想阅读更多内容,我在Smashing Magazine上做了一个更大的关于这项技术的文章:http://coding.smashingmagazine.com/2013/08/09/absolute-horizo​​ntal-vertical-centering-css/ (2认同)

Gal*_*lit 17

这个页面中的任何一个解决方案都不适用(对我而言).

我的解决方案

Html

<body>
  <div class="centered">
  </div>
</body>
Run Code Online (Sandbox Code Playgroud)

CSS

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
Run Code Online (Sandbox Code Playgroud)

  • 没错,我不关心IE8 (5认同)

Pau*_*eck 9

我知道问题是从2012年开始,但我找到了最简单的方法,我想分享.

HTML:

<div id="parent">
     <div id="child">Content here</div>
</div>
Run Code Online (Sandbox Code Playgroud)

和CSS:

#parent{
     height: 100%;
     display: table;
}    
#child {
     display: table-cell;
     vertical-align: middle; 
}
Run Code Online (Sandbox Code Playgroud)


tuf*_*uff 7

如果您知道要居中的div的高度,则可以将其绝对放置在其父级中,然后将top值设置为50%.这将使儿童div的顶部向下降50%,即太低.通过将其设置margin-top为其高度的一半将其拉回.所以现在你有一个孩子div的垂直中点坐在父母的垂直中点 - 垂直居中!

例:

.black {
    position:absolute;
    top:0;
    bottom:0;
    left:0;
    right:0;
    background:rgba(0,0,0,.5);
}
.message {
    background:yellow;
    width:200px;
    margin:auto auto;
    padding:10px;
    position: absolute;
    top: 50%;
    margin-top: -25px;
    height: 50px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="black">
    <div class="message">
        This is a popup message.
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/yWnZ2/2/

  • 好吧,我把你忽略的部分加粗了,希望现在更清楚了. (3认同)