日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Vue3?中實現(xiàn)元素拖拽功能

瀏覽:36日期:2022-06-12 18:39:36
目錄進入正題準備實驗環(huán)境元素的位置和移動定義三組坐標注冊 mousedown 事件實現(xiàn)拖拽的核心補充其它部分代碼和演示總結(jié)進入正題

元素拖拽是一個比較典型的前端學習案例,需要對 JavaScript 的事件有一定的了解,我也是在最近的工作中才重新拾起了這塊內(nèi)容,通過在 Vue3 這種聲明式編程風格的框架中把元素拖拽一次講清楚。

準備實驗環(huán)境

依舊推薦你來1024Code Fork 我的《【項目模板】Vue3+Vite3+Ts4》 開始這次學習。

PS:Vue3 模板全局樣式中的居中屬性可能會造成實驗干擾,請注意!!!

元素的位置和移動

在實現(xiàn)元素拖拽我們使用 mouse 事件,在 mouse 事件的回調(diào)函數(shù)中可以得到當前事件發(fā)生時元素的位置,對應(yīng)的屬性是 MouseEvent 中的 clientX 和 clientY,我們后續(xù)將通過讀取這兩個屬性來實時更新元素的位置。

元素的移動推薦優(yōu)先使用 transform 中的 translate 實現(xiàn),相比于修改元素的 top、left 屬性來說不會造成元素布局的改變,避免了回流和重繪造成的性能影響。

PS:在 MDN 有一份關(guān)于translate的使用和體驗,可以感受一下。

定義三組坐標

分別定義用來記錄元素初始位置的一組坐標(originalPosition)、元素被按下時指針在元素上的坐標(mousedownOffset)和元素在移動時實時更新的一組坐標(elementPosition)。

記錄元素初始位置的坐標,原點位于頁面左上角,用來在初始化和被拖拽結(jié)束后還原被拖拽元素的位置,固定值不發(fā)生變化:

const originalPosition = reactive({ x: 10, y: 10,})

元素被按下時指針在元素上的坐標,原點位于被拖拽元素的左上角,通過按下時指針的坐標 - 元素初始的偏移位置得到:

const mousedownOffset = reactive({ x: 0, y: 0,})

元素在移動時實時更新的坐標,原點位于頁面左上角,初始值應(yīng)該同 originalPosition ,在 mousemove 事件發(fā)生時,通過指針的實時坐標 - mousedownOffset 得到:

const elementPosition = reactive({ x: 0, y: 0,})

PS:當原點是頁面左上角時在圖中的1號點表示 originalPosition 或 elementPosition,2號點表示指針按下時的坐標,當原點是1號點時在圖中的2號點表示 mousedownOffset;

注冊 mousedown 事件

在實現(xiàn)元素拖拽時,僅需要給被拖拽的元素添加 mousedown 事件即可,監(jiān)聽事件使用完后記得要清楚掉,成對出現(xiàn)的習慣一定要養(yǎng)成。

如果你把 mousemove 和 mouseup 都添加到被拖拽的元素上,你會發(fā)現(xiàn)有脫離控制的現(xiàn)象發(fā)生。

在頁面加載完成后首先要重置一下被拖拽元素的默認位置,并增加 mousedown 事件,在組件卸載后刪除 mousedown 事件:

const restore = () => { elementPosition.x = originalPosition.x; elementPosition.y = originalPosition.y;}onMounted(() => { restore(); floatButton.value.addEventListener('mousedown', onMousedown, true);})onUnmounted(() => { floatButton.value.removeEventListener('mousedown', onMousedown, true);})實現(xiàn)拖拽的核心

選擇 Vuejs 的原因就是因為其是 MVVM 型框架,我們關(guān)注點在聲明上,內(nèi)部的運轉(zhuǎn)機制有框架負責,所以在下面的事件處理上就只需要在對應(yīng)的事件中去更新一開始聲明的三組坐標就可以了。

