国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

從GGEditor的一個(gè)案例看JS原生拖拽功能

PingCAP / 3759人閱讀

摘要:涉及部分的,不會(huì)對(duì)理解全局產(chǎn)生干擾。在上監(jiān)聽(tīng)事件,當(dāng)為畫(huà)布時(shí),通過(guò)創(chuàng)建一個(gè)藍(lán)色虛線框移動(dòng)的時(shí)候,更新的位置在上監(jiān)聽(tīng)事件,落在畫(huà)布時(shí),創(chuàng)建一個(gè)的節(jié)點(diǎn)從而完成整個(gè)拖拽添加元素的功能。

拖拽操作平時(shí)用的比較少,在最近的一個(gè)項(xiàng)目中使用到了,并且踩了一些坑,本文做一個(gè)簡(jiǎn)單的總結(jié)。涉及部分G6的API,不會(huì)對(duì)理解全局產(chǎn)生干擾。
需求概述

如下圖所示,左側(cè)為GGEditor元素面板React組件,右側(cè)為G6畫(huà)布,現(xiàn)需要將元素從「元素面板」中拖拽到「畫(huà)布」上。要求:

拖拽時(shí)藍(lán)色虛線框和元素面板的對(duì)應(yīng)元素尺寸相同(為一矩形)

藍(lán)色虛線框跟隨鼠標(biāo)移動(dòng),指明當(dāng)前拖拽的位置

元素面板上對(duì)應(yīng)元素不應(yīng)發(fā)生改變

??圖中的黑色圓圈僅為錄屏軟件指明鼠標(biāo)操作提示

拖拽方法總結(jié)

相較于大部分DOM操作只需要監(jiān)聽(tīng)某一種事件,原生拖拽功能的實(shí)現(xiàn)通常需要監(jiān)聽(tīng)全部或部分的下述事件:

事件 event.target 觸發(fā)時(shí)機(jī)
drag 被拖動(dòng)元素 拖拽中(每幾百毫秒觸發(fā)一次)
dragstart 被拖動(dòng)元素 剛開(kāi)始拖拽
dragend 被拖動(dòng)元素 拖拽結(jié)束(鼠標(biāo)釋放或esc
dragover 被拖動(dòng)元素下方元素 拖拽到某一目標(biāo)上時(shí)(每幾百毫秒一次)
dragenter 被拖動(dòng)元素下方元素 被拖動(dòng)元素進(jìn)入可釋放處時(shí)
dragleave 被拖動(dòng)元素下方元素 拖拽離開(kāi)某一目標(biāo)時(shí)
drop 被拖動(dòng)元素下方元素 dragend 且在其之前觸發(fā)
需求實(shí)現(xiàn)

實(shí)現(xiàn)之前,有幾個(gè)踩坑點(diǎn)先說(shuō)明:

不能將左側(cè)面板的元素設(shè)置為draggable,因?yàn)樵献ё詭ш幱靶Ч缦聢D。


很明顯這不是我們要的效果。

拖拽時(shí)的藍(lán)色虛線框應(yīng)該由G6繪制成一個(gè)canvas的元素,因?yàn)楫?huà)布可以放大或縮小,這個(gè)虛線框應(yīng)和實(shí)際放在畫(huà)布上的元素尺寸相同而不是左側(cè)面板的元素尺寸相同。(不了解G6的同學(xué)自行忽略

思路

拖拽開(kāi)始或鼠標(biāo)落下時(shí),創(chuàng)建一個(gè)和元素大小寬高相同的透明度為0的矩形shadowShape,并監(jiān)聽(tīng)其dragmouseup事件。

document上監(jiān)聽(tīng)dragenter事件,當(dāng)target為畫(huà)布時(shí),通過(guò)G6api創(chuàng)建一個(gè)藍(lán)色虛線框dragShape

shadowShape移動(dòng)的時(shí)候,更新dragShape的位置

document上監(jiān)聽(tīng)drop事件,落在畫(huà)布時(shí),創(chuàng)建一個(gè)G6的節(jié)點(diǎn)從而完成整個(gè)拖拽添加元素的功能。

??踩坑點(diǎn):必須要阻止dragover的默認(rèn)行為,保證drop的正常觸發(fā),參考這則問(wèn)答

總結(jié)

1 相較于上個(gè)版本的GGEditor,實(shí)現(xiàn)了拖拽功能的連續(xù)性。之前,鼠標(biāo)即使保持按下,一旦移出畫(huà)布,就終止了本次的拖拽過(guò)程。


上個(gè)版本的GGEditor

2 待優(yōu)化點(diǎn):

由于藍(lán)色虛線框是G6畫(huà)布上的元素,能夠根據(jù)G6的縮放比例自動(dòng)調(diào)整大小,所以在其他地方的拖拽過(guò)程不易做出類(lèi)似的虛線框,體驗(yàn)上有間斷感

當(dāng)前代碼在一個(gè)react組件里操作了大量的原生事件監(jiān)聽(tīng),不夠React,考慮之后直接開(kāi)發(fā)一個(gè)新的組件,使用React的合成事件來(lái)重寫(xiě)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/54079.html

相關(guān)文章

  • GGEditor一個(gè)案例JS原生拖拽功能

    摘要:涉及部分的,不會(huì)對(duì)理解全局產(chǎn)生干擾。在上監(jiān)聽(tīng)事件,當(dāng)為畫(huà)布時(shí),通過(guò)創(chuàng)建一個(gè)藍(lán)色虛線框移動(dòng)的時(shí)候,更新的位置在上監(jiān)聽(tīng)事件,落在畫(huà)布時(shí),創(chuàng)建一個(gè)的節(jié)點(diǎn)從而完成整個(gè)拖拽添加元素的功能。 showImg(https://segmentfault.com/img/remote/1460000019564977);showImg(https://segmentfault.com/img/remot...

    taowen 評(píng)論0 收藏0
  • 百度網(wǎng)盤(pán)文件夾框選功能

    摘要:案例說(shuō)明使用原生完成桌面操作級(jí)應(yīng)用,對(duì)于原生的掌握情況而言,是一個(gè)較為全面的綜合型案例。本次課從事件相關(guān)的功能入手,給大家?guī)?lái)詳細(xì)的分享。 showImg(https://segmentfault.com/img/bVbh1qw); 案例說(shuō)明:使用原生 JS 完成桌面操作級(jí)應(yīng)用,對(duì)于原生 JS 的掌握情況而言,是一個(gè)較為全面的綜合型案例。本次課從事件(event)相關(guān)的功能入手,給大家...

    jkyin 評(píng)論0 收藏0
  • JS進(jìn)階篇4---原生JS實(shí)現(xiàn)對(duì)元素拖拽

    摘要:原生實(shí)現(xiàn)對(duì)元素的拖拽一背景介紹此處為鋪墊內(nèi)容,可跳過(guò)隨著前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識(shí)新技術(shù)層出不窮,極大地拓展了開(kāi)發(fā)者的操作空間,也大大地提升了用戶體驗(yàn)。 原生 JS 實(shí)現(xiàn)對(duì) html 元素的拖拽 一、背景介紹 【此處為鋪墊內(nèi)容,可跳過(guò)】 隨著 Web 前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識(shí)、新技術(shù)層出不窮,極大地拓展了開(kāi)發(fā)者的操作空間,也大大地提升了用戶體驗(yàn)。而隨著...

    evin2016 評(píng)論0 收藏0
  • JS進(jìn)階篇4---原生JS實(shí)現(xiàn)對(duì)元素拖拽

    摘要:原生實(shí)現(xiàn)對(duì)元素的拖拽一背景介紹此處為鋪墊內(nèi)容,可跳過(guò)隨著前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識(shí)新技術(shù)層出不窮,極大地拓展了開(kāi)發(fā)者的操作空間,也大大地提升了用戶體驗(yàn)。 原生 JS 實(shí)現(xiàn)對(duì) html 元素的拖拽 一、背景介紹 【此處為鋪墊內(nèi)容,可跳過(guò)】 隨著 Web 前端的不斷發(fā)展,各種各樣的前端規(guī)范和新知識(shí)、新技術(shù)層出不窮,極大地拓展了開(kāi)發(fā)者的操作空間,也大大地提升了用戶體驗(yàn)。而隨著...

    phoenixsky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<