欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js/es6 元素拖动

程序员文章站 2022-05-17 14:41:58
元素事件:鼠标按下事件/鼠标移动事件/鼠标松开事件 元素样式:让元素脱离文档流,采用绝对定位的方式。 一、鼠标按下事件 当鼠标在元素上面按下时,保存元素的初始偏移量和鼠标按下时的坐标,然后在状态变量里面标记当前状态为按下状态。 二、鼠标移动事件 当鼠标拖动元素移动时,我们通过计算鼠标从起始位到移动位 ......

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

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

一、鼠标按下事件

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

二、鼠标移动事件

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

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

三、鼠标松开事件

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

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