js/es6 元素拖动
2019-01-21 02:40:41来源:博客园 阅读 ()
元素事件:鼠标按下事件/鼠标移动事件/鼠标松开事件
元素样式:让元素脱离文档流,采用绝对定位的方式。
一、鼠标按下事件
当鼠标在元素上面按下时,保存元素的初始偏移量和鼠标按下时的坐标,然后在状态变量里面标记当前状态为按下状态。
二、鼠标移动事件
当鼠标拖动元素移动时,我们通过计算鼠标从起始位到移动位之间的偏移量来求元素应该移动的距离。
元素移动距离= 初始坐标 + (鼠标拖动坐标 - 鼠标按下坐标 )
三、鼠标松开事件
当鼠标松开后,我们把状态变量重置为假,表示当前拖动结束。
HTML代码:
<!DOCTYPE html> <head> <meta charset="utf8"> <title>js拖动效果</title> <link rel="stylesheet" type="text/css" href="style.css"> <script src="node.js"></script> </head> <body> <div id="drag">拖动我!</div> <script> let o = document.querySelector("#drag"); let e = new NodeElement(o); e.draggable(); </script> </body> </html>
CSS代码:
#drag{ width: 100px; height: 100px; background: red; position:absolute; cursor: move; line-height: 100px; text-align: center; }
JS脚本代码:
'use strict'; /** 私有属性 */ const _nodexy = Symbol('_nodexy'); // 节点坐标 const _startxy = Symbol('_startxy'); // 起始坐标 const _mousedown = Symbol('_mousedown'); // 判断鼠标是否按下 /** * 节点元素类 */ class NodeElement { /** * 构造函数 * @param {HTMLElement} element */ constructor(element) { this.element = element; this[_nodexy] = [0, 0]; // 节点坐标 this[_mousedown] = false; // 判断鼠标是否按下 this[_startxy] = [0, 0]; // 起始坐标 } /** * 拖动 */ draggable() { // 按下事件 this.element.addEventListener("mousedown", (event) => { this[_mousedown] = true; this[_startxy] = [event.clientX, event.clientY]; this[_nodexy] = [this.element.offsetLeft, this.element.offsetTop]; }); // 移动 document.addEventListener("mousemove", (event) => { // 计算元素移动距离 // 元素移动距离= 初始坐标 + (鼠标拖动坐标 - 鼠标按下坐标 ) // 事件: 按下事件(开始) / 鼠标移动事件(进行中) / 鼠标松开事件(结束) if (this[_mousedown]) { this.element.style.left = this[_nodexy][0] + (event.clientX - this[_startxy][0]) + 'px'; this.element.style.top = this[_nodexy][1] + (event.clientY - this[_startxy][1]) + 'px'; } }); // 松开 this.element.addEventListener("mouseup", (event) => { this[_mousedown] = false; }); } }
我的百度经验:https://jingyan.baidu.com/article/546ae185f7c0711149f28c34.html
源码地址:https://pan.baidu.com/s/19t_QUqw_UhceqWT1nwgBxw
样本地址:http://js.zhuamimi.cn/%E5%85%83%E7%B4%A0%E6%8B%96%E5%8A%A8/index.htm
原文链接:https://www.cnblogs.com/whnba/p/10289901.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- javascript过滤数组重复元素的实现方法 2020-03-05
- 高效的获取当前元素是父元素的第几个子元素 2020-02-15
- JS怎么获取父节点 2020-02-14
- 详解Webstorm 新建.vue文件支持高亮vue语法和es6语法 2020-02-07
- Js操作DOM元素及获取浏览器高宽的简单方法 2019-12-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash