JS获取元素相对于文档的坐标
2010-09-26 10:03
489 查看
获取元素相对于文档的坐标最简单的方法是用Event对像的offseX/offsetY或layerX/layerY 属性。在实现了offsetX/offxetY这两个属性的浏览器中。获取的坐标都算正常的。可是实现了layerX/layerY 属性 的浏览器中获取的坐标会有一些问题。
在 ie,chrome,opera,firefox,safari 这些主流的浏览器中只有 firefox没实现offsetX/offsetY这两个属性,而取代(不知道能不能说算是取代)它们的是layerX/layerY
文档上说这两个属性返回相对于触发事件的对象,鼠标位置的x/y坐标 可是经过测试后,结果并不是那么一回事。
后来才知。在FireFox中Event对像的layerX/layerY 这两个属性只有在当前触发事件对像的CSS 属性 position 值不为static时。才能获取到正确的值。
下面代码是在网上找到一个兼容各浏览器获取元素位置的方法
在 ie,chrome,opera,firefox,safari 这些主流的浏览器中只有 firefox没实现offsetX/offsetY这两个属性,而取代(不知道能不能说算是取代)它们的是layerX/layerY
文档上说这两个属性返回相对于触发事件的对象,鼠标位置的x/y坐标 可是经过测试后,结果并不是那么一回事。
后来才知。在FireFox中Event对像的layerX/layerY 这两个属性只有在当前触发事件对像的CSS 属性 position 值不为static时。才能获取到正确的值。
下面代码是在网上找到一个兼容各浏览器获取元素位置的方法
function getElementPos(elementId) { var ua = navigator.userAgent.toLowerCase(); var isOpera = (ua.indexOf('opera') != -1); var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof var el = elementId; if(el.parentNode === null || el.style.display == 'none') { return false; } var parent = null; var pos = []; var box; if(el.getBoundingClientRect) //ie :经过测试好像目前所有类型的浏览器都实现了这个方法 { box = el.getBoundingClientRect(); var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft); return {x:box.left + scrollLeft, y:box.top + scrollTop}; }else if(document.getBoxObjectFor) // gecko { box = document.getBoxObjectFor(el); var borderLeft = (el.style.borderLeftWidth)?parseInt(el.style.borderLeftWidth):0; var borderTop = (el.style.borderTopWidth)?parseInt(el.style.borderTopWidth):0; pos = [box.x - borderLeft, box.y - borderTop]; } else // safari & opera { pos = [el.offsetLeft, el.offsetTop]; parent = el.offsetParent; if (parent != el) { while (parent) { pos[0] += parent.offsetLeft; pos[1] += parent.offsetTop; parent = parent.offsetParent; } } if (ua.indexOf('opera') != -1 || ( ua.indexOf('safari') != -1 && el.style.position == 'absolute' )) { pos[0] -= document.body.offsetLeft; pos[1] -= document.body.offsetTop; } } if (el.parentNode) { parent = el.parentNode; } else { parent = null; } while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { // account for any scrolled ancestors pos[0] -= parent.scrollLeft; pos[1] -= parent.scrollTop; if (parent.parentNode) { parent = parent.parentNode; } else { parent = null; } } return {x:pos[0], y:pos[1]}; }
相关文章推荐
- js获取元素到文档区域document的(横向、纵向)坐标的两种方法
- js获取元素到文档区域document的(横向、纵向)坐标的两种方法
- 中高级前端应该必会,js实现事件委托代理、切换样式、元素获取相对于文档位置等
- js获取窗口相对于屏幕左边和上边的位置坐标
- Js获取元素在页面里的坐标位置和宽高
- Js获取元素相对适口位置
- 获取元素到文档区域document的坐标的两种方法总结
- jquery获取html元素的绝对位置坐标和相对父元素的位置坐标方法
- js统计元素元素路径,获取某元素相对指定父元素得路径
- 获取元素相对于屏幕的绝对坐标
- 获取弹出框里面元素相对于整个浏览器窗口的坐标
- js获取文档有多少元素节点
- js 获取页面元素的坐标值
- JS获取area元素坐标和鼠标在页面中的位置
- JS 获取页面元素坐标
- js 获取元素坐标
- js获取窗口相对于屏幕左边和上边的位置坐标
- jQuery中获取相对文档的坐标的方法是什么?
- js获取触发事件元素的坐标
- js向body创建对象、对象属性、对象事件,js获取元素坐标、元素边框大小、真实大小