基于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 相关文章推荐
浅析jQuery的链式调用之each函数
Dec 03 Javascript
Grid得到选择行数据的方法总结
Jan 17 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
May 07 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
Jan 05 Javascript
js获取浏览器和屏幕的各种宽度高度
Feb 22 Javascript
js从输入框读取内容,比较两个数字的大小方法
Mar 13 Javascript
JavaScript数据结构之单链表和循环链表
Nov 28 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 jQuery
vue.js通过路由实现经典的三栏布局实例代码
Jul 08 Javascript
layui自己添加图片按钮并点击跳转页面的例子
Sep 14 Javascript
JavaScript实现简单的计算器
Jan 16 Javascript
JS删除数组指定值常用方法详解
Jun 04 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
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
PHP钩子实现方法解析
2019/05/21 PHP
js类 from qq
2006/11/13 Javascript
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
js数组的操作详解
2013/03/27 Javascript
Javascript window对象详解
2014/11/12 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
BootStrap selectpicker
2016/06/20 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
Python类如何定义私有变量
2020/02/03 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
员工自我鉴定
2013/10/09 职场文书
酒店服务与管理毕业生求职信
2013/11/02 职场文书
学校卫生检查制度
2014/02/03 职场文书
国际贸易系求职信
2014/08/09 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
走进毛泽东观后感
2015/06/04 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
Python OpenCV之常用滤波器使用详解
2022/04/07 Python