【问题标题】:JavaScript: Find DIV's line-height, not CSS property but actual line-heightJavaScript:查找 DIV 的行高,不是 CSS 属性,而是实际的行高
【发布时间】:2011-05-22 12:40:35
【问题描述】:

假设我有一个 DIV:<div></div>,我想用 JS 找出它的 line-height 是什么。我知道可以检查样式属性style.lineHeight,但我想检查 actual line-height,没有它,这取决于 CSS 规则的存在。

假设字体系列和字体大小相同,两者应该输出相同的行高

<div>One line of text</div>
<div>Two <br /> Lines of text</div>

如何使用 JavaScript 获取元素的 line-height

【问题讨论】:

    标签: javascript css


    【解决方案1】:

    现在有了window.getComputedStyle,这很容易。

    function getLineHeight(el: HTMLSpanElement) {
      return window.getComputedStyle(el).lineHeight;
    }
    

    【讨论】:

    • 这实际上对我有用。谢谢
    【解决方案2】:

    这对我来说是最好的方式。到目前为止对我来说没有错误

    function getLineHeight(element) {
    
    oldHtml = element.innerHTML
    
    element.innerHTML = "A"
    lineHeight = element.offsetHeight
    
    element.innerHTML = oldHtml
    
    return lineHeight }
    

    【讨论】:

      【解决方案3】:

      这相当复杂。我制作了一个 npm 包,用于将文本固定到一定数量的行数或像素高度。

      你不能只检查行高。有时那是normal,这根本没有帮助。

      您不能将文本放在另一个元素中,因为它可能会收到不同的样式。

      我发现最可靠的方法是从元素中删除所有文本并测量其高度。然后添加一条线并测量高度。第一行添加的高度并不总是与后续行相同。然后添加另一行。第二行和所有后续行都添加相同的数量。

      我的工具公开了一个名为 calculateTextMetrics() 的方法,该方法使用上述策略并返回结果测量值。

      https://github.com/tvanc/lineclamp#getting-text-metrics

      【讨论】:

        【解决方案4】:

        答案实际上是使用.clientHeight。正如 Gaby 所说,这并不是真正可靠/值得信赖的。然而,它是!这里:

        function getLineHeight(el) {
            var temp = document.createElement(el.nodeName), ret;
            temp.setAttribute("style", "margin:0; padding:0; "
                + "font-family:" + (el.style.fontFamily || "inherit") + "; "
                + "font-size:" + (el.style.fontSize || "inherit"));
            temp.innerHTML = "A";
        
            el.parentNode.appendChild(temp);
            ret = temp.clientHeight;
            temp.parentNode.removeChild(temp);
        
            return ret;
        }
        

        将你的元素的属性“克隆”成一个新的,获取新的clientHeight,删除临时元素,并返回它的高度;

        【讨论】:

        • 但要小心,因为您将其附加到文档中,它将继承该部分的样式。这并不意味着您测试的元素具有相同的line-height,因为某些内部规则可能会覆盖它。line-height 在整个文档中不是恒定的。..
        • 我想我刚刚修复了它,我确实从一开始就想到了这个,但我有点懒得把它放在那里哈哈。我用element.parentNode 替换了document:D
        • @Davy8:很高兴这在这么久之后仍然有用!
        • @MuhammadUmer:看看其他两个答案,你就会明白为什么它不是一个真正的选择。
        • @MuhammadUmer:是的,虽然它可能取决于很多事情......所以最好知道一个确切的值而不是模棱两可的正常
        【解决方案5】:

        这个解决方案对我有用。它使用明确设置的line-height 属性的值,或者,当未设置该值时,它通过查找对象的内容增加一行时的高度差来计算该值。

        function calculateLineHeight (element) {
        
          var lineHeight = parseInt(getStyle(element, 'line-height'), 10);
          var clone;
          var singleLineHeight;
          var doubleLineHeight;
        
          if (isNaN(lineHeight)) {
            clone = element.cloneNode();
            clone.innerHTML = '<br>';
            element.appendChild(clone);
            singleLineHeight = clone.offsetHeight;
            clone.innerHTML = '<br><br>';
            doubleLineHeight = clone.offsetHeight;
            element.removeChild(clone);
            lineHeight = doubleLineHeight - singleLineHeight;
          }
        
          return lineHeight;
        }
        

        【讨论】:

          【解决方案6】:

          在 quirksmode 中解释:http://www.quirksmode.org/dom/getstyles.html

          示例:http://www.jsfiddle.net/gaby/UXNs2/

          function getStyle(el,styleProp)
          {
              var x = document.getElementById(el);
              if (x.currentStyle)
                  var y = x.currentStyle[styleProp];
              else if (window.getComputedStyle)
                  var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
              return y;
          }
          

          并像使用它

          getStyle('test', 'line-height' )
          

          【讨论】:

          • 相当有趣,虽然它返回“正常”而不是数字,至少在 Chrome 中是这样。
          • 我不确定您是否可以从该案例中获得更多信息,因为normalline-height 的有效值。见stackoverflow.com/questions/3614323/…
          • 确实如此,但是当我写这个问题时,我正在寻找类似.clientWidth() 的东西,它用于检索元素的“真实”宽度。
          • 您可以使用元素的clientHeight,但它只需要一行即可工作(并且没有填充等。不太值得信赖)。另请注意,IE 也会返回normal,并且需要使用lineHeight 而不是line-height 调用它。
          • 是的,我想知道有没有办法像.clientHeight() 得到元素高度那样得到行高
          【解决方案7】:

          对于 IE,请参见 currentStyle,对于其他浏览器请参见 getComputedStyle()IE9 也支持)。

          【讨论】:

          • 虽然这个方法在第二个答案中有说明
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 2020-06-02
          • 1970-01-01
          • 1970-01-01
          • 2012-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多