在 onMousedown 時,通過指針所在的坐標 - 被拖拽元素初始位置的坐標得到指針此時在被拖拽元素上的坐標,onMousedown 時要為 document 添加 mousemove 和 mouseup 事件:

const onMousedown = (event: MouseEvent) => { event.stopPropagation(); mousedownOffset.x = event.clientX - originalPosition.x; mousedownOffset.y = event.clientY - originalPosition.y; document.addEventListener('mousemove', onMousemove, true); document.addEventListener('mouseup', onMouseup, true);}

在 onMousemove時,通過指針所在的坐標 - 指針在被拖拽元素上的位置得到被拖拽元素左上角距離頁面左上角的距離,并更新到 elementPosition:

const onMousemove = (event: MouseEvent) => { event.stopPropagation(); elementPosition.x = event.clientX - mousedownOffset.x; elementPosition.y = event.clientY - mousedownOffset.y;}

在 onMouseup時,主要做的就是為 document 移除在 onMousemove 時注冊的兩個事件,要注意的是移除的事件要是同一個事件,也就是引用一致的事件,推薦將對應(yīng)的處理事件賦值給一個變量使用,最后可以在拖拽結(jié)束后還原被拖拽元素的位置:

const onMouseup = (event: MouseEvent) => { event.stopPropagation(); document.removeEventListener('mousemove', onMousemove, true); document.removeEventListener('mouseup', onMouseup, true); restore();}補充其它部分代碼和演示<div ref='floatButton' :style='{ 'transition-duration': '0.1s', transform: `translate(${elementPosition.x}px, ${elementPosition.y}px)` }'></div>.float-button { position: absolute; width: 42px; height: 42px; background: red; border-radius: 5px; user-select: none; background-image: url(../assets/taobao.svg); background-size: cover;}

總結(jié)

使用 mousemove、translate 在 Vue3 中實現(xiàn)可以隨意拖拽的 Icon 的案例就完成了,在本次案例中需要認真思考對應(yīng)的幾個坐標和移動時坐標如何更新,事件的使用要成對出現(xiàn),如何在這個拖拽的 Icon 上增加點擊事件時還需要多做一些處理,有答案的朋友可以留下你的想法~

