2008-11-20 76 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