基于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 相关文章推荐
js资料toString 方法
Mar 13 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
javascript预加载图片、css、js的方法示例介绍
Oct 14 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
用unescape反编码得出汉字示例
Apr 24 Javascript
JS在浏览器中解析Base64编码图像
Feb 09 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
详解jQuery获取特殊属性的值以及设置内容
Nov 14 jQuery
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
vue移动端实现手机左右滑动入场动画
Jun 17 Javascript
基于vue中的scoped坑点解说
Sep 04 Javascript
vue实现下拉菜单树
Oct 22 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
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
群众路线教育实践活动方案
2014/02/02 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
护理专业自荐信范文
2015/03/06 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
Python使用scapy模块发包收包
2021/05/07 Python