如何垂直中间对齐未知高度的浮动元素?

Yan*_*ang 46 css vertical-alignment css-float

我有一个(水平)居中的外部div包含两个未知宽度的元素:

<div style='width:800px; margin:0 auto'>
  <div style='float:left'>...</div>
  <div style='float:right'>...</div>
</div>
Run Code Online (Sandbox Code Playgroud)

默认情况下,两个浮动都是顶部对齐的,并且具有不同/未知和不同的高度.有没有办法让它们垂直居中?

我最终做了外部div

display: table
Run Code Online (Sandbox Code Playgroud)

和内在的div

display: table-cell;
vertical-align: middle;
text-align: left/right;
Run Code Online (Sandbox Code Playgroud)

但我很好奇是否有办法用花车来做这件事.

Ori*_*iol 58

你不能直接这样做,因为浮动与顶部对齐:

如果有行框,则浮动框的外部顶部与当前行框的顶部对齐.

确切的规则说(强调我的):

  1. 浮动盒的外顶部可能不高于其包含块的顶部.
  2. 浮动框的外部顶部可能不高于源文档中较早的元素生成的任何浮动框的外部顶部.
  3. 元素浮动框的外部顶部可能不会高于包含由源文档中较早的元素生成的框的任何行框的顶部.

  1. 浮动箱必须尽可能高.

也就是说,你可以利用规则#4:

  • 将每个浮点放在内联级元素中,以建立新的块格式化上下文/BFC),例如display: inline-block.
  • 这些包装器将包含浮动因为它们建立BFC,并且它们将是另一个,因为它们是内联级别的.
  • 用于vertical-align垂直对齐这些包装.

请注意,内联块包装器之间可能会出现一些空间.请参见如何删除内联块元素之间的空间?要解决这个问题.

.float-left {
  float: left;
}

.float-right {
  float: right;
}

#main {
  border: 1px solid blue;
  margin: 0 auto;
  width: 500px;
}

/* Float wrappers */
#main > div {
  display: inline-block;
  vertical-align: middle;
  width: 50%;
}
Run Code Online (Sandbox Code Playgroud)
<div id="main">
  <div>
    <div class="float-left">
      <p>AAA</p>
    </div>
  </div>
  <div>
    <div class="float-right">
      <p>BBB</p>
      <p>BBB</p>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我意识到这肯定有应用程序,但它似乎有点欺骗我.这里唯一的"浮动:正确"是为了证明BBB的内容是正确的.它是`display:inline-block`和`vertical-align:middle`,实际上是居中.它根本不是垂直居中的浮动内容. (10认同)
  • 这个解决方案有效,因为你把`width:49%;`甚至没有浮点数就可以了. (9认同)
  • 这里甚至不应使用浮子.除了提到@Simon_Weaver之类的内容之外,它没有任何意义.相反,最好使用`text-align:right`,这样div高度将成为页面流的一部分w/out使用clearfix. (5认同)
  • @ newms87可能是真的.但那时不会有任何浮动,所以它不会回答这个问题.现在我想我回答它,即使我有点作弊. (3认同)

gre*_*man 9

另一种方法是使用flex- float如果你有两个部分,它可以替代a .一个(浮动)将具有自动尺寸,第二个将增长以占据整个容器.在您选择的十字轴上,您center可以获得浮动和居中元素的效果.

这是关于flex的美丽备忘单:http://jonibologna.com/flexbox-cheatsheet/

  • 当然,当你尝试[使用flex](http://caniuse.com/#feat=flexbox)时,你会遇到IE的恐怖.: - | (2认同)