电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

vue和H5 draggable實現拖拽并替換效果

瀏覽:4日期:2022-12-24 16:28:14

前言

公司項目需要做拖拽替換效果,本人用的vue框架。在網上找了很多資料都是用的 Vue.Draggable(git地址)。但這個組件實現的拖拽后插入效果,我倒騰了很久也沒有替換效果(如果Vue.Draggable能實現拖拽替換效果的話請大神給我留言)。

JQ有實現拖拽的插件,我下載過一個插件并看過源碼,大致原理是給目標元素設置定位屬性,通過監聽鼠標mousedown,mouseup事件,再計算鼠標位置變化,然后給元素樣式設置偏移值來實現拖拽效果的。

H5提供了專門的拖拽API 給元素添加 draggable 屬性,設置為 true就能實現拖拽了。本文使用的H5提供的拖拽API 以及vue 無其他任何添加,請放心使用

直接上代碼

<template> <div class='container'> <div class='layout'> <button @click='layoutType=val.value' v-for='val in layoutOptions' :key='val.value' >{{val.label}}</button> </div> <div : v-for='(group,gindex) in data' :key='gindex' > <div v-for='(item,cindex) in group.children' :key='cindex' :data- draggable='true' @dragstart='onDragstart($event)' @dragend='onDragend($event)' @dragover='onDragover($event)' @drop='onDrop($event)' : : > <div class='content'>{{item.color ? item.color : ’我是空對象’}}</div> </div> </div> <div class='tips'>上面兩個區域內是展示區的內容能互相拖拽 <br>下面的是資源區,只能復制出去覆蓋目標區域,本身不會被替換掉 </div> </div></template><script>export default { data() { return { stargindex: '', endIndex: '', layoutType: '9', layoutOptions: [ { label: '單分屏', value: 1 }, { label: '二分屏', value: 2 }, { label: '三分屏', value: 3 }, { label: '四分屏', value: 4 }, { label: '六分屏', value: 6 }, { label: '九分屏', value: 9 } ], data: [ { group: 'left-show', title: '視頻播放區一', children: [ { id: 6, color: 'orange' }, { id: 2, color: 'yellow' }, {}, {}, {}, {}, { id: 3, color: 'cyan' }, {}, { id: 5, color: 'brown' } ] }, { group: 'right-show', title: '視頻播放區二', children: [ {}, { id: 7, color: 'pink' }, {}, {}, { id: 4, color: 'purple' }, {}, {}, {}, { id: 10, color: 'gray' } ] }, { group: 'source', title: '視頻資源區', children: [ { id: 11, color: 'white' }, { id: 12, color: 'black' }, { id: 13, color: 'red' }, { id: 14, color: 'green' }, { id: 15, color: 'blue' } ] } ] }; }, methods: { onDragstart(event) { this.stargindex = event.target.getAttribute('data-id'); }, onDragend(event) { let startGroupIndex = this.stargindex.split('-')[0]; let startChildIndex = this.stargindex.split('-')[1]; let endGroupIndex = this.endIndex.split('-')[0]; let endChildIndex = this.endIndex.split('-')[1]; // 對數據做簡單的深拷貝 目前不需要 // let endObj = JSON.parse( // JSON.stringify(this.data[endGroupIndex].children[endChildIndex]) // ); // let startObj = JSON.parse( // JSON.stringify(this.data[startGroupIndex].children[startChildIndex]) // ); let endObj = this.data[endGroupIndex].children[endChildIndex]; let startObj = this.data[startGroupIndex].children[startChildIndex]; if (this.data[endGroupIndex].group === 'source') { //往資源區拖拽時 不做任何替換操作 return; } this.data[endGroupIndex].children.splice(endChildIndex, 1, startObj); if (this.data[startGroupIndex].group !== 'source') { //拖拽起始區域不是 source時 把起始區域替換成拖拽后區域的數據 this.data[startGroupIndex].children.splice(startChildIndex, 1, endObj); } }, onDrop(event) { if (event.target.className.indexOf('cls-default') > -1) { this.endIndex = event.target.getAttribute('data-id'); } else { this.endIndex = event.target.parentElement.getAttribute('data-id'); } }, onDragover(event) { event.preventDefault(); } }};</script><style scoped>.container { background-color: #eee; height: 800px;}.layout .layout-btn { background-color: #409eff; color: #fff; padding: 10px 15px; margin: 10px 15px;}.tips { font-size: 24px; text-align: center;}.group { float: left; overflow: hidden; box-sizing: border-box;}.group-title { height: 40px; line-height: 40px;}.cls-default { float: left; margin: 0; box-sizing: border-box; overflow: hidden; border: 1px solid #999;}.cls-default .content { text-align: center; padding-top: 20px; font-size: 20px;}.top-container { height: 400px; width: 40%; margin: 15px 5%;}.top-container .cls-default { width: 33.33%; height: 33.33%;}.top-container .cls1-0 { width: 100%; height: 100%;}.top-container .cls2-0 { width: 50%; height: 100%;}.top-container .cls3-0 { width: 50%; height: 100%;}.top-container .cls3-1 { width: 50%; height: 50%;}.top-container .cls4-0 { width: 50%; height: 50%;}.top-container .cls6-0 { width: 66.66%; height: 66.65%;}.bottom-container { width: 90%; height: 200px; margin: 15px 5%;}.bottom-container .cls-default { width: 15%; height: 150px;}</style>

寫在最后

本文是我第一次寫博客,寫的比較隨意,樣式處理也是很隨心。如有錯誤請指正。

后面有時間會完善組件的功能。參考Vue.Draggable(git地址)這個組件。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
主站蜘蛛池模板: NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | 非甲烷总烃分析仪|环控百科 | 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 手持气象站_便携式气象站_农业气象站_负氧离子监测站-山东万象环境 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 三板富 | 专注于新三板的第一垂直服务平台 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 软膜天花_软膜灯箱_首选乐创品牌_一站式天花软膜材料供应商! | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 泰安办公家具-泰安派格办公用品有限公司 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | 杭州翻译公司_驾照翻译_专业人工翻译-杭州以琳翻译有限公司官网 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 车件|铜件|车削件|车床加工|五金冲压件-PIN针,精密车件定制专业厂商【东莞品晔】 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 压接机|高精度压接机|手动压接机|昆明可耐特科技有限公司[官网] 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 365文案网_全网创意文案句子素材站 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 |