垂直对齐div中的文本

Cyc*_*one 647 css vertical-alignment

下面的代码(也可以作为JS Fiddle的演示版)不会将文本放在中间,正如我理想的那样.div即使使用margin-top属性,我也找不到任何方法将文本垂直居中.我怎样才能做到这一点?

<div id="column-content">
    <img src="http://i.stack.imgur.com/12qzO.png">
    <strong>1234</strong>
    yet another text content that should be centered vertically
</div>
Run Code Online (Sandbox Code Playgroud)
#column-content {
    display: inline-block;
    border: 1px solid red;
    position:relative;
}

#column-content strong {
    color: #592102;
    font-size: 18px;
}

img {
    margin-top:-7px;
    vertical-align: middle;        
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*lly 664

Andres Ilich说得对.以防有人错过他的评论......

A.)如果您只有一行文字:

div
{
  height: 200px;
  line-height: 200px; /* <-- this is what you must define */
}
Run Code Online (Sandbox Code Playgroud)
<div>vertically centered text</div>
Run Code Online (Sandbox Code Playgroud)

B.)如果你有多行文字:

div
{
  height: 200px;
  line-height: 200px;
}

span
{
  display: inline-block;
  vertical-align: middle;
  line-height: 18px; /* <-- adjust this */
}
Run Code Online (Sandbox Code Playgroud)
<div><span>vertically centered text vertically centered text vertically centered text vertically centered text vertically centered text vertically centered text vertically centered text vertically centered text vertically centered text vertically centered text</span></div>
Run Code Online (Sandbox Code Playgroud)

  • 除了不尊重自动换行之外,还可以很好地使用:break-word,在这种情况下会破坏. (5认同)
  • 所以这个答案只是:“测量有多少像素使文本足够接近并对其进行硬编码”? (3认同)
  • 如果您使用XHTML过渡作为DOCTYPE,则多行解决方案不起作用. (2认同)
  • 如果你不想设置行高 - 你可以简单地使用`line-height:initial;`或........................ `line-height:normal;`:) (2认同)

And*_*ich 434

span或许为您的文本内容创建一个容器.

#column-content {
  display: inline-block;
}
img {
  vertical-align: middle;
}
span {
  display: inline-block;
  vertical-align: middle;
}

/* for visual purposes */
#column-content {
  border: 1px solid red;
  position: relative;
}
Run Code Online (Sandbox Code Playgroud)
<div id="column-content">

  <img src="http://i.imgur.com/WxW4B.png">
  <span><strong>1234</strong>
    yet another text content that should be centered vertically</span>
</div>
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

  • @Josh是由于'line-height`.如果你将`height`添加到一个元素中,其中的文本究竟在哪里?也就是说,如果你在一个容器里面有一个'font-size:10px`(一个理论上的`高度:10px`)的文本块,那个文本最后会是60px.最肯定的是在容器的顶部,因为文本只能在文本流动的位置,在"height:10px"空间内.但是你可以通过使用与容器相同高度的`line-height`值来克服这个问题,这样文本将采用`vertical-align`属性并正确对齐. (127认同)
  • 你能解释为什么,当为`span`或span的父元素指定`height`属性时,`vertical-align`属性不起作用?具体使用你的演示,我在父元素中添加了一个`height`属性,看看`span`是否仍然会垂直对齐,但事实并非如此. (54认同)
  • @Josh demo:http://jsfiddle.net/9Y7Cm/37/ ..向容器添加了100px的高度,并且在span标签上添加了100px的行高. (9认同)
  • 这不适用于固定位置。 (2认同)
  • jsfiddle 演示“有效”的唯一原因是 img 设置了 `vertical-align: middle;`。在容器上设置一个固定的高度,它不会垂直居中:http://jsfiddle.net/9Y7Cm/5/ (2认同)

Oma*_*riq 222

2016年4月10日更新

现在,Flexbox应该用于垂直(或甚至水平)对齐项目.

<div class="flex-container">
    <div class="flex-item">Item</div>
    <div class="flex-item">Item</div>
    <div class="flex-item">Item</div>
    <div class="flex-item">Item</div>
</div>

<style>
.flex-container {
    display: flex;
    align-items: center; /* Vertical center alignment */
    justify-content: center; /* Horizontal center alignment */
}
</style>
Run Code Online (Sandbox Code Playgroud)

可以在CSS技巧上阅读有关flexbox的精彩指南.感谢Ben(来自评论)指出,没有时间更新.


一个名叫Mahendra的好人在这里发布了一个非常有效的解决方案

以下类应使元素水平和垂直居中于其父元素.

.absolute-center {

    /* 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 不再是,规范已经改变,上面的大部分内容现已弃用.[http://stackoverflow.com/questions/16280040/css3-flexbox-display-box-vs-flexbox-vs-flex]然而,使用flexbox的逻辑是合理的,例如:```display:flex; 证明内容:中心; 对齐项:中心;``` (12认同)
  • 这是唯一对我有用的事情 (2认同)

Edu*_*nal 63

这是一个老问题,但接受的答案不适用于多行文本.我更新了的jsfiddle 显示CSS多行文本垂直对齐的解释在这里:

<div id="column-content">
    <div>yet another text content that should be centered vertically</div>
</div>

#column-content {
    border: 1px solid red;
    height: 200px;
    width: 100px;
}
div {
    display: table-cell;
    vertical-align:middle;
    text-align: center;
}
Run Code Online (Sandbox Code Playgroud)

它也适用<br />于"又一个......"


Pet*_*ník 25

试试这个:

HTML

<div><span>Text</span></div>
Run Code Online (Sandbox Code Playgroud)

CSS

div {
    height: 100px;
}

span {
    height: 100px;
    display: table-cell;
    vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)


Par*_*Par 13

这应该是有效的:

#column-content {
        --------
    margin-top: auto;
    margin-bottom: auto;
}
Run Code Online (Sandbox Code Playgroud)

在你的演示中尝试过.

  • 这应该与`margin:auto 0`相同,其中第一个值('auto')用于上边距和下边距,第二个值(0)用于左边距和右边距. (3认同)
  • 这仅适用于使用“ display:flex”或“ display:grid”或“ display:inline-table”或“ display:inline-grid”的父元素。在较旧的浏览器中不起作用 (3认同)

小智 13

为了使Omar(或Mahendra)的解决方案更加通用,相对于FireFox的代码块应替换为以下内容:

/* Firefox */
display: flex;
justify-content: center;
align-items: center;
Run Code Online (Sandbox Code Playgroud)

当你想要将盒子放在屏幕中或它的直接祖先中时,Omar的代码出现了问题,否则会出现问题.通过将其位置设置为,可以实现此居中

position: relative;position:static;(不与位置:绝对或固定).

然后保证金:自动; 或者保证金权利:auto; 保证金左:自动;

在这个盒子中心调整环境下,奥马尔的建议不起作用.在IE8中不起作用(但市场份额为7.7%).因此,对于IE8(和其他浏览器),应考虑上述其他解决方案中的解决方法.


sce*_*sor 7

#column-content strong也向 CSS 内容添加垂直对齐:

#column-content strong {
    ...
    vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)

另请参阅您更新的示例

===更新===

在其他文本周围有一个跨度和另一个垂直对齐:

HTML:

... <span>yet another text content that should be centered vertically</span> ...
Run Code Online (Sandbox Code Playgroud)

CSS:

#column-content span {
    vertical-align: middle;
}
Run Code Online (Sandbox Code Playgroud)

另请参阅下一个示例