精品欧美一区二区三区在线观看 _久久久久国色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牛牛影视av| 乱h高h女3p含苞待放| 香蕉久久免费电影| 国产精品久久久久精k8| 91久久精品一区二区别| 国产成人精品网| 色综合咪咪久久网| 亚洲国产精彩中文乱码av| chinese少妇国语对白| av片哪里在线观看| 久久久久久亚洲综合影院红桃| 91老司机在线| 无码人妻av一区二区三区波多野| 91成人免费| 亚洲视频自拍偷拍| 无码人妻aⅴ一区二区三区玉蒲团| 91精品韩国| 亚洲资源中文字幕| 亚洲精品欧洲精品| 全色精品综合影院| 国产69精品久久99不卡| 91精品久久久久久久久久久| 国产精品免费精品一区| 国产综合久久| 久久在线免费视频| 四虎国产成人精品免费一女五男| 久久大胆人体视频| 欧美一级理论片| 日本不卡一区二区在线观看| 亚洲国产福利| 精品久久久精品| 男女啪啪免费观看| fc2ppv国产精品久久| 中文字幕+乱码+中文字幕一区| 久久大片网站| 人人妻人人澡人人爽人人欧美一区| 国产综合成人久久大片91| 青青久久aⅴ北条麻妃| 久久精品免费av| 欧美激情第10页| 久久精品国产91精品亚洲| 欧美成人国产精品一区二区| 色婷婷狠狠五月综合天色拍 | 最新天堂中文在线| 色综合一本到久久亚洲91| 欧美日韩一区二区在线 | 一本一道波多野毛片中文在线| 99视频国产精品| 亚洲午夜av久久乱码| 69久久久久久| 嫩草伊人久久精品少妇av杨幂| 韩国中文字幕2020精品| 国产麻豆91精品| 91在线精品视频| 国产视频在线一区| 一本色道精品久久一区二区三区 | 日韩成人在线网站| 黄色录像a级片| 亚州国产精品| 亚洲午夜精品久久久久久性色| 免费污网站在线观看| 久操精品在线| 中文字幕一区二区精品| 5566中文字幕| 欧美日韩国产成人精品| 国产69精品久久久久99| 欧美三日本三级少妇99| 久久午夜精品| 国产精品电影一区| 国产精品怡红院| 岛国精品在线观看| 九九99玖玖| 国产在线观看网站| 日韩理论片中文av| www.av91| 99只有精品| 日韩三级视频在线观看| 成人做爰www看视频软件| 亚洲第一福利社区| 深夜精品寂寞黄网站在线观看| www深夜成人a√在线| 欧美在线视屏| 热99久久精品| 国产乱码精品一区二三区蜜臂| 成人一级片在线观看| 欧美日韩一区二区三区在线视频 | 亚洲成人二区| 97香蕉超级碰碰久久免费的优势| 日韩国产成人在线| 国产精品羞羞答答xxdd| 日韩精品成人一区二区在线观看| 国产一二三区在线观看| 欧美性20hd另类| 911福利视频| 特黄特色欧美大片| 成人97在线观看视频| 亚洲日本韩国在线| 激情图片小说一区| 欧美不卡福利| 神马午夜伦理不卡| 精品视频在线视频| 国产乱淫av片| 欧美成人直播| 欧美一级黑人aaaaaaa做受| 国产精品老熟女视频一区二区| 91婷婷韩国欧美一区二区| 99热这里只有精品7| 丁香六月综合| 精品处破学生在线二十三| 日本午夜精品视频| 久久天天综合| 国产女主播一区二区三区| 8888四色奇米在线观看| 精品久久久久久亚洲精品| 一级黄色免费毛片| 久久精品国产www456c0m| 97在线看福利| 亚洲av综合色区无码一二三区 | 国产精品一区在线免费观看| 欧洲一区二区三区精品| 亚洲成年人影院在线| 欧洲美女女同性互添| 日韩国产一区二| 久久久水蜜桃| 国产夫妻在线播放| 欧美电影免费观看完整版| 美女网站视频色| 日本午夜精品视频在线观看| 久久精品人人做人人爽电影| 后进极品白嫩翘臀在线播放| 欧美一区国产二区| 国产精品suv一区二区88| 日韩电影免费一区| 欧美一区二区三区成人久久片| 久久男人天堂| 亚洲精品美女免费| 日韩黄色三级视频| caoporen国产精品视频| 日本人体一区二区| 99久久香蕉| 久久久久久久久91| 亚洲免费不卡视频| 亚洲电影一级黄| 国产精品麻豆入口| 亚洲激情在线| 国产在线一区二区三区播放| 国产亚洲成av人片在线观看| 亚洲精品av在线| 五月天婷婷久久| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲美女淫视频| 邪恶网站在线观看| 日韩欧美国产精品综合嫩v| 国产精品视频xxx| 免费观看在线黄色网| 91精品国产欧美一区二区18| 日韩a级片在线观看| 懂色一区二区三区免费观看 | heyzo高清中文字幕在线| 精品国产亚洲在线| 日韩 欧美 中文| 国产亚洲精品bt天堂精选| 国产情侣av自拍| 日韩精品免费一区二区三区| 91精品综合视频| 国内老司机av在线| 日韩国产欧美精品在线| 正在播放亚洲精品| 一区二区在线观看免费| 69xxx免费视频| 亚洲综合社区| 亚洲成人自拍视频| 日韩精品视频在线看| 97色伦亚洲国产| aaa在线观看| 日韩欧美一区二区免费| 久久久久久久久影院| 国产精品久久久久久久久久免费看| 两性午夜免费视频| 午夜在线播放视频欧美| 亚洲一区高清| 成人在线超碰| 国产精品久久久久av免费| 在线看三级电影| 亚洲男人av电影| 国产偷拍一区二区| 精品日韩中文字幕| 亚洲国产123| 久久综合色综合88| 中文字幕剧情在线观看| 在线一区欧美| 国产日韩视频在线播放| 欧美日韩一本| 91色中文字幕| 欧美xoxoxo| 欧美高清在线播放| sese一区| 日韩av在线一区| 97caocao| 色综合视频在线观看| 国产97免费视频| 国产视频一区二区在线观看| 伊人av在线播放| 男女性色大片免费观看一区二区 | 人妻人人澡人人添人人爽| 91视频免费看| 2018国产精品| 久久99久久99小草精品免视看| 尤物av无码色av无码| 最新国产精品久久久| 午夜老司机精品| 男人的天堂久久| 99re视频在线播放| 小说区图片区亚洲| 国产精品久久久久免费a∨大胸| av白虎一区| 久久99热精品这里久久精品| 精品51国产黑色丝袜高跟鞋| 国产亚洲欧洲在线| 欧美套图亚洲一区| 亚洲高清福利视频| 亚洲第一成人av| 欧美一级国产精品| 91精品国产乱码久久久久| 色视频欧美一区二区三区| 永久免费看片在线播放| 亚洲国产va精品久久久不卡综合| 午夜精品福利在线视频| 欧美综合一区| 日本在线播放一区| 国产成人手机高清在线观看网站| 精选一区二区三区四区五区| 国产+成+人+亚洲欧洲在线 | 免费黄色成人| 蜜桃传媒视频麻豆第一区免费观看 | 亚洲精品一区久久久久久| 亚洲av无码一区二区乱子伦| 日韩一二三区视频| www黄色网址| 欧美不卡在线视频| 国 产 黄 色 大 片| 精品国产一区二区三区av性色| 国精产品一品二品国精品69xx | 在线免费观看视频一区| 无码人妻av免费一区二区三区 | 国产精品免费观看在线| www.26天天久久天堂| 国产精品久久av| 91在线成人| 国产在线精品播放| 国产亚洲久久| 91九色对白| 韩国精品福利一区二区三区| 国产精品一区二区三区不卡| 欧洲亚洲一区二区三区| 欧美18视频| 第一会所亚洲原创| 国产av不卡一区二区| 欧美视频福利| aa在线观看视频| 久久亚洲精品伦理| 中文字幕欧美人妻精品一区| 免费观看30秒视频久久| 国产精品久久久久久久99| 波多野结衣在线aⅴ中文字幕不卡| xxxx黄色片| 国产欧美日本一区视频| 26uuu成人网| 婷婷开心久久网| 人妻中文字幕一区二区三区| 欧美肥胖老妇做爰| 三级网站免费观看| 国产一区二区激情| 四虎亚洲成人| 欧美一级视频在线观看| 狂野欧美性猛交xxxx| 国产成人av一区二区三区| 杨幂一区二区三区免费看视频| 亚洲自拍偷拍二区| 一区免费在线| 日本www.色| 国产成人啪免费观看软件| 性久久久久久久久久| 中文字幕亚洲成人| 日本免费一二三区| 欧美三区免费完整视频在线观看| 性一交一乱一伧老太| 亚洲欧美制服中文字幕| 黄色网址视频在线观看| 国产91精品久久久久| 日韩免费在线电影| 久久精品午夜一区二区福利| 久久综合99| 国产三区在线视频| 国产精品99久| www..com.cn蕾丝视频在线观看免费版| 亚洲欧美激情一区二区| 国产女主播喷水视频在线观看| 精品欧美一区二区久久| 色综合久久影院| 欧美一级bbbbb性bbbb喷潮片| 国产视频一区二区在线播放| 日本一区二区精品| 亚洲精品裸体| 男女视频在线观看网站| 亚洲国产精品ⅴa在线观看| 日本五十路女优| 日韩一区二区免费电影| 草草影院在线观看| 国产suv精品一区二区三区88区| 99re91这里只有精品| 亚洲欧美在线网| 美女国产精品| 亚洲色图14p| 亚洲国产视频a| 国产精品嫩草影院精东| 一本色道久久综合狠狠躁篇怎么玩| 岛国毛片av在线| 亚洲伊人第一页| 国产精品久久天天影视| 精品999在线| 久久精品一区二区三区不卡牛牛 | 欧美午夜精品久久久久久超碰| 天天干天天爱天天操| 九色91av视频| 国语精品视频| 这里只有精品66| 蓝色福利精品导航| 中文字幕第24页| 色成人在线视频| 国产免费视频在线| 国产99久久久欧美黑人| 免费成人av| 国产成人精品无码播放| 久久色视频免费观看| 中文字幕一区在线播放| 精品在线小视频| 日韩电影免费观| 欧美人xxxxx| 日韩精品欧美成人高清一区二区| 少妇久久久久久久久久| 色综合久久88色综合天天| 日韩美女一级视频| 国产成人精品优优av| 成人情趣视频网站| 夜夜夜夜夜夜操| 亚洲欧美日韩国产成人精品影院 | 亚洲人成网在线播放| 欧美性xxx| 亚洲国产精品一区二区第四页av| 六月丁香综合在线视频| 中文乱码字幕高清一区二区| 欧美一区二区福利视频| 天堂av最新在线| 久久久久久九九| 日本欧美韩国一区三区| 久久久久麻豆v国产| 91精品在线免费观看| 丝袜综合欧美| 欧美高清性xxxxhd| 免费的成人av| 在线免费日韩av| 亚洲黄色成人网| 亚洲四虎影院| 午夜久久久久久久久久久| av不卡免费电影| 日韩欧美国产另类| 久久综合免费视频影院| 国产精品黄网站| 老头吃奶性行交视频| 亚洲欧洲在线观看av| 国产99999| 人妖精品videosex性欧美| 日韩理论电影| 亚洲乱妇老熟女爽到高潮的片| 色视频成人在线观看免| 91精选在线| 欧美一区二区三区在线播放| 国内精品伊人久久久久av一坑| 国产精品美女毛片真酒店| 亚洲一级片在线看| 亚洲一区二区三区免费| 国产精品wwwww| 亚洲免费观看高清| 欧洲一级在线观看| 18成人免费观看网站下载| 久久成人国产| 欧美激情国产精品免费| 亚洲午夜精品久久久久久久久久久久| 久久gogo国模啪啪裸体| 欧美精品色婷婷五月综合| 亚洲精品国久久99热| 人成在线免费视频| 高清免费日韩| 免费看欧美美女黄的网站| 中文在线观看免费网站| www.欧美精品| 亚洲男人都懂第一日本| 免费看的av网站| 欧美色区777第一页|