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 相关文章推荐
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
Jan 29 Javascript
jquery中常用的SET和GET
Jan 13 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
Jan 22 Javascript
node.js中的socket.io的广播消息
Dec 15 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 Javascript
javascript 操作cookies详解及实例
Feb 22 Javascript
js中字符型和数值型数字的互相转化方法(必看)
Apr 25 Javascript
VueJs 搭建Axios接口请求工具
Nov 20 Javascript
json对象及数组键值的深度大小写转换问题详解
Mar 30 Javascript
微信小程序使用wxParse解析html的方法示例
Jan 17 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
逐步提升php框架的性能
2008/01/10 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
javascript String 对象
2008/04/25 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
vue实现评论列表功能
2019/10/25 Javascript
合并百度影音的离线数据( with python 2.3)
2015/08/04 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
python logging设置level失败的解决方法
2020/02/19 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
关于爱国的标语
2014/06/24 职场文书
合作意向书
2014/07/30 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书