2008-11-20 2 views
12

Я пытаюсь сделать позиционирование в JavaScript. Я использую кумулятивную функцию позиции на основе classic quirksmode function, которая суммирует offsetTop и offsetLeft для каждого offsetParent до верхнего узла.Что сделало бы offsetParent null?

Однако я столкнулся с проблемой, когда интересующий меня элемент не имеет offsetParent в Firefox. В IE offsetParent существует, но offsetTop и offsetLeft все суммируются до 0, поэтому он имеет ту же проблему, что и в Firefox.

Что привело бы к тому, что элемент, который хорошо виден и может использоваться на экране, не имеет offsetParent? Или, более практично, как я могу найти положение этого элемента, чтобы выложить его под ним?

Edit: Вот как воспроизвести один конкретный экземпляр этого (не решен в настоящее время общепринятого ответа):

  1. Открыть home page of Stack Overflow.
  2. Выполните следующий код в консоли веб-браузера (например, 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 
    

Почему является offsetParent этого элемента null?

+1

Пожалуйста, отправьте пример кода. –

+1

Пример реального мира, показывающий неисправный элемент, помог бы ... – PhiLho

+0

В вашем случае это из-за 'position: fixed' - нет родительского макета – Bergi

ответ

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 сам видна, и родительский видна.

Я видел тонким Firefox 3.6 и Chrome 5. Это, кажется, также влияет на getBoundingClientRect() функции на element3, что действительно раздражает, так что работает во многих других случаях!

11

https://developer.mozilla.org/en/DOM/element.offsetParent

offsetParent возвращает нуль, когда элемент имеет style.display установлен на "ни один".

+2

На мой ответ ниже я теперь редактировал страницу MDN, чтобы отметить, что есть и другие ситуации для не-FF-браузеров, которые также вызывают ситуацию. – Phrogz

4

offsetParent вернет null, если объект элемента еще не добавлен в DOM.

36

Я сделал a test of 2,304 divs с уникальными комбинациями значений для position, display и visibility, вложено в уникальных комбинациях каждый из этих значений, и определил, что:

в противном случае-действительный элемент
, что является потомком из <body>
не будет иметь значение, если offsetParent:

  • элемент имеет position:fixed (Webkit и IE9)
  • Элемент имеет display:none (Webkit и FF)
  • Любой предок display:none (Webkit и FF)

Кроме того, разумно ожидать, что элемент который не имеет родителя или не добавлен к самой странице (не является потомком <body> на странице), также будет offsetParent==null.

+0

Сохранено меня, спасибо! – SeanKendle

Смежные вопросы