摘要:涉及部分的,不會對理解全局產(chǎn)生干擾。在上監(jiān)聽事件,當為畫布時,通過創(chuàng)建一個藍色虛線框移動的時候,更新的位置在上監(jiān)聽事件,落在畫布時,創(chuàng)建一個的節(jié)點從而完成整個拖拽添加元素的功能。
拖拽操作平時用的比較少,在最近的一個項目中使用到了,并且踩了一些坑,本文做一個簡單的總結。涉及部分G6的API,不會對理解全局產(chǎn)生干擾。需求概述
如下圖所示,左側為GGEditor元素面板React組件,右側為G6畫布,現(xiàn)需要將元素從「元素面板」中拖拽到「畫布」上。要求:
拖拽時藍色虛線框和元素面板的對應元素尺寸相同(為一矩形)
藍色虛線框跟隨鼠標移動,指明當前拖拽的位置
元素面板上對應元素不應發(fā)生改變
??圖中的黑色圓圈僅為錄屏軟件指明鼠標操作提示
拖拽方法總結相較于大部分DOM操作只需要監(jiān)聽某一種事件,原生拖拽功能的實現(xiàn)通常需要監(jiān)聽全部或部分的下述事件:
事件 | event.target | 觸發(fā)時機 |
---|---|---|
drag | 被拖動元素 | 拖拽中(每幾百毫秒觸發(fā)一次) |
dragstart | 被拖動元素 | 剛開始拖拽 |
dragend | 被拖動元素 | 拖拽結束(鼠標釋放或esc) |
dragover | 被拖動元素下方元素 | 拖拽到某一目標上時(每幾百毫秒一次) |
dragenter | 被拖動元素下方元素 | 被拖動元素進入可釋放處時 |
dragleave | 被拖動元素下方元素 | 拖拽離開某一目標時 |
drop | 被拖動元素下方元素 | 同dragend 且在其之前觸發(fā) |
實現(xiàn)之前,有幾個踩坑點先說明:
不能將左側面板的元素設置為draggable,因為原生拖拽自帶陰影效果,如下圖。
很明顯這不是我們要的效果。
拖拽時的藍色虛線框應該由G6繪制成一個canvas的元素,因為畫布可以放大或縮小,這個虛線框應和實際放在畫布上的元素尺寸相同而不是左側面板的元素尺寸相同。(不了解G6的同學自行忽略)
思路拖拽開始或鼠標落下時,創(chuàng)建一個和元素大小寬高相同的透明度為0的矩形shadowShape,并監(jiān)聽其drag,mouseup事件。
在document上監(jiān)聽dragenter事件,當target為畫布時,通過G6api創(chuàng)建一個藍色虛線框dragShape
shadowShape移動的時候,更新dragShape的位置
在document上監(jiān)聽drop事件,落在畫布時,創(chuàng)建一個G6的節(jié)點從而完成整個拖拽添加元素的功能。
??踩坑點:必須要阻止dragover的默認行為,保證drop的正常觸發(fā),參考這則問答
總結1 相較于上個版本的GGEditor,實現(xiàn)了拖拽功能的連續(xù)性。之前,鼠標即使保持按下,一旦移出畫布,就終止了本次的拖拽過程。
上個版本的GGEditor
2 待優(yōu)化點:
由于藍色虛線框是G6畫布上的元素,能夠根據(jù)G6的縮放比例自動調(diào)整大小,所以在其他地方的拖拽過程不易做出類似的虛線框,體驗上有間斷感
當前代碼在一個react組件里操作了大量的原生事件監(jiān)聽,不夠React,考慮之后直接開發(fā)一個新的組件,使用React的合成事件來重寫。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54079.html
摘要:涉及部分的,不會對理解全局產(chǎn)生干擾。在上監(jiān)聽事件,當為畫布時,通過創(chuàng)建一個藍色虛線框移動的時候,更新的位置在上監(jiān)聽事件,落在畫布時,創(chuàng)建一個的節(jié)點從而完成整個拖拽添加元素的功能。 showImg(https://segmentfault.com/img/remote/1460000019564977);showImg(https://segmentfault.com/img/remot...
摘要:案例說明使用原生完成桌面操作級應用,對于原生的掌握情況而言,是一個較為全面的綜合型案例。本次課從事件相關的功能入手,給大家?guī)碓敿毜姆窒怼? showImg(https://segmentfault.com/img/bVbh1qw); 案例說明:使用原生 JS 完成桌面操作級應用,對于原生 JS 的掌握情況而言,是一個較為全面的綜合型案例。本次課從事件(event)相關的功能入手,給大家...
摘要:原生實現(xiàn)對元素的拖拽一背景介紹此處為鋪墊內(nèi)容,可跳過隨著前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識新技術層出不窮,極大地拓展了開發(fā)者的操作空間,也大大地提升了用戶體驗。 原生 JS 實現(xiàn)對 html 元素的拖拽 一、背景介紹 【此處為鋪墊內(nèi)容,可跳過】 隨著 Web 前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識、新技術層出不窮,極大地拓展了開發(fā)者的操作空間,也大大地提升了用戶體驗。而隨著...
摘要:原生實現(xiàn)對元素的拖拽一背景介紹此處為鋪墊內(nèi)容,可跳過隨著前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識新技術層出不窮,極大地拓展了開發(fā)者的操作空間,也大大地提升了用戶體驗。 原生 JS 實現(xiàn)對 html 元素的拖拽 一、背景介紹 【此處為鋪墊內(nèi)容,可跳過】 隨著 Web 前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識、新技術層出不窮,極大地拓展了開發(fā)者的操作空間,也大大地提升了用戶體驗。而隨著...
閱讀 3887·2021-09-27 13:36
閱讀 4592·2021-09-22 15:12
閱讀 3067·2021-09-13 10:29
閱讀 1837·2021-09-10 10:50
閱讀 2365·2021-09-03 10:43
閱讀 526·2019-08-29 17:10
閱讀 449·2019-08-26 13:52
閱讀 3258·2019-08-23 14:37