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

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

一、鼠标按下事件

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

二、鼠标移动事件

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

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

三、鼠标松开事件

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

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. 吴恩达机器学习笔记42-大边界的直观理解(Large Margin Intuition)

    这是我的支持向量机模型的代价函数,在左边这里我画出了关于

  2. SpringMVC框架六:拦截器

    拦截器的概念就不介绍了: SpringMVC中拦截器的执行规则: 一个小示例展示: 我搞两个拦截器: 第一个: package org.dreamtech.springmvc.interceptor; ...

  3. 【新手向】使用nodejs抓取百度贴吧内容

    参考教程:https://github.com/alsotang/node-lessons 1~5节 1. 通过superagent抓取页面内容 superagent .get('http://www ...

  4. mysql 架构篇系列 3 复制运行状态监控与选项参数说明

    一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...

  5. 知其然而所以然:Operating System 概述和学习图

    大神绕道,鄙人初入 OS . 一.想知OS,先知计算机系统概述 #图解 #基本指令和中断周期 #直接内存存取(Direct Memory Access,DMA) I/O模块对存储器发出读命令或者写命令 ...

  6. Linux 权限位详解

    1. Linux 权限位 对于权限,有点绕,因为文件的权限和目录的权限是有一些区别的. 在Linux中,有5种权限,分别是,r.w.x.s.t. 可读权限:r 可写权限:w 可执行权限:x Setui ...

  7. JavaScript和Ajax部分(6)

    51. 怎样给jQuery动态附加新的元素?那么怎样给新生成的元素绑定事件呢? jQuery的html()可以给现有元素附加新的元素. 直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本 ...

  8. c#调用c++ dll的一个例子

    1.创建一个简单的c++ 项目生成动态库. Vs 创建完工程后,打开SampleOperation.cpp文件,看到有个导出函数的例子. 复制这段代码, 修改函数(返回值, 参数列表, 函数的实现) ...

  9. OSI七层协议模型、TCP/IP四层模型和五层协议体系结构之间的关系

    一.OSI七层模型 OSI七层协议模型主要是:应用层(Application).表示层(Presentation).会话层(Session).传输层(Transport).网络层(Network).数 ...

  10. Jenkins入门之任务基本操作

    首先先简单讲一下Jenkins构建任务各种图标的含义 我的主界面有以下构建任务,这里前两列都是图标,第一列为构建的状态,前面已经讲过蓝色代表成功,红色代表失败.当然那是针对一次构建,一个构建任务可能有 ...