基于Vue实现拖拽效果


Posted in Javascript onApril 27, 2018

效果图

基于Vue实现拖拽效果 

demo1.gif

分清clientY pageY screenY layerY offsetY的区别

在我们想要做出拖拽这个效果的时候,我们需要分清这几个属性的区别,这几个属性都是计算鼠标点击的偏移值,我们需要对其进行了解才可以继续实现我们的拖拽效果

clientY 指的是距离可视页面左上角的距离
pageY 指的是距离可视页面左上角的距离(不受页面滚动影响)
screenY 指的是距离屏幕左上角的距离
layerY 指的是找到它或它父级元素中最近具有定位的左上角距离
offsetY 指的是距离它自己左上角的距离
一张图带大家简单了解了解

基于Vue实现拖拽效果 

区别

在我们简单了解完这些个属性以后,有几个属性需要分清。

相同点 不同点
clientY 距离页面左上角距离 受页面滚动的影响
pageY 距离页面左上角的距离 不受页面滚动影响
相同点 不同点
layerY 距离元素的左上角距离 受元素的定位的影响,会从本元素往上找到第一个定位的元素的左上角
offsetY 距离元素左上角的距离 计算相对于本元素的左上角,不在乎定位问题,计算的是内交点。是IE浏览器的特有属性

基于Vue实现拖拽效果 

layerY与offsetY区别

实现拖拽功能

我们既然熟悉了这几个偏移属性的意思,那么我们就进入我们的重点。话不多说直接上代码

// darg.html

<style>
  #app{
    position: relative;   /*定位*/
    top: 10px;
    left: 10px;
    width: 200px;
    height: 200px;
    background: #666;    /*设置一下背景*/
  }
</style>
<body>
  <div id="app" @mousedown="move">    <!--绑定按下事件-->
    {{positionX}}
    {{positionY}}
  </div>
</body>
//main.js
let app = new Vue({
  el:'#app',
  data:{
    positionX:0,
    positionY:0,
  },
  methods:{
    move(e){
      let odiv = e.target;    //获取目标元素
      
      //算出鼠标相对元素的位置
      let disX = e.clientX - odiv.offsetLeft;
      let disY = e.clientY - odiv.offsetTop;
      document.onmousemove = (e)=>{    //鼠标按下并移动的事件
        //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
        let left = e.clientX - disX;  
        let top = e.clientY - disY;
        
        //绑定元素位置到positionX和positionY上面
        this.positionX = top;
        this.positionY = left;
        
        //移动当前元素
        odiv.style.left = left + 'px';
        odiv.style.top = top + 'px';
      };
      document.onmouseup = (e) => {
        document.onmousemove = null;
        document.onmouseup = null;
      };
    }  
  
  },
  computed:{},
});

当然,我们可以将它绑定为一个自定义指令,这样的话就可以用调用指令的形式来实现拖拽效果,下面是定义自定义指令的代码

// darg.html

<style>
  #app{
    position: relative;   /*定位*/
    top: 10px;
    left: 10px;
    width: 200px;
    height: 200px;
    background: #666;    /*设置一下背景*/
  }
</style>
<body>
  <div id="app" v-drag>    <!--实现用指令形式实现拖拽效果-->
    
  </div>
</body>
//main.js

let app = new Vue({
  el:'#app',
  data:{},
  methods:{},
  directives: {
    drag: {
      // 指令的定义
      bind: function (el) {
        let odiv = el;  //获取当前元素
        oDiv.onmousedown = (e) => {
          //算出鼠标相对元素的位置
          let disX = e.clientX - odiv.offsetLeft;
          let disY = e.clientY - odiv.offsetTop;
          
          document.onmousemove = (e)=>{
            //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
            let left = e.clientX - disX;  
            let top = e.clientY - disY;
           
            //绑定元素位置到positionX和positionY上面
            this.positionX = top;
            this.positionY = left;
        
            //移动当前元素
            odiv.style.left = left + 'px';
            odiv.style.top = top + 'px';
          };
          document.onmouseup = (e) => {
            document.onmousemove = null;
            document.onmouseup = null;
          };
        };
      }
    }
  }
});

最后

到这里我们就已经把拖拽效果用Vue实现了,我们用了两种不同的方式实现了拖拽,但实际上换汤不换药,我们需要弄清楚pageY、screenY、clientY、layerY、offsetY等区别。当然我们同时也学习了Vue的一些方法,例如自定义指令等。

以上所述是小编给大家介绍的基于Vue实现拖拽效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript第一课
Feb 27 Javascript
JS延迟加载(setTimeout) JS最后加载
Jul 15 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
Sep 14 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
解决layui弹框失效的问题
Sep 09 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
Nov 12 Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
mpvue实现微信小程序快递单号查询代码
Apr 03 Javascript
js校验开始时间和结束时间
May 26 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
Node.js利用console输出日志文件的方法示例
Apr 27 #Javascript
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 #Javascript
使用Vue动态生成form表单的实例代码
Apr 26 #Javascript
Javascript的console['']常用输入方法汇总
Apr 26 #Javascript
r.js来合并压缩css文件的示例
Apr 26 #Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
Apr 26 #jQuery
Webpack打包字体font-awesome的方法示例
Apr 26 #Javascript
You might like
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
python爬取指定微信公众号文章
2018/12/20 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
通过实例学习Python Excel操作
2020/01/06 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
小学生演讲稿大全
2014/04/25 职场文书
学习经验演讲稿
2014/05/10 职场文书
师德师风自我评价范文
2014/09/11 职场文书
总经理检讨书范文
2015/02/16 职场文书
靠谱的活动总结
2019/04/16 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL
python如何将mat文件转为png
2022/07/15 Python
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL