js拖拽功能实现

js拖拽功能实现

html代码

这个没什么好说的,就是几个框框,尤其注意一点的是一定要用position的绝对定位

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        #div1{
            width: 100px;
            height: 100px;
            background: gray;
            position: absolute;
        }
        #div2{
            width: 100px;
            height: 100px;
            background: orange;
            position: absolute;
            left: 100px;
        }
        #div3{
            width: 100px;
            height: 100px;
            background: tomato;
            position: absolute;
            left: 200px;
        }
    </style>
    <script src="drag.js"></script>
</head>
<body>
    <div id="div1"></div>
    <div id="div2"></div>
    <div id="div3"></div>
</body>
</html>

js代码

window.onload = function(){
    var d1 = new Drag()
    d1.init('div1')

    var d2 = new Drag()
    d2.init('div2')

    var d3 = new Drag()
    d3.init('div3')
}
//下面采用的是ES6的class写法以及箭头函数的使用
class Drag{
    //保存获取的标签元素
    obj = null
    //保存鼠标按下位置距离元素左边框的距离
    disX = 0
    //保存鼠标按下位置距离元素上边框的距离
    disY = 0
    //初始化拖拽效果
    init(id){
        this.obj = document.getElementById(id)
        //当鼠标按下后执行
        this.obj.onmousedown = ev => {
            var ev = ev || window.event
            //保存位置
            this.toDown(ev)
            //当鼠标移动时
            document.onmousemove = ev => {
                var ev = ev || window.event
                //改变元素的原有样式,即位置属性
                this.toMove(ev)
            }
            //当鼠标松开后
            document.onmouseup = () =>{
                this.toUp()
            }
        }
    }
    toDown(ev){
        this.disX = ev.clientX - this.obj.offsetLeft
        this.disY = ev.clientY - this.obj.offsetTop
    }
    toMove(ev){
        this.obj.style.left = ev.clientX - this.disX + 'px'
        this.obj.style.top = ev.clientY - this.disY + 'px'
        this.obj.style.opacity = '0.5'
    }
    toUp(){
        document.onmousemove = null
        document.onmouseup = null
        this.obj.style.opacity = '1'
    }
}
  • 其中值得注意的是onmousedown与onmouseup委托到document上面,为的是保证其鼠标移动的准确性。通过事件冒泡去捕获到这两种事件,从而达到事件委托
  • 这里用ES6的箭头函数和class是为了避免this指针发生变化的情况
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,526评论 1 11
  • 我们首先要明白,我们给页面添加效果用到的js到底是什么?js其实包含三部分:dom 文档对象模型 bom 浏览...
    一直以来都很好阅读 817评论 0 0
  • 前言 本文依据半年前本人的分享《浅谈js拖拽》撰写,算是一篇迟到的文章。 基本思路 虽然现在关于拖拽的组件库到处都...
    lanberts阅读 2,468评论 0 0
  • 事件对象 鼠标事件 event.clientX在可视区中,鼠标点击的x坐标 event.clientY在可视区中,...
    LaBaby_阅读 599评论 0 1
  • 简介Document Object Model 文档对象模型,通过DOM可以来任意来修改网页中各个内容。文档指的是...
    xiaohan_zhang阅读 294评论 0 1