2008-11-20 80 views
12

我想在JavaScript中进行定位。我正在使用基于classic quirksmode function的累积位置函数,其中每个offsetParent总计offsetTopoffsetLeft,直到顶部节点为止。什么会使offsetParent为空?

但是,我遇到了一个问题,我感兴趣的元素在Firefox中没有offsetParent。在IE中存在offsetParent,但offsetTopoffsetLeft全部总和为0,所以它具有与Firefox中相同的问题效果。

什么会导致在屏幕上清晰可见和可用的元素没有offsetParent?或者更实际一点,我如何才能找到这个元素的位置,以便在它下面放置一个下拉菜单?

编辑:下面是如何重现这一特定实例(而不是由当前接受的答案解决):

  1. 打开home page of Stack Overflow
  2. 运行在web浏览器的控制台(例如Chromev21)以下代码:

    var e = document.querySelector('div'); 
    console.log(e); 
    // <div id="notify-container"></div> 
    do{ 
        var s = getComputedStyle(e); 
        console.log(e.tagName,s.display,s.visibility,s.position,e.offsetParent); 
    } while(e=e.parentElement) 
    // DIV block visible fixed null 
    // BODY block visible static null 
    // HTML block visible static null 
    

这是为什么元件nulloffsetParent

+1

请张贴一些示例代码。 – 2008-11-20 18:20:38

+1

一个现实世界的例子显示错误的元素将有助于... – PhiLho 2008-11-20 18:59:00

+0

在你的情况,这是因为`位置:固定' - 没有布局父母 – Bergi 2012-07-24 21:39:43

回答

15

如果文档尚未完成加载,然后offsetParent可以为空

0

我遇到了这个问题,当兄弟只是元素的左边是隐藏的:

<div id="parent"> 
    <div id="element1">some stuff</div> 
    <div id="element2" style="display: none">some hidden stuff</div> 
    <div id="element3">child whose offset we want</div> 
</div> 

我碰到的情况下的offsetParent元素3为空即使元素3本身是可见的,并且父类是可见的。

我见过薄是火狐3.6和Chrome 5,这似乎也影响getBoundingClientRect()功能上元素3,这实在是烦人,因为这工作在许多其他情况下!当该元素具有的style.display设置为 “无”

4

offsetParent如果元素对象尚未附加到DOM,则会返回null。

36

我已a test of 2,304 divs与值的唯一组合为positiondisplay,和visibility,嵌套在每一个那些值的唯一组合,并确定:

否则-有效元件
即后代的<body>
不会有如果offsetParent值:

  • 该元件具有position:fixedWebKit和IE9
  • 该元件具有display:noneWebKit和FF
  • 不限祖代display:noneWebKit和FF

这也是合理的期望,一个元件没有父项,或没有添加到页面本身(不是页面的<body>的后裔),也将有offsetParent==null