【问题标题】:Getting an element's inner height获取元素的内部高度
【发布时间】:2012-11-06 07:13:08
【问题描述】:

如何在没有填充和边框的情况下获得元素的内部高度?

没有 jQuery,只有纯 JS,以及跨浏览器解决方案(包括 IE7)

【问题讨论】:

  • 为什么不在css中使用border-box?这样你就不必担心这些事情了......然后你可以使用offsetHeight 它将返回没有边距的正确高度。
  • 对于我制作的没有 CSS 控件的插件,这是一个非常具体的问题,我只需要使用我得到的东西
  • 所以...我想您仍然可以设置box-sizing: border-box,这样可以节省您一些时间和麻烦。
  • 我不能,因为我的插件在其他人的网站上运行,我不能以任何可能损害设计的方式更改他们的 CSS 设置
  • 是的,但是这个 css 设置不适用于旧 IE,而且,如果我开始更改 CSS,可能还有其他适用于网页的代码可能会计算错误。这总是一个坏主意。永不改变,只在不是您自己的网页时使用您拥有的东西

标签: javascript dom


【解决方案1】:
var style = window.getComputedStyle(document.getElementById("Example"), null);
style.getPropertyValue("height");

以上版本可以在现代浏览器中使用。 IE浏览器请查看currentStyle。

【讨论】:

  • 你的意思是:parseInt(style.getPropertyValue('height'));
  • 如果 css jsfiddle.net/Kxsvx 中没有高度,Internet Explorer 将返回“auto”,因此您没有它的高度!
  • @Mic 哪个 Internet Explorer?
  • 记住:如果box-sizing 设置为border-box,您仍然需要减去填充和边框值。
【解决方案2】:

从 cmets 编辑:

http://jsfiddle.net/hTGCE/1/(比预期更多的代码)

在互联网上你可以找到这样的功能:

  function getRectangle(obj) {

          var r = { top: 0, left: 0, width: 0, height: 0 };

          if(!obj)
             return r;

          else if(typeof obj == "string")
             obj = document.getElementById(obj);


          if(typeof obj != "object")
             return r;

          if(typeof obj.offsetTop != "undefined") {

             r.height = parseInt(obj.offsetHeight);
             r.width  = parseInt(obj.offsetWidth);
             r.left = r.top = 0;

             while(obj && obj.tagName != "BODY") {

                r.top  += parseInt(obj.offsetTop);
                r.left += parseInt(obj.offsetLeft);

                obj = obj.offsetParent;
             }
          }
          return r;
       }

如果你想减去填充/边框宽度是在css文件中设置的,而不是在样式属性中动态的:

    var elem = document.getElementById(id);
    var borderWidth = 0;

          try {
             borderWidth = getComputedStyle(elem).getPropertyValue('border-top-width');

             } catch(e) {

             borderWidth = elem.currentStyle.borderWidth;
          } 
    borderWidth = parseInt(borderWidth.replace("px", ""), 10);

和与填充相同。然后你计算它。

【讨论】:

  • 在互联网上你可以找到各种垃圾代码。我想要这个谜团的终极答案,而不是臃肿、缓慢的代码..但感谢您的回答:)
  • 如果元素的动态高度没有 CSS 属性“height”,则使用“getComputedStyle”的方法将不起作用。还是我错了?
  • 好的。我认为带有“getComputedStyle ...”的代码只是读出了css属性并且如果不存在“高度”则不计算它。
  • 所以我试了一下,IE又很特别:如果没有高度,你会得到自动值:jsfiddle.net/Kxsvx
  • 好侦探工作麦克风! IE8及以下确实显示了它的丑陋面孔。但是对于这个简单的事情必须有一个更简单的解决方案..
【解决方案3】:

我遇到了同样的问题,发现没有本地跨平台解决方案,但是解决方案很简单

var actual_h = element.offsetHeight;

            if(parseInt(element.style.paddingTop.replace('px','')) > 0){
                actual_h=actual_h -  parseInt(element.style.paddingTop.replace('px',''));

            }
            if(parseInt(element.style.paddingBottom.replace('px','')) > 0){
                actual_h=actual_h -  parseInt(element.style.paddingBottom.replace('px',''));

            }

【讨论】:

  • 请注意,作为 MDN states,“style 属性通常对于了解元素的样式没有用处,因为它仅表示在元素的内联 @987654324 中设置的 CSS 声明@ 属性 [...]"。
【解决方案4】:

您可以简单地使用clientHeight 和clientWidth 属性。

MDN web doc for Element.clientHeight — clientWidth 的工作方式完全相同。

【讨论】:

  • 这将包括填充。
【解决方案5】:

clientHeight - 给出高度包括 padding,但没有 边框。

getComputedStyle - 一种利用元素的 CSS 规则并检索属性值(填充)的方法

使用parseInt 是一种去除单位并仅保留数值(以像素 为单位)的方法
parseFloat 也可用于更精确的亚像素测量

请注意,DOM API 会自动将所有值转换为像素

function getInnerHeight( elm ){
  var computed = getComputedStyle(elm),
      padding = parseInt(computed.paddingTop) + parseInt(computed.paddingBottom);

  return elm.clientHeight - padding
}

演示:

// main method
function getInnerHeight( elm ){
  var computed = getComputedStyle(elm),
      padding = parseInt(computed.paddingTop) + parseInt(computed.paddingBottom);
  
  return elm.clientHeight - padding
}

// demo utility function
function printInnerHeight( selector ){
  console.clear()
  console.log(
    getInnerHeight( document.querySelector(selector) )
  )
}
body{ display: flex; padding:0; margin: 0; }
div{ flex: 1; }

.demo1{
  padding-top: 2vh;
  padding-bottom: 1vh;
  margin: 30px;
  border: 10px solid salmon;
  box-sizing: border-box;
  outline: 1px solid red;
}

.demo2{
  padding-top: 2vh;
  padding-bottom: 4vh;
  margin: 30px;
  border: 10px solid salmon;
  border-bottom-width: 0;
  height: 150px;
  outline: 1px solid red;
}


p::before{
  content: '';
  display: block;
  height: 100%;
  min-height: 50px;
  background: lightgreen;
}
<div>
  <h2>inner height should be ~50px</h2>
  <button onclick="printInnerHeight('.demo1')">Get Inner Height</button>
  <p class='demo1'></p>
</div>
<div>
  <h2>inner height should be ~150px</h2>
  <button onclick="printInnerHeight('.demo2')">Get Inner Height</button>
  <p class='demo2'></p>
</div>

【讨论】:

  • 所以,这句话,但querySelector 真的应该从printInnerHeight 移动到getInnerHeight
  • @RegularJoe - 它没有。 getInnerHeight 接受一个参数,该参数是检测高度的元素,它不应该有任何现有 DOM 元素的概念,并且不适用于任何给定的可见元素
猜你喜欢
  • 2012-01-30
  • 2016-04-27
  • 2013-12-28
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2014-09-14
  • 2018-04-25
  • 2011-08-05
相关资源
最近更新 更多