精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關于前端里的拖拖拽拽,了解一下?

開發 前端
最近在開發一款低代碼平臺,所以借此機會分享一下關于“拖拽”這一交互的基礎知識和實踐經驗,希望可以給有需要的同學提供一點參考。

最近在項目中使用了 react-dnd[1],一個基于 HTML5 的拖拽庫,“拖拽能力”豐富了前端的交互方式,基于拖拽能力,會擴展各種各樣的拖拽反饋效果,因此有必要學習了解,最好的學習方式就是實操!

拖拽交互常見于各種前端編輯器里,而“編輯器”是一個集成前端技術能力的綜合性工程,其中就會涉及到各種形式的拖拽交互,因為“拖拽”是提升用戶體驗的重要交互方式,所以需要對拖拽的交互效果做各種定制化,作為開發者理應熟練掌握“拖拽”的使用!

最近在開發一款低代碼平臺,所以借此機會分享一下關于“拖拽”這一交互的基礎知識和實踐經驗,希望可以給有需要的同學提供一點參考。

一、HTML5 中的拖放

拖(Drag)和放(Drop)是 HTML5 標準的組成部分,了解掌握之后,舉一反三,有助于提升我們在拖拽場景下技術方案的設計能力。

1.1 draggable 屬性

現代瀏覽器中,不難發現,圖片標簽()是可以被長按拖拽,但如果需要自定義的 DOM 節點可以被拖拽需要配置以告訴瀏覽器提供對元素(Element / Tag)支持拖拽的能力。

而元素是否允許被拖放且可響應 API 操作依賴于 draggable[2] 全局標簽屬性

draggable 是一個布爾值類型的標簽屬性:

  • true:元素可被拖拽
  • false:元素不可拖拽

當元素設置了 draggable 屬性,此時長按就可以自由拖拽了:

1.2 Darg & Drop 事件

HTML 的 drag & drop 使用了“DOM Event”和從“Mouse Event”繼承而來的“drag event” 。

一個典型的拖拽操作: 用戶選中一個可拖拽的(draggable)元素,并將其拖拽(鼠標按住不放)至一個可放置的(droppable)元素上,然后松開鼠標。

在拖動元素期間,一些與拖放相關的事件會被觸發,像 drag 和 dragover 類型的事件會被頻繁觸發。

除了定義拖拽事件類型,每個事件類型還賦予了對應的事件處理器

各個事件的時機可以用下面這個圖簡單表示:

??注意: dragOver 事件的默認行為是:“Reset the current drag operation to "none"”。也就是說,如果不阻止放置元素的 dragOver 事件,則放置元素不會響應“拖動元素”的“放置行為”

// 讓綁定該事件的元素支持放置
function handleDragOver(e) {
// 阻止默認的重置行為
// 即可成為拖拽元素的放置區
e.preventDefault();
}


從設計事件標準來看,如果我們需要自行實現拖拽的效果,就需要從這關鍵的幾個事件去思考設計。

1.3 DataTransfer

在上述的事件類型中,不難發現,放置元素和拖動元素分別綁定了自己的事件,可如何將拖拽元素和放置元素建立聯系以及傳遞數據?

這就涉及到 DataTransfer 對象:

DataTransfer 對象用于保存拖動并放下(drag and drop)過程中的數據。它可以保存一項或多項數據,這些數據項可以是一種或者多種數據類型。—— DataTransfer - MDN[3]

DataTransfer 對象在不同瀏覽器上因為標準可能不一樣使得 API 有差異,但有幾個“標準(常用)”屬性和方法需要熟悉

在 Chrome 瀏覽器上的 DataTransfer 實例如下:

(1) 屬性

(2) 方法

在簡單的拖拽場景中,其實可以類比 window.localStorage 對象的 setItem() 和 getItem() 方法來理解記憶.

但 getData() 在測試中發現只能在 ondrop 事件中獲取到值:

1.4 一個案例掌握拖放 API

拖動元素 放置區域

