js面向对象方式实现拖拽效果


Posted in Javascript onMarch 03, 2021

本文实例为大家分享了js面向对象方式实现拖拽的具体代码,供大家参考,具体内容如下

拖拽功能的实现原理:(直接拿走!)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    #box {
      position: absolute;
      left: 100px;
      top: 100px;
      width: 100px;
      height: 100px;
      background: red;
    }

    #box2 {
      position: absolute;
      left: 200px;
      top: 200px;
      width: 100px;
      height: 100px;
      background: green;
    }
  </style>
</head>

<body>
  <div id="box">文字</div>
  <div id="box2">文字</div>
</body>
<script>
  class Drag {
    startMouse = {};
    startEl = {};
    #el = null;
    constructor(el, option) {
      this.#el = el;
      this.option = option;
      this.start();
    }
    start() {
      let move = (e) => {
        this.move(e)
      }
      this.#el.addEventListener('mousedown', (e) => {
        this.startMouse = {
          x: e.clientX,
          y: e.clientY,
        }
        this.ondragstart && this.ondragstart(e)
        this.startEl = this.getOffset();
        document.addEventListener('mousemove', move);
        document.addEventListener('mouseup', (e) => {
          document.removeEventListener('mousemove', move);
          this.end(e);
        }, {
          once: true
        })
        e.preventDefault();

      })
    }
    move(e) {
      let nowMouse = {
        x: e.clientX,
        y: e.clientY,
      }
      let disMouse = {
        x: nowMouse.x - this.startMouse.x,
        y: nowMouse.y - this.startMouse.y
      }
      this.ondrag && this.ondrag(e)
      this.setOffset(disMouse)
    }
    end(e) {
      this.ondragend && this.ondragend(e)
    }
    getOffset() {
      return {
        x: parseFloat(getComputedStyle(this.#el)["left"]),
        y: parseFloat(getComputedStyle(this.#el)["top"])
      }
    }
    setOffset(dis) {
      this.#el.style.left = this.startEl.x + dis.x + 'px'
      this.#el.style.top = this.startEl.y + dis.y + 'px'
    }
  }
  let box = document.querySelector("#box");
  let box2 = document.querySelector("#box2");
  let d = new Drag(box);
  let d2 = new Drag(box2);
  let clonex = null;
  d2.ondragstart = (e) => {
    clonex = box2.cloneNode(true);
    document.body.appendChild(clonex)
    box2.style.opacity = 0.5
  }
  d2.ondragend = () => {
    document.body.removeChild(clonex);
    box2.style.opacity = 1
  }
</script>

</html>

最终效果(拖动的为绿色块)

js面向对象方式实现拖拽效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
为javascript添加String.Format方法
Aug 11 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
jquery获取checkbox的值并post提交
Jan 14 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
AngularJS教程之简单应用程序示例
Aug 16 Javascript
详解Vuejs2.0之异步跨域请求
Apr 20 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 Javascript
Vue多选列表组件深入详解
Mar 02 #Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 #Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 #Vue.js
详解微信小程序(Taro)手动埋点和自动埋点的实现
Mar 02 #Javascript
vue脚手架项目创建步骤详解
Mar 02 #Vue.js
javascript实现简单页面倒计时
Mar 02 #Javascript
javascript实现倒计时提示框
Mar 02 #Javascript
You might like
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
vue登录注册实例详解
2019/09/14 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python最长公共子串算法实例
2015/03/07 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
python函数定义和调用过程详解
2020/02/09 Python
python 追踪except信息方式
2020/04/25 Python
python利用platform模块获取系统信息
2020/10/09 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
存储过程和函数的区别
2013/05/28 面试题
高校生生产实习自我鉴定
2013/09/21 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书