摘要:接下來我們就用原生和快速實(shí)現(xiàn)這樣的拖放效果的內(nèi)容很簡單,就是五個空的容器和一個可以被拖拽的元素注意點(diǎn)容器的的為,用于接收被拖拽的元素,可被拖拽的元素為,同時設(shè)置屬性為,表示該元素可以被拖拽。
拖放是很常見的一種交互效果,很多時候我們都會借助于第三方的控件來實(shí)現(xiàn),其實(shí)用原生js實(shí)現(xiàn)起來也非常的方便。接下來我們就用原生js和css快速實(shí)現(xiàn)這樣的拖放效果:
HTMLHTML的內(nèi)容很簡單,就是五個空的容器和一個可以被拖拽的元素:
html:
注意點(diǎn):1. 容器的的class為droppable,用于接收被拖拽的元素,可被拖拽的元素class為draggable,同時設(shè)置draggable屬性為true,表示該元素可以被拖拽。2. 默認(rèn)情況下,只有圖片、鏈接還有被選中的文字能被拖拽,其他元素需要設(shè)置draggable為true才能被拖拽。所以為了凸顯draggable的用法,這里使用而不是來作為被拖拽的元素。 CSS 在實(shí)現(xiàn)樣式的時候,除了實(shí)現(xiàn)靜態(tài)的樣式,一些過渡狀態(tài)也需要增加樣式以提升視覺體驗(yàn):1. 元素被拖動的過程中增加邊框等效果;2. 當(dāng)元素被拖動到容器上方時,容器也應(yīng)增加樣式表明容器可以接收一個被拖拽的元素。
css:
body { background-color: darksalmon; } .draggable { background-image: url("http://source.unsplash.com/random/150x150"); position: relative; height: 150px; width: 150px; top: 5px; left: 5px; cursor: pointer; } .droppable { display: inline-block; height: 160px; width: 160px; margin: 10px; border: 3px salmon solid; background-color: white; } .dragging { border: 4px yellow solid; } .drag-over { background-color: #f4f4f4; border-style: dashed; } .invisible { display: none; }注意點(diǎn):1. 圖片來源于https://source.unsplash.com/的隨機(jī)圖片;2. .dragging為draggable元素正在被拖動的狀態(tài),增加黃色border;3. .drag-over為draggable元素被拖動到容器上方時容器的狀態(tài),增加灰色虛線border。JS最后,我們需要通過js監(jiān)聽draggable和droppable的相關(guān)的事件。
js:
// 查詢draggable和droppable const draggable = document.querySelector(".draggable"); const droppables = document.querySelectorAll(".droppable"); // 監(jiān)聽draggable的相關(guān)事件 draggable.addEventListener("dragstart", dragStart); draggable.addEventListener("dragend", dragEnd); function dragStart() { this.className += " dragging"; setTimeout(() => { this.className = "invisible"; }, 0); } function dragEnd() { this.className = "draggable"; } // 監(jiān)聽droppable的相關(guān)事件 for (const droppable of droppables) { droppable.addEventListener("dragover", dragOver); droppable.addEventListener("dragleave", dragLeave); droppable.addEventListener("dragenter", dragEnter); droppable.addEventListener("drop", dragDrop); } function dragOver(e) { e.preventDefault(); } function dragEnter(e) { e.preventDefault(); this.className += " drag-over"; } function dragLeave(e) { this.className = "droppable"; } function dragDrop(e) { this.className = "droppable"; this.append(draggable); }注意點(diǎn):1. 當(dāng)draggable元素被拖動時,原來容器中的draggable元素并不會消失,需要我們手動將其隱藏(class設(shè)置為invisible),如果同步操作會立馬觸發(fā)dragend事件導(dǎo)致拖動效果消失,所以在setTimeout的回調(diào)中異步設(shè)置可確保拖動操作開始后再隱藏draggable元素;2. 在dragEnter和dragOver方法中我們需要通過preventDefault來取消事件以表明容器是一個合法的droppable元素,不然容器的drop事件將無法觸發(fā),接下來的操作也將無法進(jìn)行,詳細(xì)解釋請參考 MDN DropTarget;3. 在dragDrop方法中直接使用append方法將draggable元素移動至當(dāng)前容器下面。好了,demo比較簡單,但是細(xì)節(jié)還是有一些的,自己實(shí)踐一下才能更深刻的領(lǐng)悟。
完整示例:https://codepen.io/mudontire/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/114861.html
摘要:接下來我們就用原生和快速實(shí)現(xiàn)這樣的拖放效果的內(nèi)容很簡單,就是五個空的容器和一個可以被拖拽的元素注意點(diǎn)容器的的為,用于接收被拖拽的元素,可被拖拽的元素為,同時設(shè)置屬性為,表示該元素可以被拖拽。 拖放是很常見的一種交互效果,很多時候我們都會借助于第三方的控件來實(shí)現(xiàn),其實(shí)用原生js實(shí)現(xiàn)起來也非常的方便。接下來我們就用原生js和css快速實(shí)現(xiàn)這樣的拖放效果: showImg(https://s...
摘要:接下來我們就用原生和快速實(shí)現(xiàn)這樣的拖放效果的內(nèi)容很簡單,就是五個空的容器和一個可以被拖拽的元素注意點(diǎn)容器的的為,用于接收被拖拽的元素,可被拖拽的元素為,同時設(shè)置屬性為,表示該元素可以被拖拽。 拖放是很常見的一種交互效果,很多時候我們都會借助于第三方的控件來實(shí)現(xiàn),其實(shí)用原生js實(shí)現(xiàn)起來也非常的方便。接下來我們就用原生js和css快速實(shí)現(xiàn)這樣的拖放效果: showImg(https://s...
摘要:如其他屬性及方法,詳細(xì)可以查看跨終端能力跨終端能力是最大的特點(diǎn)。在指定區(qū)域的事件中,通過對象的屬性,即可獲得文件列表信息,如打印文件名在中實(shí)踐在項(xiàng)目中使用,依然遵循數(shù)據(jù)驅(qū)動的原則,即事件數(shù)據(jù)更新。同時,在事件中執(zhí)行判斷。最近有個需求,需要產(chǎn)品導(dǎo)航欄支持拖放。 雖然開源社區(qū)已有不少成熟的拖放庫,但考慮到代碼可控性和可定制性,還是自己寫吧。 選型 關(guān)于選型,前端實(shí)現(xiàn)拖放功能,無外乎幾種: 1、通...
閱讀 663·2023-04-26 02:03
閱讀 1037·2021-11-23 09:51
閱讀 1110·2021-10-14 09:42
閱讀 1737·2021-09-13 10:23
閱讀 927·2021-08-27 13:12
閱讀 839·2019-08-30 11:21
閱讀 1001·2019-08-30 11:14
閱讀 1041·2019-08-30 11:09