如何在动态高度 div 中垂直居中文本?

Posted

技术标签:

【中文标题】如何在动态高度 div 中垂直居中文本?【英文标题】:How can I vertically center text in a dynamically height div? 【发布时间】:2012-06-11 22:46:17 【问题描述】:
<body>
    <div style="position:absolute; height:100%; width:100%;">
        <h1 style="text-align:center;">Text</h1>
    </div>
</body>

无论 div 元素有多高,如何在 div 标签内垂直居中 h1 标签?即,如果用户更改了他的浏览器高度,我希望 h1 根据新高度垂直居中对齐。

谢谢。

【问题讨论】:

这是一篇关于这个主题的优秀文章:phrogz.net/css/vertical-align/index.html 【参考方案1】:

http://jsfiddle.net/xQBbQ/

<body>
    <div style="position:absolute; height:100%; width:100%;">
        <h1 style="text-align:center; height:20px; position:relative; top:50%; margin-top:-10px;">Text</h1>
    </div>
</body>

【讨论】:

对于达到两行或多行的长文本将失败,请参阅this simulation 和&lt;br/&gt; 强制第二行! @Zuul OP 没有说明文本将持续多长时间。无论如何,这个想法是设置&lt;h1&gt; 的高度并给出一半的负边距 只是指出一个“尚未解决”的问题!您仍然是对的,另外,这里有一个 +1 来证明这一点!【参考方案2】:

在我看来,div 在这种情况下不是合适的选择。我的建议是使用tablevertical-align 风格的tds。

【讨论】:

不要将表格用于非表格数据。 除了表格数据之外,表格在语义上不可接受。 更可靠的跨浏览器设计方案。 不。对于页面结构,它更加邪恶。忘记桌子:) 今天的重点。我没想到。谢谢大家。【参考方案3】:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">
<!--
body 
    background-color: #0c0c0c;

.object 
    background-color: #666666;
    height: 350px;
    width: 600px;

.verticalCenter 
    width:600px;
    height:350px;
    position:absolute;
    left:50%;
    top:50%;
    margin:-175px 0 0 -300px;

-->
</style>
</head>
<body>
    <div class="verticalCenter">
        <div class="object">cetnered</div>
    </div>
</body>
</html>

您必须在 .verticalCenter 类中设置与要居中的对象(div、flash、图像、文本)相同的高度和宽度。并且边距必须是这些高度和宽度的一半。

如果您动态更改该对象,我认为没有解决方案。除非,也许使用 javascripts。

【讨论】:

【参考方案4】:

这是一个相当简单的解决方案。它主要基于设置display:table-cell 并选择像中间这样的垂直对齐方式。

HTML:

<div id="vertical">
    <p>this text is vertically centered.  It's long enough to wrap, and should work for any size chunk of content.</p>
    <p>Heck, it even works with multiple items in the middle.</p>
</div>​​

CSS:

#vertical 
    display:table-cell;
    vertical-align:middle;
    height: 500px;
    width: 300px;
​

JSFiddle:http://jsfiddle.net/6Re3E/1/

【讨论】:

没错,它不适用于 IE6 或 7。我确信 IE7 存在一个简单的 JS 解决方案。生命太短暂了,不用担心 IE6。 本网站展示了两者的解决方案,它是我们方法的混合(您需要调整容器居中而不是原始内容):boutell.com/newfaq/creating/centervertically.html【参考方案5】:

我遇到过的最佳解决方案是利用display 属性并将包装元素设置为table 以允许在要居中的元素上使用vertical-align:middle

看到这个 working Fiddle Example!

HTML

<body>
    <div>
        <h1>Text</h1>
    </div>
</body>

CSS

body width: 100%; height: 100%;   /* this is just to "view" the div height...*/

div 
    position:absolute; height:100%; width:100%;
    display: table;

h1 
    display: table-cell;
    vertical-align: middle;
    text-align:center;


已测试

Windows XP 专业版 2002 Service Pack 3

Internet Explorer 8.0.6001.18702 Opera 11.62 火狐 3.6.16 Safari 5.1.2 谷歌浏览器 18.0.1025.168 m

Windows 7 家庭版服务包 1

Internet Explorer 9.0.8112.164211C Opera 11.62 火狐12.0 Safari 5.1.4 谷歌浏览器 18.0.1025.168 m

Linux Ubuntu 12.04

火狐12.0 Chromium 18.0.1025.151(开发者内部版本 130497 Linux)

【讨论】:

这在 IE7 及更低版本中不起作用。但如果这不是问题 - 这是最好的解决方案。 +1 这是一个离线信息亭,因此该应用程序只能在 Firefox 中运行。这个解决方案在我的情况下效果很好。 +1 我认为这是一个很好的动态高度以及静态高度容器的解决方案,效果很好。 查看 IE10+ 的更好答案:***.com/a/60909392/8804293【参考方案6】:

