Event对象的5种坐标
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:editor 阅读 221
使用鼠标事件经常碰到这样的需求,比如获取鼠标相对于事件源的位置,鼠标相对于事件源对象父元素的位置。。。但是你懂的,浏览器实在太不和谐了,兼容性且不说,各种坐标属性看得人头昏眼花,极容易混淆。好吧,我

使用鼠标事件经常碰到这样的需求,比如获取鼠标相对于事件源的位置,鼠标相对于事件源对象父元素的位置。。。但是你懂的,浏览器实在太不和谐了,兼容性且不说,各种坐标属性看得人头昏眼花,极容易混淆。好吧,我来总结一下:


 

测试浏览器:IE8, Chrome13,  FF8, Safari5, Opera11

先上测试用例(用HTML5的doctype测试,也可看出未来的发展趋势,其他doctype可自行测试):

  

问:怎样获取鼠标相对于浏览器可视文档区域左上角的位置?

答:x, y和clientX, clientY皆可,但是x, y在IE下表示鼠标相对于文档开头的位置(即如果有滚到条的话,会计算在内),还有FF也不支持x, y

  推荐: clientX, clientY

 

 

问:怎样获取鼠标相对于文档开头的位置?

答:   IE:使用x, y(前提是事件源的父元素(一直到documentElement)没有设置position:relative之类的,否则相对于最近元素,而非相对于文档)

  非IE:使用pageX, pageY

  layerX, layerY其实也可以,但是IE和Opera不支持!

  那么如何确保IE正常取值呢?答:event.clientX + document.documentElement.scrollLeft,  event.clientY + document.documentElement.scrollTop

 

 

问:怎样获取鼠标相对于事件源(event.target||event.srcElement)左上角的位置?

答:offsetX, offsetY。但是FF不支持,怎样办呢?

  1. 先获取鼠标相对于浏览器可视文档区域左上角的位置

  2. 然后获取事件源相对于浏览器可视文档区域左上角的位置

  3. 相减,收工

 

 

也许有人会问,这第2步怎么做啊?好吧,好人做到底!

HTMLElement.getBoundingClientRect()方法

返回值为:{top:xx, right:xx, bottom:xx, left:xx, width:xx, height:xx}

也就是说,一个元素的位置信息都给了,我们要做的就是:

 
经测试,所有浏览器都和event.offsetX, event.offsetY保持一致(当然FF除外)

 

 

我的例子中,最后还检测了scrollLeft, scrollTop, clientLeft, clientTop,本来以为它们几个会作怪,可测试结果表明:

除了scrollTop,其他都是0(当然scrollLeft是因为没出现横向滚动条所致)

scrollTop各浏览器表现不尽相同,如下:

body.scrollTop的情况

  IE, FF, Opera:0

  Chrome, Safari:向上滚动的距离

documentElement.scrollTop的情况

  IE, FF, Opera:向上滚动的距离

  Chrome, Safari:0

 

联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2