Хотя я не могу найти любую документацию по этой, казалось бы, фундаментальной проблеме, проблема, которую вы заметили, наиболее вероятна, потому что процесс компоновки (иначе называемый "перекомпоновка") еще не запущен к тому моменту, когда вы запрашиваете координаты.
Процесс компоновки / перекомпоновки принимает DOM страницы с любыми стилями страницы и определяет положение и размеры элементов и других частей страницы (вы можете попробовать прочитать Примечания по перекомпоновке HTML , хотя он не предназначен для веб-разработчиков и, вероятно, немного устарел).
Этот процесс перекомпоновки не запускается синхронно после любого изменения в DOM, в противном случае код, такой как
elt.style.top = "5px";
elt.style.left = "15px";
обновит макет дважды, что неэффективно.
С другой стороны, запрос позиции / размера элементов (по крайней мере через .offsetTop
) должен заставить макет возвращать правильную информацию. Это не происходит в вашем случае по какой-то причине, и я не уверен, почему.
Пожалуйста, создайте простой тестовый пример, демонстрирующий проблему, и отправьте сообщение об ошибке на bugzilla.mozilla.org (CC me - asqueella@gmail.com).
Я предполагаю, что это связано с макетом XUL, который менее надежен, чем HTML; Вы можете попробовать создать облако в HTML-документе в iframe или, по крайней мере, в , используя createElementNS для создания реальных элементов HTML вместо xul: div , который вы создаете с помощью текущего кода.