为什么vertical-align:middle在我的span或div上不起作用?


246

我正在尝试将一个spandiv元素垂直居中放置在另一个div元素中。但是当我放进去时vertical-align: middle,什么也没发生。我尝试过更改display两个元素的属性,但似乎没有任何效果。

这是我当前在网页中执行的操作:

.main {
  height: 72px;
  vertical-align: middle;
  border: 1px solid black;
  padding: 2px;
}
    
.inner {
  vertical-align: middle;
  border: 1px solid red;    
}
    
.second {
  border: 1px solid blue; 
}
<div class="main">
  <div class="inner">
    This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

这是实现的jsfiddle,显示它不起作用:http : //jsfiddle.net/gZXWC/

Answers:


207

这似乎是最好的方法-自我的原始文章以来已经过去了一段时间,现在应该这样做:http : //jsfiddle.net/m3ykdyds/200

/* CSS file */

.main {
    display: table;
}

.inner {
    border: 1px solid #000000;
    display: table-cell;
    vertical-align: middle;
}

/* HTML File */
<div class="main">
    <div class="inner"> This </div>
</div>

2
那么某人如何执行OP想要做的事情?
瑞安·莫滕森

关于可变行段落有什么想法吗?即。如果没有办法知道是一两行。那我需要使用jQuery吗?
foochow 2014年

如果高度必须是动态的,怎么办?
Murhaf Sousli,2015年

不应该被接受为答案,它依赖于知道'.inner'的高度,因此也不完全是OP所要求的,下面还有一些更好的答案,请参见@timbergus或Tim Perkins的答案接近底部。
mike-source,

@ mike-source知道inner的高度是100%可能的,即使该高度是动态的也可以,因为少量的javascript可以找出并动态更改该DOM对象的CSS规则。
查尔斯·亚迪斯

143

使用CSS3:

<div class="outer">
   <div class="inner"/>
</div>

CSS:

.outer {
  display : flex;
  align-items : center;
  justify-content: center;
}

注意:这可能不适用于旧版IE


16
所有主要的现代浏览器以及最简单,最干净的解决方案均支持此功能。
山姆

2
另外请记住inline-flex,内部元素中连续有多个元素。
Dan Nissenbaum

1
就我而言,由于我也想将.inner的内容水平居中,因此必须添加.inner { width: 100%; }。这样,它看起来就像.outer { display: table; } .inner { display: table-cell; vertical-align: middle; }但不强制最小宽度。
Bart S

我过去justify-content: center;经常水平对齐,效果很好
Ruth Young

140

试试这个,对我很好:

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;

4
很好的答案,这给了我一个完全正常的解决方案,并且没有引起其他连锁问题(使用jquerymobile + phonegap的应用程序以及所有其他解决方案都导致了css和div大小问题)。只是指出必须将这些参数添加到特定于要居中/居中的元素的CSS块中,例如:#element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;}-注意高度对于确保span继承其容器的整个高度(可能是div)非常重要,否则您仍然不会获得垂直居中!
安迪·洛伦兹

顺便说一句,您可以编写没有浏览器前缀的标准flexbox代码,然后使用自动前缀github.com/postcss/autoprefixer或通过在线演示simevidas.jsbin.com/gufoko/quiet
starikovs 2015年

2
无效的属性值boxdisplay
Joaquinglezsantos

另外,当外部框具有填充时,@ user1782556的答案会更好。
iautomation

34

将line-height设置为与包含div相同的高度也将起作用

演示http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}

1
我发布了一个链接,说明了该方法。但是,如果布局的其余部分尺寸未固定,则不是我的首选方法-使用此方法,我在不同尺寸的视口中遇到了问题。
查尔斯·亚迪斯

2
是的,行高技术效果很好,但前提是您具有单行内容。其他行将丢失/溢出到容器外部,您需要重新开始!
安迪·洛伦兹

