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 相关文章推荐
实现超用户体验 table排序javascript实现代码
Jun 22 Javascript
Jquery 高亮显示文本中重要的关键字
Dec 24 Javascript
JavaScript聚焦于第一个字段的代码
Oct 15 Javascript
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
js获取数组的最后一个元素
Apr 14 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
基于Node.js的大文件分片上传示例
Jun 19 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
Aug 15 Javascript
layui中select,radio设置不生效的解决方法
Sep 05 Javascript
JS正则表达式验证端口范围(0-65535)
Jan 06 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 for 循环语句使用方法详细说明
2010/05/09 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
js变量以及其作用域详解
2020/07/18 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
python快速排序代码实例
2013/11/21 Python
python 默认参数问题的陷阱
2016/02/29 Python
深入理解Python中的*重复运算符
2017/10/28 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
python名片管理系统开发
2020/06/18 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
视光学专业毕业生推荐信
2013/10/28 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
通讯稿格式及范文
2015/07/22 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
mysql函数全面总结
2021/11/11 MySQL
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python