浮动div的内容垂直居中

Posted

技术标签:

【中文标题】浮动div的内容垂直居中【英文标题】:Vertically center content of floating div 【发布时间】:2012-08-23 11:39:07 【问题描述】:

如何将浮动 div 的内容垂直居中(我不知道哪个高度)?

有非常简单的 html 和 CSS(见这个小提琴:http://jsfiddle.net/DeH6E/1/)

<div class="floating">
    This should be in the middle
</div>
​
.floating 
    height: 100px;
    float: left;
    border: 1px solid red;
    vertical-align: middle;
   ​

如何使“这应该在中间”这句话真正出现在中间(垂直居中)? vertical-align: middle 似乎不起作用。我试过display: table-cell,但也没有用。解决此问题的最佳方法是什么?我想避免插入任何其他 HTML 标记,只需通过 CSS 即可。

(澄清一下:我不知道容器的实际高度,100px只是举例)

编辑:我希望你能理解我,所以... 当我设计网页时,我总是遵循 HTML 包含内容而 CSS 负责视觉样式的规则。我从不将它们混合在一起,或者只使用一个来启用另一个。在这种情况下,我也想坚持这条规则。我不想只为 CSS 插入 HTML 元素。

【问题讨论】:

好的,你不能添加元素/你不能使用JS/你不能使用固定高度。男孩,现在我也想知道答案。 @pavel-s - “我遵循 HTML 保存内容而 CSS 负责视觉样式的规则”。实际上,在文本周围添加一个段落&lt;p&gt; 实际上是语义正确的 HTML。 【参考方案1】:

其他人是对的,you need to nest two DOM elements,它为您提供了更多控制居中的选项。代码如下:

.floating 
  display: table;
  float: right;
  height: 200px;
  width: 400px;
  border: 1px solid red;

.floating p 
  display: table-cell; 
  vertical-align: middle; 
  text-align: center;
<div class="floating">
    <p>This is the proper way that validates and breaks across multiple
    lines, if the text is longer than just a few words and still
    should be vertically centered. Here, it's also horizontally
    centered for added joy.</p>
</div>

【讨论】:

不行,你忘了float (添加后内容对齐顶部)。 对我来说,这忽略了浮动文本的意义...不应该是居中和浮动旁边别的文本的例子吗?【参考方案2】:

&lt;p&gt; 中添加文本。

HTML

<div class="floating">
    <p>This should be in the middle</p>
</div>

CSS

.floating 
    height: 100px;
    border: 1px solid #f00;
    display: table-cell;
    vertical-align: middle;

​

【讨论】:

嗯,这正是我想要避免的:在内容和现有 div 之间插入另一个元素。有没有其他解决方案?【参考方案3】:

如果你知道高度,那么

line-height:100px;

如果没有,渲染后使用javascript设置行高。

http://jsfiddle.net/DeH6E/4/

【讨论】:

Nonono,固定高度和javascript都是我想不惜一切代价避免的解决方案(在这种情况下)。【参考方案4】:

我也在寻找解决方案,最终想出了这个:

http://jsfiddle.net/w6j9mgjp/1/

.floating 
    height: 100px;
    float: left;
    border: 1px solid red;


.floating::before 
    content: "a";
    display: block;
    visibility: hidden;
    height: 50%;
    margin-top: -.7em;

不过,它只适用于单行文本。

【讨论】:

【参考方案5】:

http://jsfiddle.net/DeH6E/2/

你的 div 内的文本需要在它自己的 div 标签中,并且该 div 标签需要设置为 display:table-cell;和垂直对齐:中间;而您的 .floating div 需要设置为 display:table;

或者您可以在其中设置一个 p 标签或其他格式的标签来包含您的文本,例如 span 或 p

【讨论】:

嗯,这正是我想要避免的:在内容和现有 div 之间插入另一个元素。没有其他解决办法吗? 不,有一种方法非常复杂且非常不专业,需要使用百分比填充顶部和底部,否则不行。 Christian,我不完全确定这是真的,在查看您的图片时,文本仍然对齐在 div 的顶部。【参考方案6】:

只需使用伪选择器即可。

.floating 
    height: 100px;
    float: left;
    border: 1px solid red;


.floating::before 
    content: '';
    display: inline-block;
    vertical-align: middle;
    height: 100%;

【讨论】:

以上是关于浮动div的内容垂直居中的主要内容,如果未能解决你的问题,请参考以下文章

在向左浮动的 div 中垂直居中图像

如何让一个浮动元素既水平又垂直居中

div自适应水平垂直居中的方法

实现div内容水平垂直居中

如何垂直居中一个浮动元素

如何垂直居中一个浮动元素