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

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

一、鼠标按下事件

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

二、鼠标移动事件

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

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

三、鼠标松开事件

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

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. mvc网站迁移.net core记录

    接口return Json()时序列号小写的问题 在Startup.cs->ConfigureServices方法配置一下解决 public void ConfigureServices(ISe ...

  2. Flask上下文

    Flask的核心机制!关于请求处理流程和上下文 学习一样东西不能只停留在表面,我们要探索其中的细节,学习作者的编程思想,这样才能更进一步. 关于WSGI WSGI(全称Web Server Gatew ...

  3. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  4. RichText 富文本开源项目总结

    在Android开发中,我们不免会遇到富文本的编辑和展示的需求,以下是本人之前star的富文本编辑器的开源项目,供大家参考: 一.RichEditor 开源项目地址:https://github.co ...

  5. select count(*) 底层究竟做了什么?

    阅读本文大概需要 6.6 分钟. SELECT COUNT( * ) FROM t是个再常见不过的 SQL 需求了.在 MySQL 的使用规范中,我们一般使用事务引擎 InnoDB 作为(一般业务)表 ...

  6. js-完整轮播图

     js-完整轮播图 今天写一个完整的轮播图,首先它需要实现三个功能:1.鼠标放在小圆点上实现轮播.2.点击焦点按钮实现轮播.3.无缝自动轮播. 轮播图的原理: 一系列的大小相等的图片平铺,利用CSS布 ...

  7. idea导入maven项目 傻瓜都能看懂

    1.找到你需要导入的项目 2.打开idea ------------------------------------------------------------------------------ ...

  8. Static了解和复习继承。

    Static了解 static加在局部变量的前面改变其存储类型使之成为静态局部变量,会延长它的生存周期,但是不会改变其作用域. 静态成员是属于类的,而不是属于某个对象的.即便没有任何一个实例,类的静态 ...

  9. 机器学习入门06 - 训练集和测试集 (Training and Test Sets)

    原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 测试集是用于评估根据训练 ...

  10. java多线程(2)---生命周期、线程通讯

    java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别.    1.yield()方法 yield()让当前正在运行的线程回到就绪 ...