functiongetDocumentOffsetPosition(el) { var position = { top: el.offsetTop, left: el.offsetLeft }; if (el.offsetParent) { var parentPosition = getDocumentOffsetPosition(el.offsetParent); position.top += parentPosition.top; position.left += parentPosition.left; } return position; }
4. 使用循环避免递归
为了避免递归带来的大量调用栈,可以使用 while 循环来计算元素相对于文档的位置:
1 2 3 4 5 6 7 8 9
functiongetDocumentOffsetPosition(el) { let top = 0, left = 0; while (el !== null) { top += el.offsetTop; left += el.offsetLeft; el = el.offsetParent; } return {top, left}; }
5. jQuery 方法
如果使用 jQuery,可以使用 .offset() 方法来获取元素相对于文档的位置:
1 2 3
var el = $("#element"); var position = el.offset(); console.log("left: " + position.left + ", top: " + position.top);
核心代码
获取元素相对于视口的位置
1 2
var rect = element.getBoundingClientRect(); console.log(rect.top, rect.right, rect.bottom, rect.left);
functiongetDocumentOffsetPosition(el) { var position = { top: el.offsetTop, left: el.offsetLeft }; if (el.offsetParent) { var parentPosition = getDocumentOffsetPosition(el.offsetParent); position.top += parentPosition.top; position.left += parentPosition.left; } return position; }
使用循环避免递归
1 2 3 4 5 6 7 8 9
functiongetDocumentOffsetPosition(el) { let top = 0, left = 0; while (el !== null) { top += el.offsetTop; left += el.offsetLeft; el = el.offsetParent; } return {top, left}; }
jQuery 获取元素相对于文档的位置
1 2 3
var el = $("#element"); var position = el.offset(); console.log("left: " + position.left + ", top: " + position.top);