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 相关文章推荐
js 日期转换成中文格式的函数
Jul 07 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
Mar 13 Javascript
js实现div拖动动画运行轨迹效果代码分享
Aug 27 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
Jun 20 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
Mar 09 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
JQuery常见节点操作实例分析
May 15 jQuery
解决pycharm双击但是无法打开的情况
Oct 31 Javascript
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
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_SELF的安全问题
2009/09/05 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
php图片上传类 附调用方法
2016/05/15 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
python求解水仙花数的方法
2015/05/11 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
python数据分析:关键字提取方式
2020/02/24 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
生产部管理制度
2014/01/31 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
颐和园的导游词
2015/01/30 职场文书
爱国电影观后感
2015/06/19 职场文书