a)line-height也会改变内部元素的高度。b)内部元件仍未准确地垂直居中。c)它不适用于不包含文本的元素,例如ex:<img>或具有固定高度的元素。
Alph.Dev 2014年

由于字体渲染的差异,它也可能无法跨OS(Windows / Mac)
LocalPCGuy 2015年

1
这是非常不可预测的,并且经常导致容器上的额外高度。
分心2015年

25

万一您不能依靠flexbox ... .child放在.parent的中心。当像素大小未知(换句话说,总是)并且IE9 +也没有问题时,该方法就可以使用。

.parent { position: relative; }

.child {
    position: absolute;
    top : 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform    : translate(-50%, -50%);    
}
<div class="parent" style="background:lightyellow; padding:6em"> 
  <div class="child" style="background:gold; padding:1em">&mdash;</div> 
</div>


这实际上是做得最好的解决方案,特别是因为到目前为止我看到的大多数项目都需要IE9兼容性
Jabberwocky

20

您应该放置vertical-align: middle内部元素,而不是外部元素。line-height在外部元素上设置属性以匹配height外部元素的。然后将display: inline-block和设置line-height: normal在内部元素上。这样,内部元素上的文本将以正常的行高换行。适用于Chrome,Firefox,Safari和IE 8+

.main {
    height: 72px;
    line-height:72px;
    border: 1px solid black;
}
.inner {
    display: inline-block;
    vertical-align: middle;
    line-height: normal;
}
<div class="main">
    <div class="inner">Vertically centered text</div>
</div>

小提琴


这可能是最简单的方法。此页面上的所有其他答案都是不必要的笨拙/ hacky,或者在较旧的浏览器中不支持,或者依赖于知道内部元素的高度。您实际上并不需要line-height: normal;display:inline;也可以。这种方法的好处是它不会干扰text-align:center;,使用display: table-cell;会造成问题。通常,我们希望水平和垂直对齐。看到这个编辑过的小提琴:jsfiddle.net/br090prs/36
mike-source

2
@ mike-source使用line-height: normal和的原因display: inline-block是为了使内部文本正确换行。如果您确定内部div中的文本永远不会换行,则不需要这些属性。
蒂姆·帕金斯

自从Microsoft终止对IE的旧版本的支持以来我就一直使用flexbox进行此类操作(如@ user1782556所建议)。我的原始答案是,如果您仍然需要支持IE 10或更早版本,该走的路。
蒂姆·帕金斯

100%同意,但我个人还不会选择flex box,截至2016年5月,只有76%的浏览器完全支持flex box(如果包括部分支持,则为 94%),请参见:caniuse.com/#search=flexible% 20盒。但是,取决于您的用户群,它已接近成为最明智的选择。
mike-source,

10

我用它来对齐包装div中心的所有内容,以防对任何人都有用-我发现它最简单:

div.wrapper {
  /* --- This works --- */
  display: flex;
  /* Align Vertically */
  align-items: center;
  /* Align Horizontally */
  justify-content: center;
  /* --- ---------- ----- */
  width: 100%;
  height:100px;
  background-color: blue;
}
div.inner {
  width: 50px;
  height: 50px;
  background-color: orange;
}
<div class="wrapper">
  <div class="inner">
  </div>
</div>


7

在这里,您有两种垂直对齐方式的示例。我使用它们,它们工作得很好。一种使用绝对定位,另一种使用flexbox

垂直对齐示例

使用Flexbox的,你可以通过自己的另一个元素中与之对齐的元素display: flex;使用align-self。如果您还需要水平对齐,可以使用align-itemsjustify-content在容器中。

如果您不想使用flexbox,则可以使用position属性。如果将容器设为相对且内容为绝对,则内容将能够在容器内自由移动。因此,如果您使用top: 0;left: 0;在内容中,它将位于容器的左上角。

绝对定位

然后,要对齐它,只需将顶部和左侧引用更改为50%。这会将内容从内容的左上角放置在容器中心。

