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下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
面向对象继承实例(a如何继承b问题)(自写)
Jul 01 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
jquery中animate的stop()方法作用实例分析
Jan 30 Javascript
谈一谈javascript闭包
Jan 28 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 Javascript
mui上拉加载功能实例详解
Apr 13 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
原生JavaScript之es6中Class的用法分析
Feb 23 Javascript
Vue管理系统前端之组件拆分封装详解
Aug 23 Javascript
一行JavaScript代码如何实现瀑布流布局
Dec 11 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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python3 拼接字符串的7种方法
2018/09/12 Python
python线性插值解析
2020/07/05 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
交通专业个人自荐信格式
2013/09/23 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
高中校园广播稿
2014/10/21 职场文书
党员带头倡议书
2015/04/29 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
德生2P3收音机开箱评测
2022/04/30 无线电
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js