有一个跨(桌面)浏览器解决方案可以使用 CSS2 + CSS3 完成此操作,无需任何 Javascript。

适用于

IE5+ Gecko(Mozilla、Firefox、Netscape 7) Opera 7+ Konqueror 3+ Webkit 浏览器(Safari、Google Chrome) 还有更多(未测试移动浏览器)

文档:CSS 中的垂直居中 高度未知的最终解决方案:http://www.jakpsatweb.cz/css/css-vertical-center-solution.html清洁 jsFiddle 示例:http://jsfiddle.net/WYgsP/


HTML
<div class="outerBox">
    <div class="helper">
        <div class="boxWithUnknownHeight">
            any text<br>
            any height<br>
            any content, for example generated from DB<br>
            everything is vertically centered
        </div>
    </div>
</div>​

CSS

.outerBox 
    display: table;
    height: 400px;
    #position: relative; /* ie hack */
    overflow: hidden;
    border: 1px solid red;


.helper 
    #position: absolute; /* ie hack */
    #top: 50%; /* ie hack */
    display: table-cell;
    vertical-align: middle;


.boxWithUnknownHeight 
    #position: relative; /* ie hack */
    #top: -50%;
    border: 1px solid green
​

它可以工作,即使我通过 Firebug 等添加文本和换行符。为了让你的 CSS 免受无效 CSS-Hacks 的影响,我建议你使用 conditional comments 并创建带有浏览器特定代码的单独 CSS。

未知高度的垂直居中是如何工作的以及为什么:Detailed description


其他解决方案display: table 和或display: table-cell 和或绝对定位here。

【讨论】:

【参考方案7】:

我认为最不突兀和最不令人困惑的答案是在 &lt;h1&gt; 元素之前插入一个 &lt;span&gt; 标签:http://jsfiddle.net/Wexcode/axRxE/

HTML:

<div>
    <span></span><h1>Text</h1>
</div>​

CSS:

div  text-align: center; /* horizontally center */ 
div span 
    height: 100%;
    vertical-align: middle;
    display: inline-block; 
div h1 
    vertical-align: middle;
    display: inline-block; ​

将此技术扩展为与浏览器高度垂直对齐:http://jsfiddle.net/Wexcode/axRxE/1/

【讨论】:

感谢您提供的出色解决方法!我为不支持的浏览器写了一个后备here 您在 &lt;span&gt;&lt;h1&gt; 标记之间添加的空格会影响垂直对齐。 我没有发现任何工作。这个简直太棒了,谢谢伙计! :before 伪元素会更简单。 jsfiddle.net/6kk8yyxk/1【参考方案8】:

我对所有事情都使用表格。当某些东西已经存在时,我个人不喜欢使用display: table 或类似的东西。

<table style="width: 100%; height: 100%;">
    <tr>
        <td>
            <!-- Whatever you want vertically and horizontally centered -->
        </td>
    </tr>
</table>

使用同样的方法,您可以针对您的情况执行以下操作:

<div id="container-div" style="position: relative">
    <div id="random-content-that-changes-container-height-and-width" style="height: 600px; width: 400px;">
    <div style="position: absolute; top: 0; right: 0; left: 0; bottom: 0">
        <table style="width: 100%; height: 100%;">
            <tr>
                <td>
                    <!-- Whatever you want vertically and horizontally centered -->
                </td>
            </tr>
         </table>
     </div>
</div>

【讨论】:

人们担心语义类 (impressivewebs.com/avoid-nonsemantic-classes) 而您使用表格元素进行布局? 没关系,显然是一个老评论,但如果你仍然是,请检查:***.com/a/84986/2848941【参考方案9】:

我有最简单的 3 行 css 会让你大吃一惊,你会想“为什么我一开始没有想到这个”。在您希望垂直居中放置的元素上使用它,并且父容器只需添加 100% 的高度。

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

位置可以是相对的、绝对的或固定的。

【讨论】:

【参考方案10】:

在 2012 年,接受的答案是正确/最佳选择。

快进 8 年,flex boxes are supported by every mainstream browser (IE10+):

display: flex;
align-items: center;
flex-direction: column;  /* To also center horizontally, change to `rows` or remove */

注意:如果您关心 IE10,则需要根据我上面的超链接包含 -ms- 前缀版本。

【讨论】:

是的,我也更喜欢 flex 而不是 top: 50%transform: translateY(50%) 或表格

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

如何在固定高度的div内垂直居中动态高度的图像?

如何使文字在div中水平和垂直居中的css代码

在具有动态高度的div中垂直居中图像[重复]

文本DIV水平居中和垂直居中

如何在 Bootstrap 列中垂直居中 div? [复制]

body高度100%怎么让div在body里面垂直居中