JavaScript中获取鼠标位置相关属性总结


Posted in Javascript onOctober 11, 2014

javascript并没有mouse对象,获取鼠标坐标要靠强大的event对象。

我们通过监听document的mousemove,就可以实时获得鼠标位置。

但是!!event中和鼠标相关的属性太多了,很让人头大!如下:

event.layerX event.layerY
event.clientX event.clientY
event.pageX event.pageY
event.offsetX event.offsetY
event.screenX event.screenY
event.x event.y

共计6组!

而且他们的区别并不明显,各浏览器间还不兼容!

这篇文章的目的就是搞清楚他们的区别,以及选出那些不推荐使用的。

测试代码

直接运行下列代码:

<!DOCTYPE html><br />

<html xmlns="http://www.w3.org/1999/xhtml"><br />

<head><br />

<meta charset="utf-8" /></p>

<style>

body {position:relative;}

 div {min-height: 300px; background-color: #eee;}

 #jg {right: 0; top: 10px; position: fixed; background-color: #f00;}

</style>

<p></head><br />

<body><br />

<span id="jg">显示结果</span><br />

<input type="button" value="一个按钮" /></p>

<div>屏内div</div>

<div style="height:1000px; width:2000px; background:#ddd;">很高很宽。。。</div>

<div>屏外DIV</div>

<p></body><br />

<script>

var jg = document.getElementById('jg');

document.onmousemove = function  (e) {

 e = e || window.event;

 jg.innerHTML = 'layerX:'+e.layerX+

     ',layerY:'+e.layerY+

     ', <br/>clientX:'+e.clientX+

     ',clientY:'+e.clientY+

     ', <br/>pageX:'+e.pageX+

     ',pageY :'+e.pageY+

     ',<br/>offsetX:'+e.offsetX+

     ',offsetY:'+e.offsetY+

     ',<br/>screenX:'+e.screenX+

     ',screenY:'+e.screenY+

     ',<br/>x:'+e.x+

     ',y:'+e.y;

}

</script><br />

</html>

测试过程中发现一个神器:chrome(谷歌浏览器)和IE9全兼容以上所有属性!用来比较他们就非常方便了。

经过对比,结果如下:

各属性释义

clientX与Y,是鼠标相对于浏览器视口(即滚动条之外的部分忽略掉)的坐标;所有浏览器都支持。

screenX与Y,是鼠标相对于整个屏幕左边(顶边)的坐标,基本与document脱节了;全兼容。

offsetX与Y,是鼠标相对于当前所指向对象的坐标,鼠标此时指向按钮,则offsetX是相对于这个按钮;firefox不支持

x与y,同标准浏览器的layerX与Y,是IE中可以用来代替layerX的属性

pageX与Y,是鼠标相对于整个页面左边(顶边)的坐标,包括视口之外的;IE7,8不支持。

重点:layerX与layerY

layerX与Y是标准浏览器出的新属性,IE9也支持。他可以用来代替offsetX与Y.但是,他的定义为:相对于当前指向元素最近的有定位信息的元素的坐标。这个“有定位”是指有非默认定位的css属性(即非static)。

如果,当前指向的元素就有定位,那么layerX与Y就返回相对于此元素的坐标;否则,就查看此元素的父标签;还是没有定位的话,就继续;一直到根元素——html节点。

所以,在firefox中,想要offsetX值,就必须加入position定位信息!

兼容性总结:

1,firefox不支持offsetX,offsetY与x,y属性,但完全可以用layerX代替他们;
2,ie中的x,y相当于firefox&chrome中的layerX与layerY;
3,ie7,8的document的边界与浏览器窗口的边界有2px的距离,所以在窗口最大化时screenX最小都有2px;
4,ie9中的layerX与Y,虽然有值,但却莫名其妙的不正确,貌似与html标签有关,比如我的例子的代码,把滚动条拖到最右边,鼠标从空白慢慢移动到大DIV上,此时大DIV的最右边与第一个DIV的最右边的差值也会算进layerX中。。。后头元素越来越多,这个计算就越复杂;而firefox与chrome的layerX则没有这个问题。所以,不要在IE9中使用layerX.
5,在chrome中,x与y虽然有值,但是是和clientX与Y完全相同! 所以,不建议使用x,y属性。

兼容性补救

标准浏览器中可以用position与event.layerX配合来实现event.offsetX属性;

IE7,8中没有pageX,pageY,只有用document.documentElement.scrollLeft+event.clientX来求出。

所以,IE中的x,y或者offsetX,offsetY可以去掉一个了。

Javascript 相关文章推荐
Div Select挡住的解决办法
Aug 07 Javascript
JS setCapture 区域外事件捕捉
Mar 18 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
Sep 08 Javascript
QQ空间顶部折页撕开效果示例代码
Jun 15 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
提升jQuery的性能需要做好七件事
Jan 11 Javascript
js指定步长实现单方向匀速运动
Jul 17 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
详解CommonJS和ES6模块循环加载处理的区别
Dec 26 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
javascript实现贪吃蛇小游戏
Jul 28 Javascript
js实现磁性吸附的示例
Oct 26 Javascript
JavaScript中最简洁的编码html字符串的方法
Oct 11 #Javascript
原生Javascript封装的一个AJAX函数分享
Oct 11 #Javascript
探讨js字符串数组拼接的性能问题
Oct 11 #Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 #Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
Oct 10 #Javascript
js点击button按钮跳转到另一个新页面
Oct 10 #Javascript
jQuery获取iframe的document对象的方法
Oct 10 #Javascript
You might like
php操作csv文件代码实例汇总
2014/09/22 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
node.js实现端口转发
2016/04/14 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
住房公积金接收函
2014/01/09 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
员工离职通知函
2015/04/25 职场文书
八月一日观后感
2015/06/10 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
JavaScript原型链详解
2021/11/07 Javascript