<div>
<div class="drag" draggable="true" id="dragger" ondragstart="handleDragStart(event)">拖動元素</div>
<div class="drop" ondrop="handleDrop(event)" ondragover="allowDrop(event)">放置區域</div>
</div>
<script>
function handleDragStart(e) {
e.dataTransfer.setData('DRAG_NODE_ID', e.target.id)
}
function handleDragOver(e) {
e.preventDefault();
}
function handleDrop(e) {
e.preventDefault();
var data = e.dataTransfer.getData('DRAG_NODE_ID');
e.target.appendChild(document.getElementById(data));
}
</script>


演示案例: https://codepen.io/DYBOY/pen/eYeyvWm

效果:

演示

拖拽演示效果

1.6 兼容性

是 HTML5 標準提出的能力,因此各大瀏覽器廠商對于標準的支持有差異,其兼容性參考如下:

相較于傳統的通過鼠標事件:mousedown、mousemove、mouseup 組合實現的拖拽要簡單很多,少了放入目標邊界的判斷,也少了對位置的實時獲取操作。

另外目前的 API 不算多,例如我們想要定制化拖拽的圖片大小、鼠標樣式等,目前暫時沒發現比較方便的解決方式,但是從另一個角度來說,讓我們對于拖拽能力的設計和標準有了一個更深切的認識,對于設計實現拖拽交互有了一個“理論”基礎!

二、手搓一個

有了上面的基礎知識,那么實現一個列表拖拽排序并不是什么難事。

2.1 設計實現

結合上述的 Drag & Drop 的事件類型,那么拖拽排序主要是針對“拖動對象”之間相互作用關系的邏輯梳理,此處我們暫且區分為:

  • 源對象: 拖拽列表中被拖動的單個列表項
  • 目標對象: 拖拽列表中和“源對象”產生“相互作用”的列表項

整體的交互事件的設計思路如下:

(1) ondragstart

此時開始拖拽“源對象”的時機,在此事件回調函數中改變“源對象”的樣式,設置拖拽的一些傳遞參數等初始值。

// 源對象開始拖拽
const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {
e.dataTransfer.effectAllowed = "move";
setDragId(e.currentTarget.dataset.index); //dataset 獲取拖拽項的 id
};


(2) ondragover

正與拖拽中的“源對象”產生相互影響的目標對象,此時“源對象”處于“目標對象”的正上方,目標對象 100ms/次的頻率調用“目標對象”的 ondragover 中聲明的回調事件。

此時,我們會計算改變“源對象”和“目標對象”的位置。

// 源對象在目標對象上方時
const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {
e.preventDefault(); // 允許放置,阻止默認事件
const dropId = e.currentTarget.dataset.index;
move(dragId, dropId); // 改變原列表數據
};


(3) ondrag

該事件作用于“源對象”,此時正處于拖拽過程中,此時可以改變源對象的 opacity、display(none)、visiblity 樣式屬性,如果在 dragstart 事件改變,則會導致拖拽拷貝對象丟失。

// 源對象被拖拽過程中
const handleDrag = (e: React.DragEvent<HTMLDivElement>) => {
e.currentTarget.style.opacity = "0";
};


(4) ondragend

在松手完成“源對象”的放置時,主動調用綁定在“源對象”身上的事件,此時恢復更改的樣式。

// 源對象被放置完成時
const handleDragEnd = (e: React.DragEvent<HTMLDivElement>) => {
e.currentTarget.style.opacity = "1";
};


2.2 實現效果

2.3 加點動畫

上面的實現中效果還算可以,但是少了拖拽項的切換過程動畫,直接在 dragover 事件中通過 move(dragId, dropId) 方法直接修改了原列表數據的排序,導致切換突變。

借助 animation 新增 CSS 幀動畫:

@keyframes dropUp {
100% {
transform: translateY(5px);
}
}
@keyframes dropDown {
100% {
transform: translateY(-5px);
}
}

