写在前面

在我们平时做也无需求中,往往会遇到拖拽模块的需求。刚开始没有接触过拖拽的时候,会对拖拽有陌生感,会比较担心实现起来会比较的复杂,可能自己很难搞定。然后就会去网上百度一些 vue 拖拽相关的插件,比如 vue-draggable 它是基于 sortable.js 的二次封装,兼容了移动端,不过我们写 toB 项目的时候,可能只有 pc 端需要拖拽功能,所以这期就结合 vue 教大家手写实现拖拽。

HTML5 拖放 api

1. 设置元素为可拖放

首先,为了使元素可拖动,把 draggable 属性设置为 true

<img draggable="true">

2. 拖放事件

拖放涉及到两种元素,一种是被拖拽元素(源对象),一种是放置区元素(目标对象)。如下图所示,按住A元素往B元素拖拽,A元素即为源对象,B元素即为目标对象。

触发对象 事件名称 说明
在拖动目标上触发事件 ondragstart 用户开始拖动元素时触发
ondrag 元素正在拖动时触发
ondragend 用户完成元素拖动后触发
释放目标时触发的事件 ondragenter 当被鼠标拖动的对象进入其容器范围内时触发此事件
ondragover 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
ondragleave 当被鼠标拖动的对象离开其容器范围内时触发此事件
ondrop 在一个拖动过程中,释放鼠标键时触发此事件

需要注意的是:dragenter和dragover事件的默认行为是拒绝接受任何被拖放的元素。因此,我们必须阻止浏览器这种默认行为。e.preventDefault();

2. vue 拖拽实现

下面我会用两种方式实现 vue 拖拽

1. 拖动中触发排序

因为要在拖动中触发排序,所以使用 ondragstartondragenter api 来实现

效果如下:

线上体验地址

代码:

