事情是这样的,右边有各种控件,可以拖动到右边自由区,在自由区内可以随意拖动。

案例一:

开始的我,so easy! 通过绑定元素的mousedown 事件,监听鼠标的mousemove,和mouseup 事件,于是我轻松实现了同一区域内元素可以拖着跑,上代码!

move (e) {let odiv = e.target // 获取目标元素// 算出鼠标相对元素的位置let disX = e.clientX - odiv.offsetLeftlet disY = e.clientY - odiv.offsetTopdocument.onmousemove = e => {// 鼠标按下并移动的事件// 用鼠标的位置减去鼠标相对元素的位置,得到元素的位置let left = e.clientX - disXlet top = e.clientY - disY// 移动当前元素odiv.style.left = left + 'px'odiv.style.top = top + 'px'}document.onmouseup = e => {document.onmousemove = nulldocument.onmouseup = null}}

  注意一点,被拖拽对象区域要设置position:relative, 否则的元素会自己抖动。

以上代码并不能满足需要,要左右布局,左边的拖到右边,在右边区域随便拖动。

案例二:

好吧,首先我来布个局,左右布局,给元素绑定事件,上代码!

<template><div style='position: relative;'><el-container><el-aside width="300px"><ul><li class='liStyle' v-for="item in tags" :key='item.id'><img src="../assets/timg.png" class='msg' alt="" @dragstart="dragstart" draggable="true" @drag='draging' @dragend="dragend"></li></ul></el-aside><!-- 自由移动区域 --><el-main><div @drop="drop" @dragover.prevent style='height:600px;width:800px;'></div><!-- <svg id="svgDrag" width="1200" height="1000"></svg> --></el-main></el-container></div>
</template>

事件绑定方法:

dragstart (ev) {console.log('dragstart拖拽开始事件,绑定于被拖拽元素上', event)ev.dataTransfer.setData('Text', ev.target.id)this.offsetX = ev.offsetXthis.offsetY = ev.offsetYconsole.log(this.offsetX + '-' + this.offsetY)},draging (e) {// console.log('拖动中')var x = e.clientXvar y = e.clientY// console.log('shubiao client')if (x > 300) {console.log(this.tags)// drag事件最后一刻,无法读取鼠标的坐标,pageX和pageY都变为0if (x === 0 && y === 0) {return // 不处理拖动最后一刻X和Y都为0的情形}x -= this.offsetXy -= this.offsetY// console.log('e left')// console.log(x + '-' + y)/* 它的父级第一个存在定位的元素,如果有margin减去margin值  */e.target.style.left = x - 5 + 'px'e.target.style.top = y - 60 + 'px'}},drop (ev) {console.log('drop拖放事件,绑定可拖放区域', event)this.text = ev.dataTransfer.getData('Text')console.log(this.text)let target = document.getElementById(this.text)ev.target.appendChild(target)ev.preventDefault()},dragend (event) {event.dataTransfer.clearData()}

  如果不出意外的话,以上代码已经成功实现了元素从左边拖到右边。但是,右边元素被拖走了,右边就没有了,然后我尝试了各种,拖动开始时clone 元素,drap时clone元素等等,都不太完美。此时的我,崩溃……

终于,也不知道哪来的灵感,这个困扰我两秒的难题突然就被我成功攻克了。好了,我要开始吹牛了……

  案例三:

我的思路是这样的(不想看?直接看代码好了,反正是给我自己看的):左边列表元素可拖动(draggable='true'),绑定dragstart(开始事件),不要给它绑定draging(拖动事件),这样左边列表元素有拖动属性,但是位置不会改变。当右侧拖动区域

第一次触发了drop 操作后,新生成一个对象,这个对象既有拖动(draggable='true')属性,也绑定dragstart(开始事件),拖动事件(drag),这样新元素会在右侧随意拖动。那么怎么新生成一个元素呢?自然不是appendChild 之类的,利用Vue 双向绑定的特性,

页面上循环数组元素,生成元素即往数组中push 元素即可。每次拖动元素都会触发drop 事件,并不是每次都要生成一个新元素,要知道是从左边列表拖到右侧第一次drop 的时候生成新元素。怎么知道呢?这就是两个dragstart的妙处

<t<template><div style='position: relative;'><el-container><el-aside width="300px"><ul><li class='liStyle' v-for="item in tags" :key='item.id'><img src="../assets/timg.png" class='msg' alt="" @dragstart="dragstart" draggable="true" :id='item.id' @dragend="imgEnd"></li></ul></el-aside><el-main><div @drop.prevent="drop" @dragover.prevent style='height:1000px;width:1800px;'><img src="../assets/timg.png" class='msg' :style="{left:item.x+'px',top:item.y+'px'}" alt="" v-for="(item, $index) in InfoList" :key='$index' @dragstart="imgStart" draggable="true" @drag='draging($event,item)' @dragend="imgEnd"></div></el-main></el-container></div>
</template>

  

  methods: {dragstart (ev) {let info = { id: ev.target.id, isDrop: true }ev.dataTransfer.setData('Text', JSON.stringify(info))this.offsetX = ev.offsetXthis.offsetY = ev.offsetY},drop (e) {let info = JSON.parse(e.dataTransfer.getData('Text'))/* 判断是否是第一次进入拖拽区域,如果是第一次需要新生成对象,否则不需要 */if (info.isDrop) {var x = e.clientXvar y = e.clientYx -= this.offsetXy -= this.offsetYinfo.x = x - 5info.y = y - 60info.id = info.id + Date.parse(new Date())this.InfoList.push(info)}},imgStart (e) {let info = { isDrop: false }e.dataTransfer.setData('Text', JSON.stringify(info))this.imgOffsetX = e.offsetXthis.imgOffsetY = e.offsetY},draging (e, item) {item.x = e.clientX - this.imgOffsetX - 5item.y = e.clientY - this.imgOffsetY - 60},imgEnd (event) {console.log('done')console.log(event)event.dataTransfer.clearData()}}

  注意:拖动元素设置position:absolute属性

最后,希望大家有哪些好的拖放插件,可以分享一下,基于jquery 的拖拽插件,我用过几个,但是总觉得vue中用jq有点怪。

转载于:https://www.cnblogs.com/caolidan/p/9887893.html

vue 中基于html5 drag drap的拖放相关推荐

  1. vue中基于echarts和基于高德地图的两种地图下钻与上浮方式

    ** vue中基于echarts和基于高德地图的两种地图下钻与上浮方式 ** 基于echarts的地图下钻与上浮(浙江省为例) 第一步:在<template>中构建承载echarts的do ...

  2. vue中使用html5的drag实现任意位置拖动

    最近做的一个项目,需要拖动配置,网上找了一圈 没找到合适的轮子,没办法自己写吧,代码中有能优化的地方,没时间优化了(其实就是懒得),希望能帮到需要的人. 效果图如下: 可以充设备组件拖动到右侧容器中, ...

  3. Vue中基于Vuex使用echarts组件动态数据绑定的方法

    效果如下: 1.导入echarts组件,建议使用4.9.0版本,5.0.1可能会报错 npm uninstall echarts //卸载npm install echarts@4.9.0//引入特定 ...

  4. vue中 使用h5 drag实现拖拽功能

    先了解一下h5中的drag事件: 先贴一段代码: 先设置draggable属性为true //开始拖拽时执行 通过e.dataTransfer.setData 设置数据handleDragStart ...

  5. vue中 基于echart地图功能 省级地图下钻和返回、发射线、水波涟漪等功能展示

    效果图展示-包含水波涟漪.发射线功能效果图 点击地市.区县下钻功能 vue项目中main.js import echarts from 'echarts' import anhui from '../ ...

  6. vue中基于高德地图,获取省级地图(以安徽为例)

    效果图展示 <template><div><div id="mapId" class="rescure-map"></ ...

  7. Vue中JSX的基本用法

    基本用法 首先需要约定一下,使用JSX组件命名采用首字母大写的驼峰命名方式,样式可以少的可以直接基于vue-styled-components写在同一个文件中,复杂的建议放在单独的_Styles.js ...

  8. html5 drag this,HTML5拖放(drag和drog)

    拖放(drag和drog)是HTML5的标准的组成部分,也是种常见的特性,意义为抓起一个元素放入到另外的一个位置,在HTML5中任何元素都可以被拖放,前题是要相关进行设置. 1.设置元素为可拖放,也就 ...

  9. HTML5 drag drop 拖拽与拖放简介

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1419 一.前面的话 ...

最新文章

  1. Ubuntu: 为firefox安装flash插件
  2. ffmpeg ffplay播放延时大问题:播放延时参数设置
  3. win7笔记本为手机共享wifi
  4. 系统补丁自动批量安装
  5. 【英语学习】【Daily English】U06 Shopping L02 What's the size?
  6. 雷军:小米9完全开放购买 全面现货供应
  7. confluence 统计页面访问量插件Page View Tracker
  8. 构建之法读书笔记05
  9. jmeter---ftp性能测试
  10. 计算机系统概论(原书第2版)部分课后习题答案(第三章)
  11. candence的图纸大小设置_Candence基础知识1(CADENCE从原理图到PCB步骤 )
  12. xp系统计算机蓝屏,xp系统电脑一直蓝屏重启循环的原因和解决方法
  13. android cursor循环,Android:Cursor.getColumnIndex()在行循环中是不变的吗?
  14. 卸载office2010安装包时提示语言不受系统支持
  15. 她的话指引了很多人的未来生活———亦舒
  16. UG二次开发技术的研究
  17. 第一个vtk.js程序 锥子
  18. NPS:使用 Windows NPS Server 部署 802.1X 无线认证(1)
  19. java实现立方和等式
  20. 时域采样与频域采样实验报告_使用网络分析仪进行时域分析

热门文章

  1. julia语言 python解释器_继 Python 解释器移植到 Firefox 后,Mozilla 现在想支持 Julia 和 R...
  2. android 查找资源,Android Studio 查找无用资源
  3. php 批量删除挂马文件夹,万能删除服务器被挂马后删不掉的文件夹
  4. linux 压缩权限,linux的基本操作(归档压缩,用户、权限管理,远程服务器构建和vi编辑器)...
  5. 计算机科学课程规范,计算机科学及技术学院《本科生课程设计规范化要求》.doc...
  6. Linux防火墙设置IP端口白名单
  7. Linux中设置tab4个空格,linux下vim中tab设置为4个空格例子
  8. python莫比乌斯内接矩形_莫比乌斯反演例题集 ^_^(示例代码)
  9. ajax 入参为list_ajax传递参数list对象或传递数组对象到后台
  10. kafka key的作用_震惊了,原来这才是Kafka的“真面目”!