.drop-up{
animation: dropUp 0.3s ease-in-out forwards;
}
.drop-down{
animation: dropDown 0.3s ease-in-out forwards;
}


同樣的在 dragOver 事件中處理,新增邏輯代碼:

// 源對象在目標對象上方時
const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {
...
// 設置動畫
const dropId = e.currentTarget.dataset.index;
const dragIndex = findIndex(listData, (i) => i.id === dragId);
const dropIndex = findIndex(listData, (i) => i.id === dropId);
// 通過增加對應的 CSS class,實現視覺上的動畫過渡
e.currentTarget.classList.remove("drop-up", "drop-down");
if (dragIndex < dropIndex) {
e.currentTarget.classList.add("drop-down");
} else if (dragIndex > dropIndex) {
e.currentTarget.classList.add("drop-up");
}
...
};


增加了動畫的效果:

增加了動畫的效果

看起來似乎好一點了,當然大家可以去擴充動畫的效果,亦或者借助三方動畫庫。

三、已有拖拽庫

目前主流的拖拽庫有:

  • react-dnd: https://github.com/react-dnd/react-dnd/
  • react-beautiful-dnd: https://github.com/atlassian/react-beautiful-dnd/
  • sortablejs: https://sortablejs.github.io/Sortable/
  • react-sortable-hoc: https://github.com/clauderic/react-sortable-hoc/

關于幾者的差異,可以參閱:《關于react中使用拖拽插件的評測[4]》

四、總結

由于低代碼平臺其實會有豐富的拖拽場景,從可擴展和兼容性上考慮,最終選擇了 react-dnd 作為基礎拖拽庫,當然,在復雜的拖拽場景下,是需要自行擴展該拖拽庫,上手難度相對會高一點,不過有了這些“拖拽知識”作為前置基礎,那么擴展功能也就不是什么難事了。

參考資料

[1]react-dnd - Github: https://react-dnd.github.io/react-dnd/about

[2]draggable - MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/draggable

[3]DataTransfer - MDN: https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer

[4]關于react中使用拖拽插件的評測: https://juejin.cn/post/6956112150989373448

責任編輯:姜華 來源: DYBOY
相關推薦

2020-02-10 14:26:10

GitHub代碼倉庫

2020-12-10 08:44:35

WebSocket輪詢Comet

2022-03-24 13:36:18

Java悲觀鎖樂觀鎖

2020-03-01 17:53:38

Excel大數據微軟

2019-02-20 14:16:43

2024-04-11 12:19:01

Rust數據類型

2018-06-05 17:40:36

人工智能語音識別

2018-04-25 06:46:52

2023-03-02 08:00:55

包管理工具pnpm 包

2019-03-11 14:33:21

Redis內存模型數據庫

2022-03-07 06:34:22

CQRS數據庫數據模型

2024-02-28 18:22:13

AI處理器

2018-07-17 14:42:50

2023-11-18 09:09:08

GNUBSD協議

2021-07-06 14:56:20

深度學習編程人工智能

2021-05-12 10:59:39

Kubernetes容器集群

2022-03-10 07:39:33

.NET部署模式

2018-03-21 09:08:06

超融合架構本質

2023-04-27 13:32:16

AutoGPTAPI智能

2022-09-23 15:01:33

圖片加載代碼
點贊
收藏

51CTO技術棧公眾號

