文章目录

  • 一、鼠标行为
    • 1、clientX/Y
    • 2、pageX/Y
    • 3、screenX/Y
    • 4、offsetX/Y
    • 5、layerX/Y(不推荐使用)
    • 6、x/y(不推荐使用)
  • 二、pageX|Y封装
  • 三、拖拽事件
    • 1、mousedown 鼠标按下事件
    • 2、mousemove 鼠标移动事件
    • 3、mouseup 鼠标抬起事件
    • 4、拖拽案例
  • 四、封装拖拽函数

一、鼠标行为

box.onclick = function(e) {var e = e || window.event;console.log(e.clientX); // ...
}

1、clientX/Y

  • 鼠标相对于当前可视区域的坐标(不包括滚动条的距离)

2、pageX/Y

  • 鼠标位置相对于当前文档的坐标(包括滚动条的距离)

IE9以下不支持 (jQuery标准)

3、screenX/Y

  • 鼠标位置相对于屏幕的坐标

4、offsetX/Y

  • 鼠标位置相对于块元素的坐标(包含边框)

safari 不包括边框

5、layerX/Y(不推荐使用)

  • 鼠标位置相对于当前文档的坐标

IE11以下:鼠标位置相对于当前可视区域的坐标

6、x/y(不推荐使用)

  • 鼠标位置相对于当前可视区域的坐标

Firefox不支持(老版肯定不支持)

二、pageX|Y封装

// 获取滚动距离
function getScrollOffset() {if(window.pageXOffset) {return {left: window.pageXOffset,top: window.pageYOffset}}else {return {left: document.body.scrollLeft + document.documentElement.scrollLeft,top: document.body.scrollTop + document.documentElement.scrollTop}}
}// 封装获取pageXY值方法
function pagePos(e) {var sLeft = getScrollOffset().left, // x轴的滚动距离sTop = getScrollOffset().top, // y轴的滚动距离cLeft = document.documentElement.clientLeft || 0, // 文档x轴偏移距离cTop = document.documentElement.clientTop || 0; // 文档y轴偏移距离return {x: e.clientX + sLeft - cLeft,y: e.clientY + sTop - cTop}
}

三、拖拽事件

1、mousedown 鼠标按下事件

2、mousemove 鼠标移动事件

3、mouseup 鼠标抬起事件

4、拖拽案例

