前端组件拖拽以及自定义组件布局demo(基于vue2实现)

news/2024/7/11 1:33:43 标签: javascript, vue.js, css, es6
  • 这篇文章简单介绍前端(vue)里组件拖拽以及拖拽完成以后组件自定义排列的的写法。主要介绍思路以及实现方式。
  • 组件的放大缩小以及拖拽借助一个不错的插件

vue-grid-layout
git文档:https://github.com/jbaysolutions/vue-grid-layout/blob/master/README-zh_CN.md

  • 这个插件定义的某一个元素的宽高是利用倍数计算宽高以及位置,在使用的时候可以自己先去定义一个栅格的背景,我做的是12格,通过javascript动态计算每一个元素占总宽度的百分比。下方图片展示
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201216175651706.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzM1NzI4,size_16,color_FFFFFF,t_70

  • 这个栅格布局是利用css的背景渐变实现(linear-gradient)
    在这里插入图片描述

  • 组件使用需要详细的看文档,下边我列一下代码片段
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 到这里就完成了栅格布局以及栅格内的元素拖拽以及放大缩小

下边介绍从左侧列表内拖拽组件在右侧栅格布局内展示

  • 不借助插件,因为用插件可能会造成冲突(猜测,没有测过),有一款拖拽插件,有兴趣可以试一试 => vuedraggable
  • 思路

1.首先要利用鼠标事件

鼠标按下事件 onmousedown
鼠标移动事件 onmousemove
鼠标抬起事件 onmouseup

2.鼠标按下时,确定按的是列表的哪个元素,获取到对应的数据,鼠标按下事件实在当前元素的身上。
3.鼠标按下时,这时如果要拖拽,那这时鼠标移动事件就得是全局的了,因为要把元素拖到栅格容器内,要在window上操作onmousemove,那么能拿到鼠标距离屏幕左侧以及上边的距离,也就是x轴和y轴的坐标点,那么这时拖动的并不是当前在dom结构里的元素,而是一个定位的元素(需要页面上有一个隐藏的定位元素,拖拽的时候显示),这时要把你拿到的数据,赋值给到定位的数据,把鼠标的距离,也就是保存的坐标点赋值到定位元素的top,和left。如下图:
在这里插入图片描述
3.这时候拖拽就实现了,要把它准确的拖到栅格容器内那么它才会显示出来,就要判断鼠标距离屏幕左侧距离是否大于栅格容器距离屏幕左侧距离,以及鼠标距离屏幕顶部距离是否大于栅格容器距离屏幕顶部距离。
4.这时还需要一个开关去控制是否要监听鼠标移动事件,否则鼠标一开始移动就会触发你的逻辑(很重要)。
5.到这里基本就实现了左侧拖拽列表元素到栅格容器内展示出来。里面还有一系列的判断,比如,你已经把某一个元素拖进去了,那么它就不能在进行拖拽,以及鼠标在进入栅格容器时并没有抬起鼠标左键而是移动出去抬起,那么就要删除你放到容器里的元素;鼠标进入容器内时,元素会显示出来,这是如果没有抬起鼠标,还是在移动状态,那么这个容器内的元素就要随着鼠标移动;以及你已经拖拽到容器内部了,那左侧列表对应的哪一项就要变换样式以及鼠标移入时不可拖拽等一系列的需求。如下图简单展示一下:
在这里插入图片描述
在这里插入图片描述

  • 部分js
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
code_demo


http://www.niftyadmin.cn/n/1364953.html

相关文章

bapc2012 D\Digital Transmission DP

题意:输入一行不超过100 000的比特流,由 "0","1","."组成,"."可以表示0也可以表示1。 要求:①该比特流不能存在两个连续的00或者11 ②该比特流必须满足1个总个数和0的总个数相…

vue仿elementui自定义一个v-pageloading指令,开箱即用

创建一个loading文件夹。包含loading.vue、loading.js、index.jsloading.vue 写布局及css样式实例代码 <template><div class"loading-container" v-show"loadingShow"><div class"pageloading"><span></span>&l…

ssh之雇员管理系统(8)-增加其他功能

一、增加雇员 前面我们已经讲得有大部分关键技术啦&#xff0c;而现在也就是我们要扩展&#xff0c;写出来自己的水平啦&#xff0c;当然&#xff0c;逻辑和你的经验将是成功的保障。 增加雇员的话&#xff0c;我们先将这个页面打通<a href"${pageContext.request.cont…

vue2 elementui日期时间选择器

设置日期选择器&#xff08;范围&#xff09;只能选择当前月份的日期 <el-date-pickerv-model"search.date"type"daterange"range-separator"至"start-placeholder"开始日期"end-placeholder"结束日期"value-format&quo…

图的遍历(广度优先遍历)- 数据结构和算法61

图的遍历&#xff08;广度优先遍历&#xff09; 让编程改变世界 Change the world by program 广度优先遍历 广度优先遍历&#xff08;BreadthFirstSearch&#xff09;&#xff0c;又称为广度优先搜索&#xff0c;简称BFS。 如果以之前我们找钥匙的例子来讲&#xff0c;运用…

antdesign-vue table合并列

合并的方法 const temp {}; const mergeCells (text, array, columns) > {let rowSpan 0if (array.length 1) {rowSpan 1} else {if (text ! temp[columns]) {temp[columns] textarray.forEach((item, index, arr) > {if (item[columns] temp[columns]) {rowSpan…

Spring IOC原理解析

首先恭喜守宏同学找到了自己心仪的工作&#xff0c;入职的事情终于尘埃落定&#xff0c;也算是一个新的开始吧。和守宏聊天的时候也说了很多有关工作的事情&#xff0c;畅想了以后美好的未来&#xff0c;也想到了今后的种种困难。不说别的就是单单在北京住房这一项就够任何一个…

mPaaS小程序使用国密算法sm2加密传参

使用 miniprogram-sm-crypto使用文档npm i miniprogram-sm-crypto引入 const sm2 require(‘miniprogram-sm-crypto’).sm2; 在js文件里 const sm2 require(miniprogram-sm-crypto).sm2; const smTwo {sm2,cipherMode: 1, // 1 - C1C3C2&#xff0c;0 - C1C2C3&#xff0c;…