亚洲韩国青草视频| 成人av电影免费观看| 日韩专区在线观看| 中文字幕第三区| 91美女主播在线视频| 久久色成人在线| 91亚洲精品一区二区| 人人干人人干人人干| 欧美军人男男激情gay| 56国语精品自产拍在线观看| 日本国产在线播放| a天堂在线资源| 成人免费毛片app| 国产精品私拍pans大尺度在线| 欧美激情图片小说| 美女久久久久| 日韩精品一区国产麻豆| 国内外免费激情视频| 亚洲婷婷噜噜| 国产精品欧美久久久久一区二区| 国产高清精品一区二区| 怡红院成永久免费人全部视频| 在线成人欧美| 美女av一区二区三区| 性猛交娇小69hd| 老司机aⅴ在线精品导航| 欧美日韩国产精选| 大肉大捧一进一出好爽视频| 97caopron在线视频| 欧美高清一级片在线观看| 久久精品人人做人人爽电影| 国产成人毛毛毛片| 麻豆国产91在线播放| 国产69精品久久久久久| 久一区二区三区| 在线中文一区| 日韩亚洲欧美成人| 精品亚洲aⅴ无码一区二区三区| 高潮按摩久久久久久av免费| 欧美精品一级二级| 成人在线观看黄| 国产99在线观看| 亚洲一区av在线| 国产一二三四五| 午夜毛片在线| 国产精品久久午夜| 亚洲精品视频一区二区三区| 青青草在线视频免费观看| 99在线精品一区二区三区| 国产精品久久久久久久久久久久午夜片 | 国产精品1区| 欧美日韩综合一区| 亚洲免费一级视频| 激情小说亚洲| 欧美剧情电影在线观看完整版免费励志电影 | 91久久综合| 久久久久亚洲精品| 91精品国产高潮对白| 在线成人h网| 91精品国产一区| 国产精品久久久免费视频| 伊人精品成人久久综合软件| 欧美精品久久一区二区| 国产一级二级毛片| 亚洲精品女人| 欧美在线精品免播放器视频| 欧美a∨亚洲欧美亚洲| 亚洲女优在线| 国产精品激情av电影在线观看| 国产情侣呻吟对白高潮| 精品一区二区三区在线播放| 99久久精品无码一区二区毛片| 国产高清在线观看视频| 成人深夜在线观看| 欧美精品二区三区四区免费看视频| 飘雪影视在线观看免费观看| 中文字幕不卡的av| 欧美少妇一区二区三区| 美女网站视频在线| 欧美视频13p| 男人天堂成人在线| av在线亚洲一区| 精品国产区一区| 国产激情在线免费观看| 99精品视频在线| 海角国产乱辈乱精品视频| 综合网在线观看| 麻豆成人久久精品二区三区红| 亚洲综合精品伊人久久| 婷婷在线免费观看| 久久无码av三级| 中文精品一区二区三区| 嗯啊主人调教在线播放视频 | 97国产suv精品一区二区62| 无码免费一区二区三区| 国产一区久久久| 久久久久久久久四区三区| 午夜激情视频在线| 亚洲一区在线免费观看| 性生交免费视频| 久久9999免费视频| 亚洲一级黄色av| 久久香蕉精品视频| 麻豆国产精品777777在线| 国产精品伊人日日| 欧美69xxxx| 欧美色视频日本高清在线观看| 亚洲一区二区在线视频观看| 日韩人体视频| 欧美大片在线看| 欧美高清69hd| 99精品一区二区| 国产三级中文字幕| 激情开心成人网| 欧美成人女星排行榜| 国产亚洲精品久久久久久豆腐| 99这里有精品| 7777精品伊久久久大香线蕉语言| 国产二区视频在线观看| 五月综合激情婷婷六月色窝| 精品亚洲视频在线| 精品美女久久| 97在线视频国产| www.色呦呦| 国产精品久久久一区麻豆最新章节| 男女私大尺度视频| 久久av偷拍| 色偷偷9999www| 亚洲综合成人av| 久久综合色天天久久综合图片| 欧美亚洲色图视频| 久久av网站| 免费91麻豆精品国产自产在线观看| 91麻豆精品在线| 久久九九久久九九| 久章草在线视频| 日日天天久久| 欧美亚洲日本黄色| 天堂视频中文在线| 欧美日韩国产在线看| 成人午夜精品无码区| 国产精品久久| www.一区二区三区| 国产www视频在线观看| 日韩美女在线视频| 久久久夜色精品| 成人永久免费视频| 男女日批视频在线观看| 亚洲免费一区三区| 久久久久国产精品www| 亚洲国产精品国自产拍久久| 一区二区三区美女视频| 国产伦精品一区二区三区妓女下载 | 永久免费精品视频网站| 亚洲人成网站在线在线观看| 久久久国产精彩视频美女艺术照福利| 91片黄在线观看喷潮| 亚洲欧美一区二区在线观看| 樱花草www在线| 韩国亚洲精品| 久久久久国产精品视频| 网友自拍亚洲| 色婷婷av一区二区三区在线观看| 亚洲视频在线观看免费视频| 亚洲视频精选在线| 国产乱淫av片| 在线一区免费观看| 日韩在线电影一区| 亚洲高清影院| 久久男人的天堂| 青青草免费观看免费视频在线| 欧美在线免费观看亚洲| 翔田千里88av中文字幕| 国产a久久麻豆| 国产精品第12页| 欧美高清在线| 成人免费视频网站| 在线天堂中文资源最新版| 在线性视频日韩欧美| 国产美女自慰在线观看| 亚洲成av人影院| xxx在线播放| 国产福利一区在线| 国产成人黄色片| 欧美xxxxx视频| 国产精品日韩高清| 51一区二区三区| 欧美精品成人在线| jizzjizz在线观看| 精品捆绑美女sm三区 | 久久久久久穴| 日韩精品第1页| 亚洲人亚洲人色久| 91久久夜色精品国产网站| 欧美三级网站| 久久九九热免费视频| 三级黄视频在线观看| 欧美疯狂性受xxxxx喷水图片| 国产亚洲色婷婷久久99精品| 国产农村妇女毛片精品久久麻豆| 日本黄色一级网站| 日韩在线一区二区三区| 欧美极品少妇无套实战| 日本道不卡免费一区| 国产一区二区久久久| 日日夜夜亚洲精品| 日本伊人精品一区二区三区介绍 | 国产一区二区三区四区| 91成人免费观看| 日韩制服诱惑| 91极品视频在线| 成人高清免费在线| 尤物yw午夜国产精品视频| 日韩在线观看视频一区二区三区| 欧美日韩情趣电影| 亚洲精品中文字幕乱码三区91| 亚洲免费三区一区二区| 免费一级特黄3大片视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 精品噜噜噜噜久久久久久久久试看| 成人黄色片在线观看| 精品久久在线播放| www青青草原| 国产精品久久久久久久久久久免费看| 精品夜夜澡人妻无码av| 成人性色生活片免费看爆迷你毛片| 中文字幕22页| 国产一区二区你懂的| 亚洲熟妇无码av在线播放| 亚洲午夜精品一区 二区 三区| 韩国国内大量揄拍精品视频| 亚洲视频欧美视频| 精品久久国产视频| 欧美性感一区二区三区| 国产91av视频| 亚洲黄网站在线观看| 免费中文字幕日韩| 中文字幕中文字幕中文字幕亚洲无线| 少妇无套高潮一二三区| 久久久久久免费| 少妇久久久久久久久久| 久久免费偷拍视频| 午夜理伦三级做爰电影| 91欧美一区二区| 少妇毛片一区二区三区| 99久久精品国产毛片| 久久久久成人精品无码中文字幕| 国产凹凸在线观看一区二区| 久久久久99人妻一区二区三区| 精品无码三级在线观看视频| 亚洲欧美手机在线| 国产一区在线观看麻豆| 日本黄色一级网站| 国产91丝袜在线播放| 国产精品果冻传媒| 成人性生交大片免费看中文| 中文字幕无码人妻少妇免费| 91小视频在线免费看| 深爱五月激情网| 国产欧美一区二区精品性色| 亚洲黄色网址大全| 亚洲免费在线观看视频| 成人午夜黄色影院| 嫩草影院一区二区三区| 色乱码一区二区三区88| 波多野结衣 久久| 在线观看亚洲精品视频| 国产丝袜不卡| 老牛国内精品亚洲成av人片| 免费观看成人在线| 不卡一区2区| 免费观看中文字幕| 精品动漫3d一区二区三区免费版 | 成人做爰www免费看视频网站| 日韩电影精品| 国产精品对白刺激久久久| 亚洲va久久| 亚洲一区二区三区精品视频| 中文字幕一区二区三区乱码图片| 无码 制服 丝袜 国产 另类| 久久天堂精品| 超碰在线免费av| 99久久伊人精品| 貂蝉被到爽流白浆在线观看| 一级中文字幕一区二区| 一级黄色免费网站| 91精品国产福利在线观看| 少妇喷水在线观看| 中文字幕欧美日韩在线| 欧美v亚洲v| 国产精品福利在线观看网址| 亚洲三级av| 五月天色一区| 亚洲国产精品第一区二区三区| 亚洲精品视频导航| 成人av午夜影院| 影音先锋男人看片资源| 婷婷一区二区三区| 国产情侣自拍小视频| 亚洲区一区二区| 欧美aaa免费| 国产精选久久久久久| 欧美男男freegayvideosroom| 亚洲精品中文字幕乱码三区不卡| 亚洲黑丝一区二区| 黄色一级片免费播放| 久久精品欧美一区二区三区麻豆| 精品爆乳一区二区三区无码av| 在线亚洲免费视频| 熟妇人妻中文av无码| 久久国产精品影片| 99只有精品| 欧美日韩在线一区二区三区| 亚洲国产99| 韩国三级在线播放| 国产精品久久久久国产精品日日| 日韩污视频在线观看| 日韩一区二区在线观看| 天堂中文а√在线| 国产精品第七十二页| 香蕉久久夜色精品国产使用方法| 9色视频在线观看| 久久99国产精品尤物| 国产伦理片在线观看| 岛国av一区二区三区| 亚洲第一黄色片| 欧美巨乳美女视频| 9999精品| 中文字幕av日韩精品| 男人的j进女人的j一区| 六月婷婷七月丁香| 欧美日在线观看| 青青久草在线| 日本欧美一级片| 亚洲婷婷影院| 成人黄色片视频| 久久色中文字幕| www.com亚洲| 亚洲视频国产视频| 成人精品电影在线| 欧美激情专区| 日本色综合中文字幕| 免费看黄色av| 欧美日韩国产a| 黄色网页在线看| 成人性生交大片免费看小说 | 久久手机精品视频| 亚洲视频自拍| 日本一二三区视频在线| 国产v日产∨综合v精品视频| 久久午夜无码鲁丝片| 亚洲成av人片在线观看香蕉| 91av久久| 蜜桃视频在线观看成人| 久久久xxx| 日本一道本视频| 欧美夫妻性生活| 精灵使的剑舞无删减版在线观看| 肥熟一91porny丨九色丨| 在线成人欧美| 91成人在线免费视频| 欧美图片一区二区三区| 日本www在线观看视频| 91成人免费看| 亚洲深夜激情| 亚洲毛片亚洲毛片亚洲毛片| 91麻豆精品国产91久久久 | 色综合一区二区三区| 国产福利第一视频在线播放| 91天堂在线观看| 91久久亚洲| 亚洲自拍偷拍图| 91麻豆精品国产91久久久久久| 暧暧视频在线免费观看| 欧美凹凸一区二区三区视频 | 欧美日韩在线另类| chinese偷拍一区二区三区| 91久久精品www人人做人人爽| 亚洲国产综合在线看不卡| 卡一卡二卡三在线观看| 欧美一区二区三区免费观看视频 | 影音先锋人妻啪啪av资源网站| 色婷婷综合久色| 韩国中文字幕在线| 精品国产一二| 激情另类小说区图片区视频区| 日本a在线观看| 上原亚衣av一区二区三区| av日韩精品| 欧美wwwwwww| 精品福利在线视频| 黄色免费在线观看| 免费中文日韩| 国产精品一区专区| 秋霞av一区二区三区| 九九视频直播综合网| 欧美亚洲国产精品久久| 中文字幕第九页| 欧美年轻男男videosbes| www视频在线观看|