本篇文章给大家带来的内容是关于js中鼠标事件和距离属性的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
js中有很多“距离”,为了不会混淆这里总结一下其中部分距离
本文包括元素属性
相关的距离和鼠标事件
中的距离,废话不多说,进入正文
先补充一下,本文的测试环境如下:
Chrome Dev 54.0.2840.71Firefox 49.0
Opera 41.0
Safari 10.1
IE 11。
前四者运行在macOS Sierra 10.12上,IE11运行在搭载windows10 1607的虚拟机上
元素属性中的各种“距离”
元素属性中的距离有以下6对:
scrollLeft: 设置或获取位于对象左边界和窗口中可见内容的最左端之间的距离scrollTop: 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
offsetHeight: 获得对象的可视区域的高度,包括边框
offsetWidth: 获得对象的可视区域的宽度,包括边框
clientHeight: 获得对象边框内部分的高度
clientWidth: 获得对象边框内部分的宽度
offsetLeft: 获取对象相对于版面或由offsetParent属性指定的父坐标的计算左侧位置
offsetTop: 获取对象相对于版面或由offsetTop属性指定的父坐标的计算顶端位置
clientTop: 获取对象顶部边框宽度
clientLeft: 获取对象左侧边框宽度
scrollWidth: 获取对象的滚动宽度
scrollHeight: 获取对象的滚动高度。
上面提到了offsetParent属性,其实当前p相对谁定位,这个属性就是谁。根据position值不同,有以下2种情况
当父辈元素都没有relative属性时,无论当前元素的position是absolute,relative,fixed或fixed,offsetParent都是body元素
父辈元素有relative属性时,无论当前元素的position是absolute,relative,fixed或fixed,offsetParent是具有relative属性的最近父元素
分不清楚? 看下图
这个里面可以清晰的看到上方的前4对,和他们之间的关系。
关于jQuery的元素距离属性,文章最后整理了他们和DOM属性之间的关系。
第一个值得强调的是,上面的这个例子中的p的box-sizing属性是默认的content-box, 它的offsetHeight,clientHeight,clientWidth和offsetWidth有如下关系:
clientHeight = height + paddingTopWidth + paddingBottomWidth;clientWidth = width + paddingLeftWidth + paddingRightWidth;
offsetHeight = clientHeight + borderTopWidth + borderBottomWidth;
offsetWidth = clientWidth + borderLeftWidth + borderRightWidth;
如果box-sizing属性是border-box,那么,它们的关系将如下(ie6 ie7默认是这样的):
offsetHeight = height;offsetWidth = width;
clientHeight = height - borderTopWidth - borderBottomWidth;
clientWidth = width - borderLeftWidth - borderRightWidth;
第二个值得强调的是,这个例子中,由于它的父元素没有设置position:relative,所以图中这个p利用position:absolute;相对文档定位,如果给他添加一个具有position:relative属性的父p,那么offsetLeft和offsetTop就是下图这样:
不过无论它怎么的定位,哪怕是position:relative或fixed,它的计算关系也不会发生变化,依然是:
offsetLeft = left + marginLeft;
offsetTop = top + marginTop;
讲了这么多,那么scrollWidth和scrollHeight呢?scrollWidth和scrollHeight在不同浏览器里面并不一致,如下图(从左到右依次是Chrome, Firefox, Opera, Safari, IE11)
其实仔细研究这个里面的不同,会发现在不同的浏览器p的offsetLeft、offsetTop这两个值的属性并不完全相同。当p里面的内容溢出时,只有IE保留了padding的全部值,chrome、opera和safari会忽略padding-right的值视其为0,firefox会同时忽略padding-right和padding-bottom,如下图
在各个浏览器中,对于滚动条本身的渲染也不一样。它们会在计算scrollWidth和scrollHeight时排除各自的滚动条宽度。除了上述的不同,实际发现每个浏览器中scrollLeft和scrollTop的最大值也不一样,甚至差距极大,由于scrollLeft和scrollTop随滚动事件发生而输出,博主就上述例子的最大值记录如下:
maximum value | chrome | Firefox | opera | safari | IE11 |
---|---|---|---|---|---|
scrollLeft | 330 | 160 | 827 | 330 | 217 |
scrollTop | 230 | 210 | 485 | 230 | 330 |
实际上就是由于这些元素属性在不同浏览器中的差异导致scrollWidth和scrollHeight的不同,具体使用应格外注意。不过博主看过一些资料表示这两个属性和offsetParent有关,通过实际编程发现它们和offsetParent无关,这里不展开描述了,因为低版本浏览器,尤其ie7 ie6的实现方式可能会比较奇葩。
鼠标事件中的各种“距离”
鼠标事件很多,不过每个事件中关于距离的属性含义是一样的,这里用mousemove来讲解,具体的内容会在不久之后写到了js事件部分讲解。
鼠标实现对于现在的浏览器来说,实现都是一样的了,下面例子都在Chorme中实现。
鼠标事件有以下6对:
event.clientX:相对浏览器左上角的水平坐标event.clientY:相对浏览器左上角的垂直坐标
event.offsetX:相对于事件源(event.target||event.srcElement)左上角水平偏移
event.offsetY:相对于事件源(event.target||event.srcElement)左上角垂直偏移
event.pageX:相对于document左上角的水平坐标
event.pageY:相对于document左上角的垂直坐标
event.layerX:相对于offsetParent左上角的水平偏移
event.layerY:相对于offsetParent左上角的水平偏移
event.movementX:相对于前一次事件中screenX的偏移
event.movementY:相对于前一次事件中screenY的偏移
event.screenX:相对于屏幕左上角的水平坐标
event.screenY:相对于屏幕左上角的垂直坐标
x:和pageX一样,用于兼容IE8及以前浏览器
y:和pageY一样,用于兼容IE8及以前浏览器
总之,还是先看图
*这个图中,黑色实线边框表示浏览器可视区域部分,外层蓝色虚线框表示整个DOM部分,整个图为电脑屏幕
图里面怎么没有movementX和movementY?因为这个事件的值和上一个事件有关,关系如下:
currentEvent.movementX = currentEvent.screenX - previousEvent.screenXcurrentEvent.movementY = currentEvent.screenY - previousEvent.screenY
值得注意的时offsetX和offsetY,他表示鼠标到事件源padding左上角的的偏移,这里mousemove事件注册在window上,所以位置如图所示。
当浏览器的水平滚动条滑动以后,pageX和clientX就不同了。同理,当浏览器的垂直滚动条滑动以后,pageY和clientY就不同了,但它们始终存在以下关系:
event.pageX = event.clientX + body.scrollLeft;event.pageY = event.clientY + body.scrollTop;
鼠标事件中的距离比元素中的简单一些,具体的使用放在之后写的事件部分。
jQuery中元素距离属性
var $p = $("#p");$p.width(); //元素宽度,不包括padding和border
$p.height(); //元素高度,不包括padding和border
$p.innerWidth(); //元素内宽度,包括padding,不包括border
$p.innerHeight(); //元素内高度,包括padding,不包括border
$p.outterWidth(); //元素可见宽度,包括padding和border
$p.outterHeight(); //元素可见高度,包括padding和border
$p.outterWidth(true); //元素全部宽度,包括padding、border和margin
$p.outterHeight(true); //元素全部高度,包括padding、border和margin
相关推荐:
以上是js中鼠标事件和距离属性的介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver CS6
视觉化网页开发工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中