【问题标题】:Vertically align text within a div [duplicate]垂直对齐 div 中的文本 [重复]
【发布时间】:2012-03-04 04:42:19
【问题描述】:

下面的代码(也可作为a demo on JS Fiddle 使用)不会将文本放置在中间,正如我所希望的那样。即使使用margin-top 属性,我也找不到任何方法将div 中的文本垂直居中。我该怎么做?

<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>
#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;        
}

【问题讨论】:

标签: css vertical-alignment


【解决方案1】:

2016 年 4 月 10 日更新

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

body {
    height: 150px;
    border: 5px solid cyan; 
    font-size: 50px;
    
    display: flex;
    align-items: center; /* Vertical center alignment */
    justify-content: center; /* Horizontal center alignment */
}
Middle

可以在CSS Tricks 上阅读关于 flexbox 的良好指南。感谢 Ben(来自 cmets)指出这一点。没时间更新。


一位名叫 Mahendra 的好人发布了一个非常有效的解决方案 here

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

.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;
}

【讨论】:

  • 不再是,规范已更改,以上大部分内容现已弃用。 [stackoverflow.com/questions/16280040/… 不过使用 flexbox 的逻辑是合理的,比如:display:flex; justify-content:center; align-items:center;
  • 这是唯一对我有用的东西
【解决方案2】:

我知道这完全是愚蠢的,你通常真的不应该在不创建表时使用表,但是:

表格单元格可以将多行文本垂直居中对齐,默认情况下甚至可以这样做。所以一个很好的解决方案可能是这样的:

HTML:

<div class="box">
  <table class="textalignmiddle">
    <tr>
      <td>lorem ipsum ...</td>
    </tr>
  </table>
</div>

CSS(使表格项始终适合盒子 div):

.box {
  /* For example */
  height: 300px;
}

.textalignmiddle {
  width: 100%;
  height: 100%;
}

请看这里: http://www.cssdesk.com/LzpeV

【讨论】:

    【解决方案3】:

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

    #column-content strong {
        ...
        vertical-align: middle;
    }
    

    另请参阅您的updated example

    === 更新 ===

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

    HTML:

    ... <span>yet another text content that should be centered vertically</span> ...
    

    CSS:

    #column-content span {
        vertical-align: middle;
    }
    

    另见next example

    【讨论】:

      【解决方案4】:

      如果您需要多行,这是最简单的方法。将 span'd 文本包裹在另一个 span 中,并使用 line-height 指定其高度。多行的诀窍是重置内部spanline-height

      <span class="textvalignmiddle"><span>YOUR TEXT HERE</span></span>
      
      .textvalignmiddle {
          line-height: /* Set height */;
      }
      
      .textvalignmiddle > span {
          display: inline-block;
          vertical-align: middle;
          line-height: 1em; /* Set line height back to normal */
      }
      

      DEMO

      当然,外部的span 可以是div 或者你有什么。

      【讨论】:

        【解决方案5】:

        这应该是可行的:

        #column-content {
                --------
            margin-top: auto;
            margin-bottom: auto;
        }
        

        我在你的演示上试过了。

        【讨论】:

        • 这应该与margin:auto 0 相同,其中第一个值('auto')用于上下边距,第二个值(0)用于左右边距。跨度>
        • 你是对的!但这样对初学者来说更清楚,你的评论让它更聪明。谢谢!
        • 这仅适用于使用display:flexdisplay:griddisplay:inline-tabledisplay:inline-grid 的父元素。不适用于旧版浏览器
        【解决方案6】:

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

        /* Firefox */
        display: flex;
        justify-content: center;
        align-items: center;
        

        当您想将框置于屏幕或其直接祖先的中心时,会出现 Omar 代码的问题,否则会出现问题。这种居中是通过将其位置设置为

        来完成的

        position: relative;position:static;(不带位置:绝对或固定)。

        然后 margin: auto;margin-right: auto;左边距:自动;

        在此框居中对齐环境下,Omar 的建议不起作用。它在 Internet Explorer 8 中也不起作用(但市场份额为 7.7%)。因此,对于 Internet Explorer 8(和其他浏览器),应考虑采用上述其他解决方案中的解决方法。

        【讨论】:

        • 这对我有用,谢谢,包括当我使用 float:left: 创建一行按钮时。解释其工作原理的复杂性暗示了 CSS 的一般困难:您无法使用任何单个指令来实现将 DIV 内的文本居中的简单效果。您必须组合多个属性,如果不在不同的上下文(包括不同的浏览器)中尝试它们,就很难预见它们如何与其他属性结合使用。
        【解决方案7】:

        接受的答案不适用于多行文本。

        我按照here 的解释更新了 JSfiddle to show CSS multiline text vertical align

        <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;
        }
        

        它也适用于“又一个...”中的&lt;br /&gt;

        【讨论】:

        • 我认为表格单元格应该在包装器上,其次,如果包装器具有绝对位置,它将停止工作
        【解决方案8】:

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

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

        div
        {
          height: 200px;
          line-height: 200px; /* <-- this is what you must define */
        }
        &lt;div&gt;vertically centered text&lt;/div&gt;

        B.) 如果您有多行文本:

        div
        {
          height: 200px;
          line-height: 200px;
        }
        
        span
        {
          display: inline-block;
          vertical-align: middle;
          line-height: 18px; /* <-- adjust this */
        }
        &lt;div&gt;&lt;span&gt;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&lt;/span&gt;&lt;/div&gt;

        【讨论】:

        • 如果您使用 XHTML 过渡作为 DOCTYPE,则多行解决方案不起作用。
        • 我必须添加 text-align:center;也到父 div。否则当文本只占一行时,跨度将占 div 的不到 100% 并左对齐。
        • 除了不遵守 word-wrap: break-word 之外,它的工作很好,在这种情况下它被破坏了。
        • 如果您不想设置 line-height - 您可以简单地使用 line-height: initial; 或...... ...line-height: normal; :)
        • 所以这个答案只是:“测量多少像素使文本足够接近并对其进行硬编码”?
        【解决方案9】:

        为您的文本内容创建一个容器,也许是 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;
        }
        <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>

        JSFiddle

        【讨论】:

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

        试试这个:

        HTML

        <div><span>Text</span></div>
        

        CSS

        div {
            height: 100px;
        }
        
        span {
            height: 100px;
            display: table-cell;
            vertical-align: middle;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-04-26
          • 2018-10-24
          • 2012-12-09
          • 2017-01-17
          • 1970-01-01
          • 2017-03-03
          • 2018-10-29
          • 1970-01-01
          • 2013-05-17
          相关资源
          最近更新 更多