// 获取元素的pageX 跟 pageY
function pagePos(e) {var sLeft = getScrollOffset().left, // x轴的滚动距离sTop = getScrollOffset().top, // y轴的滚动距离cLeft = document.documentElement.clientLeft || 0, // 文档x轴偏移距离cTop = document.documentElement.clientTop || 0; // 文档y轴偏移距离return {x: e.clientX + sLeft - cLeft,y: e.clientY + sTop - cTop}
}// 获取滚动条距离的方法
function getScrollOffset() {if(window.pageXOffset) { // 该方法在IE9以下不支持console.log(window.pageXOffset,window.pageYOffset);return {left: window.pageXOffset,top: window.pageYOffset}}else {return { // 在chrome中他俩必定有一个为0,所以就相加left: document.body.scrollLeft + document.documentElement.scrollLeft,top: document.body.scrollTop + document.documentElement.scrollTop}}
}// 获取元素属性的方法
function getStyles(elem, prop) {if(window.getComputedStyle) {if(prop) {return window.getComputedStyle(elem)[prop];}else {return window.getComputedStyle(elem);}}else {if(prop) {return elem.currentStyle[prop];}else {return elem.currentStyle;}}
}var box = document.getElementsByTagName('div')[0];// 拖拽案例逻辑
box.onmousedown  = function(e) {var e = e || window.event;x = pagePos(e).x - parseInt(getStyles(box, 'left'));y = pagePos(e).y - parseInt(getStyles(box, 'top'));document.onmousemove = function(e) {var e = e || window.event;box.style.left = pagePos(e).x - x + 'px';box.style.top = pagePos(e).y - y + 'px';}document.onmouseup = function(e) {this.onmousemove = null;this.onmouseup = null;}}

四、封装拖拽函数

function elemDrag(elem) {var x,y;addEvent(elem, 'mousedown', function(e) {var e = e || window.event;// x = PageX - elem.leftx = pagePos(e).x - getStyles(elem, 'left');y = pagePos(e).y - getStyles(elem, 'top');addEvent(document, 'mousemove', mouseMove);addEvent(document, 'mouseup', mouseUp);// 阻止事件冒泡跟默认事件cancelBubble(e);preventDefaultEvent(e);});function mouseMove(e) {var e = e || window.event;elem.style.left = pagePos(e).x - parseInt(x) + 'px';elem.style.top = pagePos(e).y - parseInt(y) + 'px';}function mouseUp(e) {var e = e || window.event;removeEvent(document, 'mousemove', mouseMove);removeEvent(document, 'mouseup', mouseUp);}
}

【JavaScript 进阶之旅 DOM篇 第九章】鼠标行为、pageX|Y封装、拖拽事件封装相关推荐

  1. 【JavaScript进阶之旅 ES6篇 第十五章】Set、Map、Set跟Map跟Array跟Object的对比

    文章目录 一.Set 1.基本用法 2.Set.prototype 二.Map 1.基本用法 a. 键名为对象时 b. 普遍对象不能实现键值一一对应 c. Map数据结构实现键为对象的一一对应 d. ...

  2. threejs进阶,管道几何体高级应用,geometry几何体应用,可拖拽改变形状的管道

    threejs进阶,管道几何体高级应用,geometry几何体应用,可拖拽改变形状的管道 一.threejs是什么? 二.geometry几何体使用步骤 1.引入库 2.如果使用谷歌浏览器打不开报错, ...

  3. JavaScript中的拖拽事件且限制出界

    JavaScript中的拖拽事件限制出界 JavaScript事件中很多都会用到拖拽,而在现实中很多拖拽是会限制在浏览器界面禁止出界的,下面是封装好的限制出界的拖拽事件. function drag( ...

  4. 鸟哥的Linux私房菜(基础篇)- 第九章、文件与文件系统的压缩与打包

    第九章.文件与文件系统的压缩与打包 最近升级日期:2009/08/20 在 Linux 底下有相当多的压缩命令可以运行喔!这些压缩命令可以让我们更方便从网络上面下载大型的文件呢!此外,我们知道在 Li ...

  5. 前端基础进阶(十):面向对象实战之封装拖拽对象

    https://segmentfault.com/a/1190000012646488  https://yangbo5207.github.io/wutongluo/ 说明:此处只是记录阅读前端基础 ...

  6. javascript event click/dblclick left/right区分左键、右键、双击事件,排除点击事件与拖拽事件冲突,做防抖优化

    /*** 函数防抖(目标时间段内,目标函数只执行最后一次)* @param {*} func 目标函数* @param {*} wait 目标时间段* @param {*} immediate 是否立 ...

  7. 【JavaScript进阶之旅 函数式编程篇 第三十四章】函数组合、结合律、pointfree、使用案例

    文章目录 一.函数组合 1.左倾(高阶函数的左倾) 2. 组合多个函数 方法一(使用while) 方法二:优化组合函数(使用reduceRight) 二.结合律 三.pointfree 一.函数组合 ...

  8. JavaScript学习笔记之DOM篇,带你全面了解什么是DOM

    DOM在前面的JavaScript学习笔记(一)–JS基础里简单提到过,它是浏览器厂商提供的用来控制html / css 的代码的文档对象模型,是JavaScript的重要组成部分,现在带大家详细了解 ...

  9. JavaScript进阶面向对象ES6整合篇

    整合篇整体内容比较多,详细点可以查询目录 文章目录 一.JavaScript面向对象 1.面向对象编程介绍 2.ES6中的类和对象 3.类的继承 4.案例:面向对象案例 二.构造函数和原型 1. 构造 ...

最新文章

  1. 服了!会 Python 找工作这么容易?
  2. 去创业公司不能有一夜暴富的侥幸,更不能指望掉馅饼
  3. xps13 linux 硬盘分区,在xps13上安装ubuntu16.04教程
  4. 深度学习的实用层面 —— 1.7 理解Dropout
  5. SPM-using Maven and Juint
  6. 微服务设计模式(上)
  7. idea ---- 快捷键
  8. MongoDB副本集配置系列六:定位MongoDB慢的原因
  9. Latex空格一个字符\空格
  10. 一起学Hive——总结复制Hive表结构和数据的方法
  11. AspUpload实时上传进度的AJAX方法
  12. 《CSAPP》(第3版)答案(第三章)(一)
  13. VIVO手机测试指令代码大全
  14. 开源者的自我修养|为 ShardingSphere 贡献了千万行代码的程序员,后来当了 CEO...
  15. Java物联网企业级项目 亿可控系统分析与设计
  16. 3A技术的介绍以及CISCO路由器上相关配置
  17. matlab随机函数rand取值范围,Matlab随机函数rand使用中应注意的问题
  18. 如何编写 INF 文件
  19. vivo手机html卸载不了,vivo手机怎么彻底卸载删除软件残留的垃圾文件呢
  20. AU cc2022 Win如何成功安装不闪退 Audition 2022安装包安装方法 新版本功能介绍

热门文章

  1. 番茄花园ROM下载地址
  2. python 中iloc_iloc索引之间的Python差异
  3. Html标签大全列表(按字母排序)
  4. 想要做好网赚那么需要具备这些能力!
  5. linux命令chgrp,Linux命令Chgrp 详解
  6. 自定义hamcrest的Matcher
  7. Python YYDS,轻松控制你的手机!
  8. 重学音视频?认识 MP4 视频(上)
  9. 你连对外接口签名都不会知道?有时间还是要学习学习。
  10. Python-Tkinter图形化界面设计