【问题标题】:line-height as a percentage not working行高百分比不起作用
【发布时间】:2020-10-22 06:47:11
【问题描述】:

我遇到了线高问题,我无法完全理解。

以下代码将在 div 中居中显示图像:

CSS

.bar {
    height: 800px;
    width: 100%;
    line-height:800px;
    background-color: #000;
    text-align: center; 
}

.bar img {
    vertical-align: middle;   
}

HTML

<div class="bar">
    <img src="http://27.media.tumblr.com/yHWA4oxH870ulxnoH7CkOSDR_500.jpg" alt="Foo Image" />
</div>

但是,如果我将行高改为100%,那么行高就不会生效(或者至少不会变成div的100%)。

Example jsfiddle

有谁知道我做错了什么?

【问题讨论】:

    标签: css


    【解决方案1】:

    line-height: 100% 表示该元素的字体大小的 100%,而不是其高度的 100%。事实上,行高总是相对于字体大小,而不是高度,除非它的值使用绝对长度单位(pxpt 等)。

    【讨论】:

    • 啊。总是让我犯傻的错误。谢谢!当它允许我时,我会接受你的回答。
    • 显然他们的规范作者错误地认为没有人愿意设置相对于元素高度的字体大小/行高...
    • @Andy:好消息是this will soon be made possible through the use of cascading variables。只有几年的等待......
    • @BoltClock 啊,酷!那样就太好了。谢谢你告诉我!
    • vh 是一个例外。在 CSS3 中,如果您将其设置为 100vh,它实际上会像某些开发人员可能想要的那样工作。但请注意,它不适用于不支持 CSS3 的旧浏览器。
    【解决方案2】:

    我知道这个问题很老,但我发现什么对我来说是完美的解决方法。

    我将此 css 添加到我想要居中的 div 中:

    div:before {
      content: "";
      display: inline-block;
      height: 100%;
      vertical-align: middle;
    }
    

    这每次都有效,而且很干净。

    编辑: 只是为了完成,我使用 scss 并且我有一个方便的 mixin,我包含在每个 parent 谁是我想要垂直居中的直接孩子:

    @mixin vertical-align($align: middle) {
      &:before {
        content: "";
        display: inline-block;
        height: 100%;
        vertical-align: $align;
        // you can add font-size 0 here and restore in the children to prevent
        // the inline-block white-space to mess the width of your elements
        font-size: 0;
      }
      & > * {
        vertical-align: $align;
        // although you need to know the font-size, because "inherit" is 0
        font-size: 14px;
      }
    }
    

    完整解释: div:before 将在 div 内添加一个元素,但在其任何子元素之前。当使用:before:after 时,我们必须使用content: 声明,否则不会发生任何事情,但出于我们的目的,内容可以为空。然后我们告诉元素和它的父元素一样高,只要它的父元素的高度被定义并且这个元素至少是 inline-block。 vertical-align 定义了 self 与 parent 相关的垂直位置,而 text-align 的工作方式不同。

    @mixin 声明适用于 sass 用户,它的使用方式如下:

    div {
        @include vertical-align(middle)
    }
    

    【讨论】:

    • 虽然其他答案都是正确的,但这可能是解决上述问题最干净优雅的解决方案了。
    • 不是答案,但最有用!
    • 你能详细解释一下那里发生了什么吗?我不太明白
    • @Valdrinit 我将编辑答案并提供更多解释
    【解决方案3】:

    当您使用百分比作为行高时,它不是基于 div 容器,而是基于字体大小。

    【讨论】:

      【解决方案4】:

      line-height: 100% 将是垂直居中元素的一种简单方法,如果它是相对于容器计算的,但这太容易了,因此它不起作用。

      因此,它只是另一种说法 line-height: 1em(对吧?)

      另一种垂直居中元素的方法是:

      .container {
           position:relative;
      }
      .center {
           position:absolute;
           top:0; left:0; bottom:0; right:0;
           margin: auto;
           /* for horiz left-align, try "margin: auto auto auto 0" */
      }
      

      【讨论】:

      • 这对我不起作用...不确定我是否遗漏了什么。
      • @clifgriffin,尝试在容器和“中心”子项上设置固定的宽度和高度,确保子项小于容器。孩子最终应该在容器内水平和垂直居中。
      • 那太容易了,因此它不起作用 +1 :-)
      • @clifgriffin 确保容器具有正确的宽度和高度,您可以将所有内容放在相同大小的 div 中。这是我必须做出的调整。
      • @user3576887 “这太容易了,因此它不起作用”正是我不赞成这一点的原因 - 有一个很好的理由说明它不能按照您想要的方式工作在这里,不应出于娱乐、批评或任何应有的目的而掩盖这一点。
      【解决方案5】:

      可能不漂亮,但它的工作原理和它的语义;

      <div class="bar" style="display: table; text-align: center;">
          <img style="display: table-cell; vertical-align: middle;" src="http://27.media.tumblr.com/yHWA4oxH870ulxnoH7CkOSDR_500.jpg" alt="Foo Image" />
      </div>
      

      display: table-cell 为元素提供了独特的垂直对齐表格能力(至少我认为它是独一无二的)

      【讨论】:

      • 感谢您的回答,我尝试了您的代码,但它似乎对我不起作用。
      • 嗯,有点奇怪;如果您可以发布一些代码以便我仔细查看它,我可能会提供更多帮助
      • Olsson - 我刚刚将您的代码粘贴到 JSFiddle 中,但它不起作用。感谢您提供帮助 - 但我现在可以设置绝对行高。如果情况发生变化,我将进一步调查您的答案。再次感谢您的帮助!
      【解决方案6】:

      这是一个非常晚的答案,但是在现代浏览器中,假设父元素也是屏幕高度的 100%,您可以使用 vh 视口单元。 FIDDLE

      line-height: 100vh;
      

      Browser support

      【讨论】:

      • 一种罕见的合法使用 vh 而不是 %。
      【解决方案7】:

      此解决方案适用于 IE9 及更高版本。首先,我们将孩子的顶部位置设置为 50%(父母的中间)。然后使用translate 规则,将孩子向上移动其实际高度的一半。主要好处是我们不需要定义孩子的高度,它是由浏览器动态计算的。 JSFiddle

      .bar {
          height: 500px;
          text-align: center;
          background: green;
      }
      .bar img {
          position: relative;
          top: 50%;
          transform: translate(0, -50%);
      }
      

      【讨论】:

        【解决方案8】:

        更现代的方法是为此使用 flexbox,它更简单、更干净。然而,flexbox 与过去的 inline-blockfloatposition 完全不同。

        要对齐 .parent 中的项目,您可以这样做:

        .parent {
          display: flex;
          align-items: center;
        }
        

        就是这样。 flex 父项的子项会自动转换为弹性子项。

        您应该阅读有关 flexbox 的更多信息,这是一个很好的起点:https://css-tricks.com/snippets/css/a-guide-to-flexbox/

        【讨论】:

          【解决方案9】:

          您可以根据该元素高度设置 line-height。如果元素高度为 200px 意味着您需要将行高设置为 200px 以使文本居中。

          span {
            height: 200px;
            width: 200px; 
            border: 1px solid black;
            line-height: 200px; 
            display: block;
          }
          &lt;span&gt;Im vertically center&lt;/span&gt;

          【讨论】:

            【解决方案10】:

            这是现代解决方案,您需要在容器 div 或外部 div 中设置以下 CSS。

            .outer-div {
              display: flex;
              justify-content: center;
              align-items: center; 
            }
            

            以下解决方案可能适用于您要垂直居中的元素。请注意,外部或容器 div 应该是

            .inner-div {
                position: absolute;
                top: 50%; 
                left: 50%;
                transform: translate(-50%,-50%);
                text-align: center;
            }
            

            请注意,外部或容器 div 的位置应该是相对的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-20
              • 2013-05-14
              • 2011-01-20
              • 2017-09-27
              • 2014-01-13
              • 2011-08-05
              • 2022-12-02
              相关资源
              最近更新 更多