获取元素在文档上的正确坐标

  如何获取元素在页面上的正确坐标呢, 我想很多人都会想到  elem.getBoundingClientRect 和 window.scrollTop / window.scrollLeft 的求和,实际上这种方法在大部分情况下的确是正确的, 但是在 ie6 ie7 中却并不正确, top 和 left 会比实际的值各多出 2px。

  这个2px 并不是 html 和 body 的 默认 border 造成的, 这是浏览器的容器边框宽度。

  就是下图中红框部分

  

  这个值如何去获得呢?

  先在 css reset 中 加入 html{ margin: 0} /* 兼容各浏览器的 html margin 呈现不统一 */

  然后,可以使用 (document.documentElement || document.getElementsByTagName('html')[0]).getBoundingClientRect() 去获得

  不过, 经过测试,代码在 ie 67 下可以获得 2 这个值,  ie6 为 0,  ie7 为2, 而 ie 8 却是 -2, 其他浏览器均为 0

  看来 ms 在 ie7除了 html 外加上 2, 在ie8 的时候 getBoundingClientRect 函数是通过内置 -2 的值的方式来修复的, 而 ie9 才真正修复了

 

  因此,这里还需要对该函数做 ie8 的兼容,加上部分其他问题的兼容,于是有了以下代码

//元素在文档上的坐标 v0.4 Alucelx
//http://www.cnblogs.com/Alucelx/archive/2011/12/11/2284082.html
function pageXY(elem){
	var rect = elem.getBoundingClientRect();
	var scrollTop = window.scrollTop || (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop || 0;
	var scrollLeft = window.scrollLeft || (document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft || 0;

	var html = document.documentElement || document.getElementsByTagName('html')[0];

	//修复ie 7 下的浏览器边框也被算在 boundingClientRect 内的 bug
	var deviation = html.getBoundingClientRect();
	//修复 ie8 返回 -2 的 bug
	deviation = { //FF 不允许修改返回的对象
		left:	deviation.left < 0 ? 0 : deviation.left,
		top:	deviation.top < 0 ? 0 : deviation.top
	};

	return {
		left:	rect.left + scrollLeft - deviation.left,
		top:	rect.top + scrollTop - deviation.top
	};
}

 使用时,传入要查询的元素 即可返回正确的位置

posted @ 2011-12-11 18:43  Alucelx  阅读(789)  评论(0编辑  收藏  举报