[Вставка из ответа, который я дал здесь ]
Нативный getBoundingClientRect()
метод существует уже довольно давно и делает именно то, о чем просит вопрос. Плюс он поддерживается во всех браузерах (включая IE 5, кажется!)
С эта страница MDN:
Возвращаемое значение представляет собой объект TextRectangle, который содержит свойства Только для чтения слева, сверху, справа и снизу, описывающие рамку в пикселях, с верхним левым относительно верхнего левого окна просмотра .
Вы используете это так:
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;