Javascript 元素偏移量始终为0

Javascript 元素偏移量始终为0,javascript,jquery,Javascript,Jquery,我正在使用一个带有链接列的表,单击链接时,我想获取行的偏移量。我尝试使用element.offsetTop和$(element.offset()。top和两者都返回0父元素也返回0作为其偏移量top 我试过了 function getTop(element) { var top = findPosY(element); console.log(top); } function findPosY(obj) { var curtop = 0; if (obj.offset

我正在使用一个带有链接列的表,单击链接时,我想获取行的偏移量。我尝试使用element.offsetTop和$(element.offset()。top和两者都返回0父元素也返回0作为其偏移量top

我试过了

function getTop(element)
{
   var top = findPosY(element);
   console.log(top); 
}

function findPosY(obj) {
   var curtop = 0;
   if (obj.offsetParent) {
      while (obj.offsetParent) {
         curtop += obj.offsetTop
         obj = obj.offsetParent;
      }
   }
   else if (obj.y)
     curtop += obj.y;
   return curtop;
}

但是y位置仍然返回0。

偏移父项取决于您的样式。它明确指出offsetParent在某些情况下可能返回null。你应该检查一下那些箱子

如果您有jquery,我建议使用它们的offset函数来获得y偏移


if语句中的while循环也是冗余的。您不需要if,因为while循环计算相同的内容,如果该条件为false,则不会执行。

下面的函数将沿着DOM树,计算其路径上的位置。它返回一个属性为
.x
.y
的对象,因此
getPosition(element).y
将给出页面顶部的像素数

   /**
   * returns the absolute position of an element regardless of position/float issues
   * @param {HTMLElement} el - element to return position for 
   * @returns {object} { x: num, y: num }
   */
  function getPosition(el) {

    var x = 0,
        y = 0;

    while (el != null && (el.tagName || '').toLowerCase() != 'html') {
        x += el.offsetLeft || 0; 
        y += el.offsetTop || 0;
        el = el.parentElement;
    }

    return { x: parseInt(x, 10), y: parseInt(y, 10) };
  }

希望这有帮助;)

我刚刚遇到了这个问题,罪魁祸首是我添加了
contain:content
到一个父元素,这显然会影响.offsetTop值。

对于在此登陆的任何人,我建议使用
getBoundingClientRect()
获取元素相对于文档的顶部和左侧位置,或者获取元素的大小及其相对于视口的位置

  var div = document.getElementById("myDiv");
  var rect = div.getBoundingClientRect();
  x = rect.left;
  y = rect.top; // how far from the top of the view port
  w = rect.width;
  h = rect.height;

听起来两个语句都不是真的,所以它返回0。或者obj.y=0,offsetTop=0。你也可以发布你的HTML吗?可能是JSFIDLE复制了这个问题?它可以工作,但有一个大错误:)需要分配el=el.offsetParentWhy?它向上导航父元素,记录它们的偏移量。由于嵌套较大,一些块仅被包装在几个块中(角度、反应等),所有这些块都有相同的“偏移量”,所有这些都将被计数,数字将非常错误。我不确定我是否遵循。也许你可以把要点或代码笔联系起来?