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是否可实现多线程  深入理解JavaScript定时机制
Dec 22 Javascript
精通JavaScript 纠正 cleanWhitespace函数
Mar 11 Javascript
javascript解决innerText浏览器兼容问题思路代码
May 17 Javascript
setTimeout()递归调用不加引号出错的解决方法
Sep 05 Javascript
深入分析jsonp协议原理
Sep 26 Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
Apr 13 Javascript
浅谈vuex之mutation和action的基本使用
Aug 29 Javascript
深入理解ES6中let和闭包
Feb 22 Javascript
js实现二级菜单点击显示当前内容效果
Apr 28 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
May 10 Javascript
JavaScript React如何修改默认端口号方法详解
Jul 28 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
PL-880隐藏功能
2021/03/01 无线电
mysqli_set_charset和SET NAMES使用抉择及优劣分析
2013/01/13 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
Python作用域与名字空间原理详解
2020/03/21 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
Python识别验证码的实现示例
2020/09/30 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
初三学习计划书范文
2014/04/30 职场文书
生日宴会策划方案
2014/06/03 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
元宵节晚会主持词
2015/07/01 职场文书
《窃读记》教学反思
2016/02/18 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python