在CSS中垂直对齐文本

42

我有一些非常基础的HTML和CSS:

header {
  vertical-align: middle;
  height: 60px;
  background-color: #00F;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" media="all" href="stylesheet.css">
  <title>Hello, World!</title>
</head>
<body>
  <header>
    Hello<sup>World</sup>
  </header>
</body>
</html>

但是文本没有居中对齐。为什么呢?

8个回答

66

vertical-align 属性仅适用于:

内联级别和 'table-cell' 元素

参见这个链接

您可以使用line-height来垂直居中文本,只需将其设置为实际font-size的大小即可,但它仅在文本跨越单行时有效。

或者您可以通过相等的值在header元素的顶部和底部添加padding

根据评论进行编辑:如果使用HTML5的header元素,则明显的解决方案是将其设置为display: table-cell;,而不是默认的块级元素,我认为重置CSS会应用。


我会在页眉中添加更多内容(比如导航、搜索等)。我需要把文本放到一个单独的容器中吗? - ryyst
1
不需要单独的div/container,只需在标题上下均匀地添加填充即可。 - clairesuzy
@clairesuzy:这没有意义。想象一下,如果我在标题中有两个不同大小的文本,并希望将它们对齐在中间。我无法通过填充来实现,对吗? - ryyst
1
是的,抱歉让您感到困惑 - 您需要填充 header 本身,您所描述的情况实际上需要更多的 div/元素来包含导航、搜索等等... 然而,我的答案中已经给出了提示,即将 header 设为 display: table-cell; - clairesuzy
1
好的,“table-cell”必须是“table”的一部分(即使在CSS显示术语中也是如此 ;)) - 因此,为了使其占用100%的宽度 - 您可以将body元素也设置为display-table; width:100%,或者如果您有一个“wrapper” div,在那里进行操作,使容器元素display:table不会对事情产生不利影响,实际上它可能会有像全长列这样的好处,但YMMV。 - clairesuzy
显示剩余4条评论

25

1
这不是垂直对齐,而是水平对齐。 - Olli
1
这比 display: table-cell; 更好的选择。 - Nilay Mehta

11

我试过这个方法,对我来说效果非常好:

/* 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;

6

以下是我最喜欢的垂直对齐物品的技巧,它使用了弹性盒子(flex box),所有东西都应该使用弹性盒子!

header {
    display: -webkit-flex;
    display: flex;
    -webkit-align-items: center;
    align-items: center;
    -webkit-justify-content: center;
    justify-content: center;
    border: black solid 0.1rem;
    height: 200px; <!--Insert any height -->
}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" media="all" href="stylesheet.css">
        <title>Hello, World!</title>
    </head>
    <body>
        <header>
            Hello<sup>World</sup>
        </header>
    </body>
</html>


3

我发现最简单的解决方案是将我的文本放在一个段落标签中,并应用设置顶部边距的CSS样式。虽然这需要为我排列在两行三列中的六个容器中的每个容器都使用单独的选择器,但它可以轻松完成工作。 - David A. Gray

3

vertical-align 在具有 display: block 属性的元素中并不起作用。如果文本是该元素中唯一的内容且全部在同一行上,则通常使用例如 line-height: 60px 的方法。

如果要放入更多内容,则最好给容器设置高度(如果必须)并调整包含元素内部的边距/填充等,直到看起来合适。


最终标题栏中会有更多内容(导航等),因此使用“行高”不是一个选择。 - ryyst
我无法将文本放入一个 div 并且垂直居中该 div,因为 div 不是内联元素,对吧?有什么好的解决方法(抱歉问这种愚蠢的问题,我对 HTML/CSS 非常陌生)。 - ryyst
不知道<header>中将有什么其他元素,它们的位置以及整体应该是什么样子,我无法给出一个好的答案。 - Marcel
基本上,它是一根横跨整个屏幕的条形。我在条中放置了一些文本和一些按钮。所有这些元素都应该垂直对齐到中间。非常类似于 Stack Overflow 这里的顶部条。 - ryyst

0

如果您不想使用表格,可以使用vertical-align:middle和display:inline-block,同时使用一个高度为100%的空内联元素:

http://jsfiddle.net/ycugZ/

<!DOCTYPE><html><body> <!-- Author: brillout.com -->

<div style='height: 300px;border: 1px solid black;text-align:center'>
  <div class='i'>vertical-align + inline-block<br>trick<br>in action</div>
  <div class='i' style='height:100%;width:0px'></div>
</div>
<style> div.i{ display: inline-block; vertical-align: middle } </style>

</body></html>

-1
<div style="border:1px solid #000;height:200px;position: relative;">
     <div style="position: absolute;top: 50%;left:50%;">
     hello mahesh 
     </div>
</div>

示例演示

试试这个。


很遗憾,该文本并不在真正的中心位置。文本“框”的左上角现在位于中心位置。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接