基于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 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
JavaScript 原型继承
Dec 26 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
45个JavaScript编程注意事项、技巧大全
Feb 11 Javascript
基于JavaScript实现的顺序查找算法示例
Apr 14 Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 Javascript
vue 实现在函数中触发路由跳转的示例
Sep 01 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
Sep 04 Javascript
微信上传视频文件提示(推荐)
Nov 22 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
javascript执行上下文、变量对象实例分析
Apr 25 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数组的一些常见操作汇总
2011/07/17 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
JavaScript 学习技巧
2010/02/17 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
python利用beautifulSoup实现爬虫
2014/09/29 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python中的默认参数实例分析
2018/01/29 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
会计求职简历自我评价
2015/03/10 职场文书
暑期工社会实践报告
2015/07/13 职场文书
员工规章制度范本
2015/08/07 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python