<template><div><transition-group name="drag" class="list" tag="ul"><li@dragstart="dragstart(index)"@dragenter="dragenter($event, index)"@dragover.preventdraggablev-for="(item, index) in list":key="item.label"class="list-item">{{ item.label }}</li></transition-group></div>
</template>
<script>
export default {data() {return {list: [{ label: "列表1" },{ label: "列表2" },{ label: "列表3" },{ label: "列表4" },{ label: "列表5" },{ label: "列表6" },],dragIndex: "",};},methods: {dragstart(index) {this.dragIndex = index;},dragenter(e, index) {// 避免源对象触发自身的dragenter事件if (this.dragIndex !== index) {const moving = this.list[this.dragIndex];this.list.splice(this.dragIndex, 1);this.list.splice(index, 0, moving);// 排序变化后目标对象的索引变成源对象的索引this.dragIndex = index;}},},
};
</script>
<style lang="scss" scoped>
.list {list-style: none;.drag-move {transition: transform 0.3s;}.list-item {cursor: move;width: 300px;background: #EA6E59;border-radius: 4px;color: #FFF;margin-bottom: 6px;height: 50px;line-height: 50px;text-align: center;}
}
</style>

1. 辅助线拖拽后排序

辅助线拖拽后排序我们用到了 ondragstartondragoverondragend api

效果如下:

线上体验地址

代码:

<template><div><transition-group name="drag" class="list" tag="ul"><li@dragstart="dragStart(item, index)"@dragover.prevent="dragOver(index)"@dragend="dragEnd()"draggablev-for="(item, index) in todolist":key="item.label":class="['list-item', { 'is-dragover': index === newIndex }]">{{ item.label }}</li></transition-group></div>
</template>
<script>
export default {data() {return {todolist: [{ label: "列表1" },{ label: "列表2" },{ label: "列表3" },{ label: "列表4" },{ label: "列表5" },{ label: "列表6" },],oldIndex: "",oldData: "",newIndex: "",};},methods: {dragStart(val, i) {this.oldIndex = i;this.oldData = val;},dragOver(i) {this.newIndex = i;},dragEnd() {let newItems = [...this.todolist];// 删除老的节点newItems.splice(this.oldIndex, 1);// 在列表中目标位置增加新的节点newItems.splice(this.newIndex, 0, this.oldData);this.todolist = [...newItems];this.newIndex = "";},},
};
</script>
<style lang="scss" scoped>
.list {list-style: none;.drag-move {transition: transform 0.3s;}.list-item {position: relative;cursor: move;width: 300px;background: #EA6E59;border-radius: 4px;color: #FFF;margin: 10px 0;height: 50px;line-height: 50px;text-align: center;}
}.list-item.is-dragover::before {content: "";position: absolute;bottom: -8px;left: 0;width: 100%;height: 4px;background-color: #0c6bc9;
}
.list-item.is-dragover::after {content: "";position: absolute;bottom: -12px;left: -6px;border: 3px solid #0c6bc9;border-radius: 50%;width: 6px;height: 6px;background-color: #fff;
}
</style>

VUE 实现拖拽效果相关推荐

  1. 基于Vue实现拖拽效果以及解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突

    本人在开发中遇到实现一个基于vue的悬浮框拖动效果,经过努力研究最终实现了功能,一下是我的方法和部分代码,希望对您有所帮助,如有不对的地方还请指出.谢谢!下面步入正题: 首先展示一下功能的效果图: 要 ...

  2. 解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突

    功能描述: 如图,右侧悬浮菜单按钮,只支持上下方向拖动,点击时展开或关闭菜单. BUG说明: 鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认执行click事件,经验证,click事件与mouse ...

  3. vue拖拽效果(适用范围自定义表单,电子合同签章等)

    vue拖拽效果实现 实现原因 之前项目需求做一个自定义拖拽控件,进行自定义表单生成以及电子合同签字盖章,总结一下思路. 实现思路 首先需要可以拖拽的控件, 鼠标长按拖拽到拖拽存放区后,松开鼠标拖拽存放 ...

  4. Vue中实现拖拽效果

    Vue2项目中遇到需求要求页面左侧部分实现拖拽效果 实现效果: 1665739151500 实现代码: 一.使用盒子包裹需要拖拽的区域,并绑定ref 二.使用$ref获取DOM信息 具体代码(这个方法 ...

  5. 在 Element-UI 的 Table 组件上添加列拖拽效果

    在 Element-UI 的 Table 组件上添加列拖拽效果 一.数据驱动 传统的拖动效果,都是基于通过 mousedown.mousemove.mouseup 事件来修改删减 dom 节点 但 V ...

  6. html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件

    因业务场景需要一个可拖拽修改节点位置的树形组件,因此动手撸了一个,乘此机会摸了一把html5原生拖拽.近期有时间将核心部分代码抽出,简单说下实现方式. 1.树形结构-组件递归使用 树形结构非常简单,t ...

  7. vue 移动到图片浮动_基于Vue实现拖拽升级(九宫格拖拽)

    前言 在本文中将会用Vue完成九宫格拖拽效果,同时介绍一下网格布局.具体代码以及demo可以点以下超链接进入 效果实例 Demo 简单了解Grid布局(网格布局) 什么是网格布局 CSS网格布局(又称 ...

  8. element-UI ,Table组件实现拖拽效果

    拖拽效果,先放效果图,步骤放在后面~~ 一.引入三方插件 1.引入sortable.js的包: npm install sortable.js --save 2.或者npm i -S vuedragg ...

  9. 实现元素拖拽放大缩小_Vue实战067:DOM元素拖拽效果的实现

    DOM元素拖拽效果: 当鼠标选中目标元素之后可以将其拖放至指定区域的任意位置,实现的思路主要是通过鼠标事件按下.移动.抬起,摁下鼠标时记录鼠标位置以及元素位置并算出鼠标相对元素的位置,在拖拽时记下当前 ...

最新文章

  1. 重磅直播|结构光的非线性问题与校正
  2. 如何融入到更积极的环境,促进技术提升
  3. html2canvas截图地图和看到的不一样_认知高度不同的人,看到的世界是不一样的...
  4. CSS 普通流 和 行格式化上下文 IFC
  5. 7 orm 有批量更新_2020.12.24更新公告
  6. opencv 亮度非线性变化 一
  7. Netty in action—codec框架
  8. MySQL二进制部署
  9. 二本天坑,一战成硕,上岸北邮
  10. 学会这六种方法,让你的设计变得中国风
  11. jsonp的原理与实现
  12. django面试题总结
  13. MySQL免安装版本的下载/配置/连接DBeaver---详细教程
  14. 在我的垃圾电脑上U盘安装ubuntu单系统
  15. SDKD 2021 C3 7th Round
  16. 了解Java8中的parallelStream
  17. cocos2dx3.16输入框:TextField和EditBox的使用
  18. 征友记之---前端开发Partner
  19. 测不准原理?记一次Guava队列问题的排查
  20. 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。例如, 罗马数字 2 写做 II ,即为两个并列的 1

热门文章

  1. 微信小程序 springboot旅游景点门票预订服务系统
  2. 如何清除计算机的u盘使用记录,win7如何删除u盘使用记录?win7清除u盘使用痕迹方法...
  3. 【Rasa-Core源码阅读】Tracker
  4. 今目标文荣演讲:免费的力量
  5. 【JS基础-1】JavaScript语言简单介绍(语法、变量、数组、流程控制语句、函数、对象和事件)
  6. IOS之NSArray 中调用的方法详解(2)
  7. 美国留学生活点滴【转】
  8. Qt 对 wav 音频文件进行剪切
  9. [Mattermost]安装Docker版
  10. skydive跨域问题解决