Получить экранные координаты элемента DOM
могу ли я как-то получить точные координаты экрана (относительно верхнего левого угла экрана) объекта DOM. Через NPAPIFireBreath или JavaScript. (Нужно это для плагина, который я пишу с Крокс)
3 ответов
вы перемещаете курсор в какое-то место страницы и делаете событие щелчка.(найдите окно, затем GetWindowRect, caculate sutable position), затем вы можете поймать событие, записать clientX и clientY. Таким образом, вы строите мост между двумя различными системами координат.
Я знаю, что вы не упомянули jQuery, но вы можете использовать http://api.jquery.com/offset/ в качестве примера. Он сочетает в себе offsetLeft/top
всех родителей и учетных записей для прокрутки, давая вам точный x, y (по отношению к телу) для вложенных узлов.
обратите внимание, что если вы обрабатываете события, объект event всегда сообщает вам, где произошло событие, используя http://api.jquery.com/event.pageX/ и http://api.jquery.com/event.pageY/
опять же, упоминание jQuery для вдохновения, только если вы не хотите его использовать.
вот как это делает jQuery
$.fn.offset = function (options) {
var elem = this[0],
doc = elem && elem.ownerDocument;
if (!doc) {
return null;
}
if (elem === doc.body) {
return jQuery.offset.bodyOffset(elem);
}
return getOffset(elem, doc, doc.documentElement);
}
function getOffset(elem, doc, docElem, box) {
try {
box = elem.getBoundingClientRect();
} catch(e) {}
// Make sure we're not dealing with a disconnected DOM node
if (!box || !jQuery.contains(docElem, elem)) {
return box ? {
top: box.top,
left: box.left
} : {
top: 0,
left: 0
};
}
var body = doc.body,
win = getWindow(doc),
clientTop = docElem.clientTop || body.clientTop || 0,
clientLeft = docElem.clientLeft || body.clientLeft || 0,
scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
top = box.top + scrollTop - clientTop,
left = box.left + scrollLeft - clientLeft;
return {
top: top,
left: left
};
}
element.offsetLeft\Top
не работает так, как должно быть в вопрос.
Из HTML вы можете получить координаты относительно верхнего левого угла пространства страницы, а не самого экрана пользователя.
и из плагина, by GetWindowRect()
функция winAPI вы можете получить координаты верхнего левого угла окна браузера относительно экрана пользователя и по GetClientRect()
вы можете получить координаты верхний левый угол прямоугольника клиента.
но это не та же самая точка, что вверху слева от страницы, всегда есть что-то между углом пространства страницы и клиентским прямоугольником или оконным прямоугольником. Он включает в себя лучшие браузерные бары и другие вещи.
что можно сделать? Кажется, что нет простого 100% контролируемого способа:
вы можете попробовать рассмотреть эти панели браузера и рассчитать пространство между Client rect
и прямоугольник страницы, но эти панели браузера не постоянны от пользователя к пользователю, один может иметь больше из них, что другой, и вы получите всю вашу систему координат облажались. Затем вы можете как-то зарегистрировать количество установленных баров и дополнений в браузере и в соответствии с этим рассчитать объем пространства, который будет потребляться ими, но бары и дополнения не совпадают, и снова у вас слишком много переменных для рассмотрения.
есть немного более простой способ, вы можете пойти не сверху, а снизу - получи рук в нижней точке rect и через некоторые вычисления с помощью HTML element.offset
привязать систему координат к нижней левой точки окна.
У вас нет пользовательских браузеров внизу, и поэтому вы можете быть немного более уверены в пространстве между страницей и окном, но некоторые браузеры получили всплывающие окна с информацией о загрузке e.т. c, и здесь мы снова все испортили.
другой вариант-использовать модальное окно - т. е. открыть страницу в модальном окне через window.open()
от ваш JavaScript, вы можете контролировать количество элементов управления браузером и баров в этих окнах, вы можете избавиться от всех этих юзербары и сделать ясное окно только с адресной панелью и страницей. Теперь у вас есть гораздо больше контроля, и можете быть почти уверены, что это пространство между углами будет одинаковым для всех пользователей... почти.
Есть две вещи, которые необходимо упомянуть:
1) некоторые браузеры (например, google chrome, как я помню) получили эти пользовательские дополнения браузера (Firebug для пример) появляться в виде маленьких значков рядом с адресной панелью, и они все еще появляются рядом с адресной панелью модального окна.
Какая разница, вы можете спросить-разница в том, что по какой-то причине верхняя часть окна браузера станет примерно на 5 пикселей толще, если есть хотя бы один из этих значков.(опять же, вы можете попробовать зарегистрироваться, есть ли какие-либо из них, установленных в браузере пользователя, или нет)
И если, в любом случае, эти 5px не важны для вас - это может быть путь.. если вы в порядке со следующим вещь.
2)очевидно одно-что потеха с модальными окнами может быть дискомфортна для конечного пользователя, потому что она режет некоторые contols браузера и механики к которым пользователи браузера привыкают.