到此這篇關(guān)于在 Vue3 中實現(xiàn)飄逸的元素拖拽的文章就介紹到這了,更多相關(guān)Vue3元素拖拽內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产电影| 日本欧美一区| 日本欧美国产| 日韩中文视频| 美女毛片一区二区三区四区| av亚洲在线观看| 石原莉奈在线亚洲三区| 久久国产精品免费一区二区三区| 欧美一区在线观看视频| 婷婷亚洲成人| 欧美黑人做爰爽爽爽| 日韩在线观看一区| 激情久久中文字幕| 亚洲精品无吗| 成人午夜在线| 欧美va亚洲va日韩∨a综合色| 亚洲香蕉久久| 国产日产高清欧美一区二区三区| 久久免费大视频| 香蕉精品视频在线观看| 亚洲日本在线观看视频| 国产福利亚洲| 免费观看亚洲| 视频一区二区三区在线| 国产精品嫩模av在线| 国产在线观看www| 日韩中文字幕不卡| 国产福利资源一区| 亚洲黄色影院| 精品深夜福利视频| 日韩影院免费视频| 国产理论在线| 日本va欧美va瓶| 日韩精品一区二区三区免费观影| 国产精品一二| 久久久久欧美精品| 91大神在线观看线路一区| 精品一区二区男人吃奶| 在线一区免费| 精品国产网站| 久久精品国产大片免费观看| 亚洲精品在线a| 日韩一区二区三区免费播放| 视频一区中文字幕精品| 日韩欧美网址| 国产情侣一区在线| 亚洲激情不卡| 香蕉成人av| 久久av免费看| 国产午夜久久| 国产精品麻豆久久| 欧美天堂在线| 好吊日精品视频| 欧美少妇精品| 国产黄色一区| 亚洲欧美一级| 91九色精品国产一区二区| 国产乱人伦精品一区| 免费观看久久久4p| 不卡在线一区| 日韩电影免费网站| 麻豆精品在线播放| 香蕉久久久久久| 亚洲国产日韩欧美在线| 精品美女在线视频| 日本精品国产| 蜜桃一区二区三区在线观看| 欧美午夜精彩| 日韩一区二区三区在线免费观看| 91亚洲成人| 亚洲在线久久| 在线亚洲国产精品网站| 欧美日韩视频网站| 中文字幕在线官网| 激情国产在线| 美女尤物国产一区| 91精品一区| 日本亚洲不卡| 日韩精品一级| 一二三区精品| 亚洲九九精品| 亚洲资源在线| 久久高清一区| 在线国产一区二区| 红桃视频国产一区| 午夜欧美视频| 在线看片不卡| 激情综合亚洲| 亚洲一级网站| 国产精品美女久久久| 欧美日韩精品一本二本三本| 国产91精品对白在线播放| 久久影院一区| 亚洲一区日本| 无码日韩精品一区二区免费| 亚洲不卡视频| 日韩不卡一二三区| 国产精品成人自拍| 国产一区二区三区免费在线| 福利一区视频| 欧美一区二区三区高清视频| 极品日韩av| 伊人精品在线| 婷婷视频一区二区三区| 久久激情综合网| 精品三级av在线导航| 中文字幕成在线观看| 亚洲午夜一级| 日韩中文字幕一区二区高清99| 精品中文字幕一区二区三区 | 日韩综合在线| 麻豆国产一区| 婷婷综合六月| 精品日韩视频| 精品日韩毛片| 综合一区av| 国产精品jk白丝蜜臀av小说| 国产成人a视频高清在线观看| 亚洲开心激情| 美日韩精品视频| 欧美一区自拍| 日韩成人a**站| 99在线观看免费视频精品观看| 精品国产欧美日韩| 日韩欧美一区二区三区免费观看| 69堂免费精品视频在线播放| 国产亚洲精品美女久久| 成人在线超碰| 美女福利一区二区三区| 午夜精品一区二区三区国产| 视频一区中文字幕精品| 精品在线网站观看| 91久久午夜| 欧美激情五月| 欧美色图一区| 国产欧美激情| 亚洲精品99| 国产黄色一区| 午夜国产精品视频| 国产精品国码视频| 欧美在线亚洲| 麻豆中文一区二区| 欧美成人日韩| 国产欧美日韩一区二区三区四区| 免费在线观看一区二区三区| 国产伦乱精品| 亚洲欧美日韩高清在线| 国产精品白丝久久av网站| 国产精品伦理久久久久久| 国产亚洲精品自拍| 久久gogo国模啪啪裸体| 国产亚洲一区在线| 国产aⅴ精品一区二区三区久久| 国产探花一区| 播放一区二区| 国产欧美三级| 一区福利视频| 精品72久久久久中文字幕| 久久av一区| 蜜臀久久99精品久久久画质超高清| 蜜臀va亚洲va欧美va天堂| 91麻豆精品激情在线观看最新| 国产综合精品一区| 久久精品72免费观看| 亚洲二区视频| 欧美激情99| 亚洲18在线| 91精品精品| 久久精品色播| 日本视频一区二区| 99成人在线视频| 欧美国产极品| 日韩一区精品| 黄色在线一区| 久久裸体视频| 国产成人精品亚洲线观看| 国产毛片一区二区三区| 蜜臀a∨国产成人精品| 亚洲1234区| 四虎8848精品成人免费网站| 欧美日韩精品一区二区三区视频 | 亚洲深夜av| 国内不卡的一区二区三区中文字幕| 国产极品模特精品一二| 亚洲男女av一区二区| av一区在线| 国产高潮在线| 精品99在线| 精品久久电影| 日本h片久久| 91精品丝袜国产高跟在线| 午夜亚洲福利| 日本不卡视频在线观看 | 人人爽香蕉精品| 久久婷婷av| 日韩国产欧美| 国产精品99一区二区三区| 国产精品美女久久久久久不卡| 久久精品系列| 国产精品视频一区视频二区|