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 相关文章推荐
DWR Ext 加载数据
Mar 22 Javascript
javascript 三种编解码方式
Feb 01 Javascript
Jquery+JSon 无刷新分页实现代码
Apr 01 Javascript
node.js中的path.extname方法使用说明
Dec 09 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
Aug 23 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
May 26 Javascript
JS异步文件上传(兼容IE8+)
Apr 02 Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 Javascript
vuejs使用FormData实现ajax上传图片文件
Aug 08 Javascript
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
JavaScript中发出HTTP请求最常用的方法
Jul 12 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 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
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
php生成zip文件类实例
2015/04/07 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python深入学习之闭包
2014/08/31 Python
简单学习Python time模块
2016/04/29 Python
python批量赋值操作实例
2018/10/22 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
python re模块常见用法例举
2021/03/01 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
跳槽求职信范文
2014/05/26 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
小时代观后感
2015/06/10 职场文书