【问题标题】:How can I vertically center text in a dynamically height div?如何在动态高度 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 根据新高度垂直居中对齐。

谢谢。

【问题讨论】:

标签: html css centering


【解决方案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+ 的更好答案:stackoverflow.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>
      

      【讨论】:

      【解决方案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%) 或表格
        猜你喜欢
        • 2011-06-12
        • 2016-01-19
        • 2013-06-24
        • 2015-08-05
        • 2017-12-09
        • 1970-01-01
        • 2014-05-26
        • 2013-10-08
        • 1970-01-01
        相关资源
        最近更新 更多