基于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动态创建div
Sep 25 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
Sep 02 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
webpack打包react项目的实现方法
Jun 21 Javascript
解决Layui数据表格中checkbox位置不居中的方法
Aug 15 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
vscode中eslint插件的配置(prettier配置无效)
Sep 10 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
LayUi数据表格自定义赋值方式
Oct 26 Javascript
Vue发布订阅模式实现过程图解
Apr 30 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
Oct 27 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 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
PHP实现的策略模式示例
2019/03/20 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
JavaScript中的面向对象介绍
2012/06/30 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
[15:46]教你分分钟做大人——沙王
2015/03/11 DOTA
python获取远程图片大小和尺寸的方法
2015/03/26 Python
利用Python破解验证码实例详解
2016/12/08 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
python实现梯度下降法
2020/03/24 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
求职简历的自我评价怎样写好
2013/10/07 职场文书
开业主持词
2014/03/21 职场文书
委托书模板
2014/04/04 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
上班迟到检讨书
2015/05/06 职场文书
找规律教学反思
2016/02/23 职场文书