js/es6 元素拖动
元素事件:鼠标按下事件/鼠标移动事件/鼠标松开事件
元素样式:让元素脱离文档流,采用绝对定位的方式。
一、鼠标按下事件
当鼠标在元素上面按下时,保存元素的初始偏移量和鼠标按下时的坐标,然后在状态变量里面标记当前状态为按下状态。
二、鼠标移动事件
当鼠标拖动元素移动时,我们通过计算鼠标从起始位到移动位之间的偏移量来求元素应该移动的距离。
元素移动距离= 初始坐标 + (鼠标拖动坐标 - 鼠标按下坐标 )
三、鼠标松开事件
当鼠标松开后,我们把状态变量重置为假,表示当前拖动结束。
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
js/es6 元素拖动的更多相关文章
- JS实现元素拖动
实现1 参考文献:http://www.cnblogs.com/cloudgamer/archive/2008/11/17/Drag.html 1.1 拖放效果 <!DOCTYPE html P ...
- 实现dom元素拖动
本文主要写一下如何实现dom元素拖动,目前使用jquery库实现之. 主要的注释附在代码中,大家可以根据代码画一个小的窗口模型图,以便于理解. <!DOCTYPE html> <ht ...
- 【全面总结】js获取元素位置大小
[js获取元素位置+元素大小]全面总结 目录 1.关于offset offsetParent(只读) offsetTop(只读) offsetLeft(只读) offsetHeight(只读) off ...
- JavaScript事件模拟元素拖动
一.前言: 最近要实现一个元素拖放效果,鼠标拖动元素并且定位元素,首先想到的是HTML5中的拖放,在HTML5中,有一个draggable属性,且有dragstart, dragover, drop等 ...
- js技术之拖动table标签
一.js技术之拖动table标签 起因:前几天公司,突然安排一个任务 任务描述:要求尺码table列表要像Excel表中一样可以直接移动整行尺码到任意行位置 技术点:采用ui的sortable技术来h ...
- js实现可拖动Div
随着时代的变化,越来越感觉到js的重要性,js不仅可以做web页面(如Ext框架),还可以做一些web的特效,这些特效不仅兼容PC,而且兼容手机端,毕竟是基于浏览器的,和平台没关系.现在微软的wind ...
- paip.调试js 查看元素事件以及事件断点
paip.调试js 查看元素事件以及事件断点 ff 26 +firebug 查看不出来.. 360 ,虽然也是chrome 基础,但是开发工具烂阿,也是显示不出来.. 作者Attilax 艾龙, ...
- JS子元素oumouseover触发父元素onmouseout
原文:JS子元素oumouseover触发父元素onmouseout JavaScript中,父元素包含子元素: 当父级设置onmouseover及onmouseout时,鼠标从父级移入子级,则触发父 ...
- JavaScript实现元素拖动性能优化
前言:前几天没事干写了个小网站,打算用原生的javascript实现元素的拖动,但是事情并没有想象的那么顺利,首先是实现了拖动的元素卡的不能再卡,简直不能够,上图~~ 看见没?这就是效果,简直让人欲哭 ...
随机推荐
- 京东购物车的 Java 架构实现及原理!
今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还在吗? 2)用户登陆了用户名密码,添加商品,关闭 ...
- Chart 图表开源项目总结
在Android开发中,我们不免会遇到图表展示的需求,以下是本人之前star的悬浮窗的开源项目,供大家参考: 1. WilliamChart:创建图表的Android库 2. HelloCharts: ...
- Javascript高级编程学习笔记(29)—— BOM(3)location对象
在JS中location是一个神奇的对象 它既是window对象的属性,也是document对象的属性 它的作用主要在于保存当前文档页面的信息,以及将 url 解析为独立的片段 location对象属 ...
- VS Code 快捷键大全
前言 VSCode的快捷键继承了一些IDE风格,有VS的身影,也有Emacs的身影..简言之,内置快捷键玩熟了,效率提高不是一点两点. VsCode 快捷键有五种组合方式(科普) 通用快捷键 基础编辑 ...
- 【app】自动化环境搭建(Appium)for java
Appium来做app自动化相信大家都很熟悉了吧,就不再赘述他的概念和作用了,我们接下来着重介绍怎么来搭建整个app自动化环境,整个环境包括如下几个步骤: 1.安装jdk和eclipse及配置jdk的 ...
- 剑指offer【07】- 斐波那契数列(java)
题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...
- Python编程Day7——字符编码、字符与字节、文件操作
一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...
- Linux(CentOS)下安装Elasticsearch5.0.0
一.ES5.0解压安装到Windows之后(可能)需要进行的设置: 1.如果不设置,直接运行elasticsearch.bat 文件 ,会报错: 2.解决方式 调节 conf/jvm.options ...
- salesforce lightning零基础学习(十一) Aura框架下APP构造实现
前面的一些lightning文章讲述了aura的基础知识,aura封装的常用js以及aura下的事件处理.本篇通过官方的一个superbadge来实现一个single APP的实现. superbad ...
- ABP框架是怎么一回事呢?
ABP(ASP.NET Boilerplate['bɔɪlɚplet]:样板文件),就是一套基于.Net开源框架,官方地址为:https://aspnetboilerplate.com/ , 在这个地 ...