在容器中间对齐

因此,您需要纠正此问题,将内容的大小向左和向左平移一半。

绝对居中


5

这是一篇关于如何垂直对齐的文章。我喜欢浮动方式。

http://www.vanseodesign.com/css/vertical-centering/

HTML:

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

和对应的样式:

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}

3
我认为,如果定义#inner块的高度,则会使适当的垂直居中概念无效。OPS要求将其自动化,因此我可以想象这意味着在构思时尚不知道内箱的高度。
Alexis Wilke 2014年

5

的HTML

<div id="myparent">
  <div id="mychild">Test Content here</div>
</div>

的CSS

#myparent {
  display: table;
}
#mychild {
  display: table-cell;
  vertical-align: middle;
}

我们将父div设置为显示为表格,将子div设置为显示为表格单元格。然后,我们可以在子div上使用vertical-align并将其值设置为middle。此子div内的所有内容都将垂直居中。


4

这很简单。只需添加display:table-cell您的主类。

.main {
  height: 72px;
  vertical-align: middle;
  display:table-cell;
  border: 1px solid #000000;
}

看看这个jsfiddle


4

这是最新的最简单的解决方案-无需更改任何内容,只需将三行CSS规则添加到您希望居中的div容器中即可。我爱Flex Box#LoveFlexBox

.main {
  /* I changed height to 200px to make it easy to see the alignment. */
  height: 200px;
  vertical-align: middle;
  border: 1px solid #000000;
  padding: 2px;
  
  /* Just add the following three rules to the container of which you want to center at. */
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* This is true vertical center, no math needed. */
}
.inner {
  border: 1px solid #000000;
}
.second {
  border: 1px solid #000000;
}
<div class="main">
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

奖金

justify-content值可以设置为以下几个选项:

  • flex-start,这会将子div与flex流在其父容器中开始的位置对齐。在这种情况下,它将保持在最前面。

  • center,这会将子div与其父容器的中心对齐。这真的很整洁,因为您不需要添加额外的div来包裹所有子项,而将包装器放在父容器中以使子项居中。因此,这是真正的垂直中心(在中,column flex-direction类似地,如果将更flow-direction改为row,它将变为水平中心。

  • flex-end,这会将子div与flex流在其父容器中结束的位置对齐。在这种情况下,它将移至底部。

  • space-between,这会将所有子项从流的开始传播到流的结束。如果是演示,我添加了另一个子div,以表明它们已分散。

  • space-around,类似于space-between,但在流程的开始和结束处只有一半的空间。


完美的解决方案。不兼容的浏览器可能会使内容未对齐,用户必须对其进行处理或升级其浏览器。
twojr

0

由于vertical-align预期上的作品td,你可以把一个单细胞tablediv对齐其内容。

<div>
    <table style="width: 100%; height: 100%;"><tr><td style="vertical-align: middle; text-align: center">
        Aligned content here...
    </td></tr></table>
</div>

笨拙,但据我所知可以正常工作。它可能没有其他解决方法的缺点。


5
不,请,没有桌子了。CSS可以用一种干净的方式做到这一点。在这种情况下,无需使用<table>。
enguerranws 2014年

0

只需将内容放入高度为100%的表格中,然后设置主div的高度即可

<div style="height:80px;border: 1px solid #000000;">
<table style="height:100%">
<tr><td style="vertical-align: middle;">
  This paragraph should be centered in the larger box
</td></tr>
</table>
</div>

0

要将一个span或div元素垂直居中放置在另一个div中,请添加相对于父div的位置,并相对于子div绝对位置。

<div class="parent">
    <div class="child">Vertically and horizontally centered child div</div>
</div>

CSS:

.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

0

这是一种现代方法,它利用了CSS Flexbox功能。现在,只需将这些样式添加到容器中,即可垂直对齐其父容器中的.main内容

.main {
        display: flex;
        flex-direction: column;
        justify-content: center;
}

而且你很好!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.