CSS垂直对齐浮动div


88

我有一个div(#wrapper),其中包含2个并排站立的div。

我希望将右div垂直对齐。我在主包装器上尝试了vertical-align:middle,但是它不起作用。它让我发疯!

希望有人能帮忙。

http://cssdesk.com/LWFhW

HTML:

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS:

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}

Answers:


67

您没有浮点元素的运气。他们不服从垂直对齐,

您需要的是display:inline-block

http://cssdesk.com/2VMg8

谨防


小心,display: inline-block;因为它将元素之间的空白解释为真实的空白。它不会像对待它那样忽略它display: block

我建议这样做:

font-size包含元素的设置为0(零),然后将元素重置font-size为所需的值,如下所示

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

在此处查看演示:http : //codepen.io/HerrSerker/pen/mslay


的CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  

如果#wrapper高度固定,则此方法将无效。#right-div相对于#left-div居中,而不是相对于wrapper元素。(inline-block使得它表现得像一个内嵌img具有align属性集)
科斯塔

@Costa我应该是这样的。
yunzen 2013年

不管采用哪种方式都没有关系,在许多情况下,您必须使用浮动元素,并且总有一种方法可以在CSS中进行处理。总是。在最简单的情况下,其浮动文本的垂直对齐:jsbin.com/UWeB/1/edit
VSYNC

11
但是您的解决方案也将不起作用,因为您不能仅仅决定不使用浮点数。.重点是在使用浮点数时以某种方式垂直对齐。
vsync

2
我的全部观点是,有时无法选择内联阻止,并提供了一个用例来帮助其他可能从Google进入此页面的人。无需粗鲁。
杰米·巴克

20

您可以使用display table和display table-cell轻松完成此操作。

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

编辑:实际上很快就在CSS Desk上为您弄乱了-http: //cssdesk.com/RXghg

另一个编辑:使用Flexbox。这可以工作,但是已经过时了-http: //www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}

1
您好SpaceBeers。您的建议对我不起作用,因为我隐藏了right-div的溢出(我只是将代码添加到CSS桌面中)。通过您的解决方案,溢流不会被隐藏,div会扩展其宽度...
Marc 2012年

11

我意识到这是一个古老的问题,但是我认为发布浮动垂直对齐问题的解决方案将很有用。

通过围绕要浮动的内容创建包装器,然后可以使用:: after或:: before伪选择器在包装器中垂直对齐内容。您可以随意调整内容的大小,而不会影响对齐方式。唯一的问题是包装纸必须填充容器100%的高度。

http://jsfiddle.net/jmdrury/J53SJ/

的HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

的CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}

我不确定您要做什么,但是在删除centered该类并从该CSS中清除了许多多余的内容后,它仍然可以进行垂直对齐,只是(抱歉格式化失败!...):div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz。


2

我尽力避免使用浮点数...但是-必要时,我使用以下几行垂直对齐中间位置:

position: relative;
top: 50%;
transform: translateY(-50%);

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.