元素事件:鼠标按下事件/鼠标移动事件/鼠标松开事件

元素样式:让元素脱离文档流,采用绝对定位的方式。

一、鼠标按下事件

当鼠标在元素上面按下时,保存元素的初始偏移量和鼠标按下时的坐标,然后在状态变量里面标记当前状态为按下状态。

二、鼠标移动事件

当鼠标拖动元素移动时,我们通过计算鼠标从起始位到移动位之间的偏移量来求元素应该移动的距离。

元素移动距离= 初始坐标 + (鼠标拖动坐标 - 鼠标按下坐标 )

三、鼠标松开事件

当鼠标松开后,我们把状态变量重置为假,表示当前拖动结束。

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 元素拖动的更多相关文章

  1. JS实现元素拖动

    实现1 参考文献:http://www.cnblogs.com/cloudgamer/archive/2008/11/17/Drag.html 1.1 拖放效果 <!DOCTYPE html P ...

  2. 实现dom元素拖动

    本文主要写一下如何实现dom元素拖动,目前使用jquery库实现之. 主要的注释附在代码中,大家可以根据代码画一个小的窗口模型图,以便于理解. <!DOCTYPE html> <ht ...

  3. 【全面总结】js获取元素位置大小

    [js获取元素位置+元素大小]全面总结 目录 1.关于offset offsetParent(只读) offsetTop(只读) offsetLeft(只读) offsetHeight(只读) off ...

  4. JavaScript事件模拟元素拖动

    一.前言: 最近要实现一个元素拖放效果,鼠标拖动元素并且定位元素,首先想到的是HTML5中的拖放,在HTML5中,有一个draggable属性,且有dragstart, dragover, drop等 ...

  5. js技术之拖动table标签

    一.js技术之拖动table标签 起因:前几天公司,突然安排一个任务 任务描述:要求尺码table列表要像Excel表中一样可以直接移动整行尺码到任意行位置 技术点:采用ui的sortable技术来h ...

  6. js实现可拖动Div

    随着时代的变化,越来越感觉到js的重要性,js不仅可以做web页面(如Ext框架),还可以做一些web的特效,这些特效不仅兼容PC,而且兼容手机端,毕竟是基于浏览器的,和平台没关系.现在微软的wind ...

  7. paip.调试js 查看元素事件以及事件断点

    paip.调试js  查看元素事件以及事件断点 ff 26 +firebug 查看不出来.. 360 ,虽然也是chrome 基础,但是开发工具烂阿,也是显示不出来.. 作者Attilax  艾龙,  ...

  8. JS子元素oumouseover触发父元素onmouseout

    原文:JS子元素oumouseover触发父元素onmouseout JavaScript中,父元素包含子元素: 当父级设置onmouseover及onmouseout时,鼠标从父级移入子级,则触发父 ...

  9. JavaScript实现元素拖动性能优化

    前言:前几天没事干写了个小网站,打算用原生的javascript实现元素的拖动,但是事情并没有想象的那么顺利,首先是实现了拖动的元素卡的不能再卡,简直不能够,上图~~ 看见没?这就是效果,简直让人欲哭 ...

随机推荐

  1. TextView文字描边实现

    TextView文字描边实现 需求描述 文字显示在图片的上面,图片的内容是不确定了,为了防止文字与图片的颜色相近导致用户看不到或者看不清文字的问题,所以显示文字描边,避免问题. 实现 实现思想 使用T ...

  2. 吴恩达机器学习笔记24-神经网络的模型表示1(Model Representation of Neural Network I)

    神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型.这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出.下图是一个以逻辑回归模 ...

  3. 字体图标三种格式区别(Unicode / Font class / Symbol)

    在实际项目中,或多或少会用到字体图标,优点是即减少了体积,又减少了http请求,可谓一举两得 我一般是在阿里巴巴矢量图库下载字体图标:http://www.iconfont.cn/   下面以阿里巴巴 ...

  4. html 转义处理

    比如要把:<span>test</span> 这段代码当做文本原样输出在页面上,如果按照正常的方式,肯定会被转义,在页面上只能看到 text.那么要想达到预想的效果,应该怎么办 ...

  5. Python - 调试Python代码的方法

    调试(debug) 将可疑环节的变量逐步打印出来,从而检查哪里是否有错. 让程序一部分一部分地运行起来.从核心功能开始,写一点,运行一点,再修改一点. 利用工具,例如一些IDE中的调试功能,提高调试效 ...

  6. 开发十年,只剩下这套Java开发体系了 原

    蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力.培训.出国.大公司的经历,还有很多很好的朋友.但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜 ...

  7. JavaScript递归中的作用域问题

    需求是这样的,从子节点寻找指定className的父节点,一开始就想到递归(笨!),Dom结构如下: <div class="layer_1"> <div cla ...

  8. 关于富文本编辑器ueditor(jsp版)上传文件到阿里云OSS的简单实例,适合新手

    关于富文本编辑器ueditor(jsp版)上传文件到阿里云OSS的简单实例,适合新手   本人菜鸟一枚,最近公司有需求要用到富文本编辑器,我选择的是百度的ueditor富文本编辑器,闲话不多说,进入正 ...

  9. Windows平台编译MySQL5.7源码

    https://blog.csdn.net/linjingke32/article/details/85111711

  10. Nginx 配置https 服务

    一.HTTPS 服务 为什么需要HTTPS? 原因:HTTP不安全 1.传输数据被中间人盗用.信息泄露 2.数据内容劫持.篡改 HTTPS协议的实现 对传输内容进行加密以及身份验证 HTTPS加密校验 ...