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

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

一、鼠标按下事件

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

二、鼠标移动事件

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

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

三、鼠标松开事件

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

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. Glibc堆块的向前向后合并与unlink原理机制探究

    i春秋作家:Bug制造机 原文来自:Glibc堆块的向前向后合并与unlink原理机制探究 玩pwn有一段时间了,最近有点生疏了,调起来都不顺手了,所以读读malloc源码回炉一点一点总结反思下. U ...

  2. 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  3. Mybatis框架五:动态SQL

    1.if   where 实现一个简单的需求: 根据性别和名字查询用户: 正常来写: <select id="selectUserBySexAndUsername" para ...

  4. Python中高级变量类型(列表,元组,字典,字符串,公共方法...)

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...

  5. Collection 和 Collections;Array与Arrays的区别

    Collection 和 Collections 的区别. Collection 是个 java.util 下的接口 ,它是各种集合结构的父接口.继承与他的接口主要有 Set  和 List. Col ...

  6. python通过手机抓取微信公众号

    使用 Fiddler 抓包分析公众号 打开微信随便选择一个公众号,查看公众号的所有历史文章列表 在 Fiddler 上已经能看到有请求进来了,说明公众号的文章走的都是HTTPS协议,这些请求就是微信客 ...

  7. 在 .NET Core 下的 Swagger UI 自定义操作

    1.Swagger UI 是什么? Swagger UI 是一个在线的 API 文档生成与测试工具,你可以将其集成在你的 API 项目当中. 支持 API 自动同步生成文档 高度自定义,可以自己扩展功 ...

  8. 简易远程消息交换协议SRMP

    一.SRMP目标定位 经过十多年实战经验积累以及多方共同讨论,新生命团队(https://github.com/newlifex)制订了一种简单而又具有较好扩展性的RPC(Remote Procedu ...

  9. k8s与云服务器之间服务互访之节点网络打通

    一.概述 k8s暴露服务的方式有很多使用ingress.nodeport等,这类比较适用于无状态的服务,对于statefulset部署的有状态的服务,(关于statefulset的介绍参考kubern ...

  10. html模板输头部出现"&#65279"