vue实现移动端div拖动效果


Posted in Vue.js onMarch 03, 2022

本文实例为大家分享了vue实现移动端div拖动的具体代码,供大家参考,具体内容如下

手机上会偶尔用到拖动div的效果,虽然我自己还没遇到,先写一个以防万一,需要注明的是,具体实现代码是我在网上找的,但是那个代码存在一些问题,我又搜集了其他资料对其修改,达到了现在的样子,所以还是要感谢写这段代码的大神与万能的搜索引擎

1、分享代码

html代码

<template>
  <div class="main">
    <div ref="move_div" @touchstart="down" @touchmove="move" @touchend="end" :style="{top: top  + 'px', left: left  + 'px'}" class="drag_area"></div>
  </div>
</template>

极其简单的结构,毕竟只是个DEMO

SCSS代码

.main{
    background-color: brown;
    height: -webkit-fill-available;
    .drag_area{
      width: 10vw;
      height: 10vw;
      background-color: dodgerblue;
      position: absolute;
      top: 0;
      left: 0;
    }
  }

为了截图显眼,特地给main加了个背景颜色

效果图

vue实现移动端div拖动效果

效果呢,就是你可以在屏幕范围内自由拖动蓝色色块,不过超出屏幕区域我特意做了限制,不需要限制的可以自己改

JS代码

export default {
  name: 'drag',
  data () {
    return {
      flags: false,
      position: {x: 0, y: 0, left: 0, top: 0},
      top: 0,
      left: 0,
      width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
      height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
    }
  },
  methods: {
    down () { // 拖动开始的操作
      this.flags = true
      const refs = this.$refs.move_div.getBoundingClientRect()
      let touch = event
      if (event.touches) {
        touch = event.touches[0]
      }
      this.position.x = touch.clientX
      this.position.y = touch.clientY
      this.position.left = refs.left
      this.position.top = refs.top
    },
    move () { // 拖动中的操作
      if (this.flags) {
        let touch = event
        if (event.touches) {
          touch = event.touches[0]
        }
        const xPum = this.position.left + touch.clientX - this.position.x
        const yPum = this.position.top + touch.clientY - this.position.y
        this.left = xPum
        this.top = yPum
        this.banOut()
        // 阻止页面的滑动默认事件
        document.addEventListener('touchmove', function () {
          event.preventDefault()
        }, {passive: false})
      }
    },
    end () { // 拖动结束的操作
      this.flags = false
      this.banOut()
    },
    banOut () { // 避免拖动出界的限制
      const refs = this.$refs.move_div.getBoundingClientRect()
      if (this.left < 0) {
        this.left = 0
      } else if (this.left > this.width - refs.width) {
        this.left = this.width - refs.width
      }
      if (this.top < 0) {
        this.top = 0
      } else if (this.top > this.height - refs.height) {
        this.top = this.height - refs.height
      }
    }
  }
}

代码呢,简洁明了,你要是对touch事件有学习需求呢可以自己琢磨,要是只是要用呢,复制粘贴改一改就行了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 Vue.js
vuex的使用步骤
Jan 06 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
Vue详细的入门笔记
May 10 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
vue 自定义组件添加原生事件
Apr 21 Vue.js
vue实现滑动解锁功能
Vue全局事件总线你了解吗
Feb 24 #Vue.js
Vue的生命周期一起来看看
Vue的过滤器你真了解吗
Feb 24 #Vue.js
Vue监视数据的原理详解
Feb 24 #Vue.js
Vue的列表之渲染,排序,过滤详解
Vue3如何理解ref toRef和toRefs的区别
Feb 18 #Vue.js
You might like
php adodb连接不同数据库
2009/03/19 PHP
php防攻击代码升级版
2010/12/29 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
基于JSONP原理解析(推荐)
2017/12/04 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
详解Vue之计算属性
2020/06/20 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
python正则表达式实例代码
2020/03/03 Python
python re的findall和finditer的区别详解
2020/11/15 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
怎么写自荐书范文
2014/02/12 职场文书
开展创先争优活动总结
2014/08/28 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
预备党员转正材料
2014/12/19 职场文书
大国崛起观后感
2015/06/02 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python