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+iview实现分页及查询功能
Nov 17 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
vue实现验证用户名是否可用
Jan 20 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 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基础陷阱题(变量赋值)
2012/09/12 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
再探JavaScript作用域
2014/09/24 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
js实现秒表计时器
2019/12/16 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
python提取字典key列表的方法
2015/07/11 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Python Flask框架扩展操作示例
2019/05/03 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
公司任命书范本
2014/06/04 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书