基于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事件列表解说
Dec 22 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
Jun 14 Javascript
bootstrap实现图片自动轮播
Dec 21 Javascript
javascript 判断一个对象为数组的方法
May 03 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 Javascript
JS实现的RC4加密算法示例
Aug 16 Javascript
jQuery实现获取及设置CSS样式操作详解
Sep 05 jQuery
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
Nov 30 Javascript
JSON字符串操作移除空串更改key/value的介绍
Jan 05 Javascript
layui框架与SSM前后台交互的方法
Sep 12 Javascript
javaScript把其它类型转换为Number类型
Oct 13 Javascript
vue项目中定义全局变量、函数的几种方法
Nov 08 Javascript
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
PHPShop存在多个安全漏洞
2006/10/09 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
PHP队列用法实例
2014/11/05 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
PHP制作用户注册系统
2015/10/23 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
Bootstrap Table使用整理(三)
2017/06/09 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
机电专业个人求职信范文
2013/12/30 职场文书
银行类自荐信
2014/02/04 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
建国大业电影观后感
2015/06/01 职场文书
详解Python中的for循环
2022/04/30 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL