最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

原生JS實(shí)現(xiàn)拖拽排序的示例代碼

 更新時(shí)間:2022年12月07日 14:15:35   作者:你也向往長(zhǎng)安城嗎  
說(shuō)到拖拽,應(yīng)用場(chǎng)景不可謂不多。無(wú)論是打開(kāi)電腦還是手機(jī),第一眼望去的界面都是可拖拽的,靠拖拽實(shí)現(xiàn)APP或者應(yīng)用的重新布局,或者拖拽文件進(jìn)行操作文件。本文就將利用JS實(shí)現(xiàn)拖拽排序,需要的可以參考一下

說(shuō)到拖拽,應(yīng)用場(chǎng)景不可謂不多。無(wú)論是打開(kāi)電腦還是手機(jī),第一眼望去的界面都是可拖拽的,靠拖拽實(shí)現(xiàn)APP或者應(yīng)用的重新布局,或者拖拽文件進(jìn)行操作文件。

先看效果圖,如何實(shí)現(xiàn)一個(gè)如圖HTML元素的拖拽并排序

HTML中的拖拽事件(drag & drop)

參考MDN中文文檔

事件類型

  • drag : 當(dāng)拖拽的元素或者選中的文本時(shí)觸發(fā)
  • dragend : 當(dāng)拖拽元素結(jié)束時(shí)觸發(fā)
  • dragenter : 當(dāng)拖拽元素或選中的文本到一個(gè)可釋放目標(biāo)時(shí)觸發(fā)
  • dragleave : 當(dāng)拖拽元素或選中的文本離開(kāi)一個(gè)可釋放目標(biāo)時(shí)觸發(fā)
  • dragover : 當(dāng)元素或選中的文本被拖到一個(gè)可釋放目標(biāo)上時(shí)觸發(fā)(每 100 毫秒觸發(fā)一次)
  • dragstart : 當(dāng)用戶開(kāi)始拖拽一個(gè)元素或選中的文本時(shí)觸發(fā)
  • drop : 當(dāng)元素或選中的文本在可釋放目標(biāo)上被釋放時(shí)觸發(fā)

Coding

寫(xiě)一段簡(jiǎn)單的CSS和html ,實(shí)現(xiàn)初始的頁(yè)面

        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        ul{
            margin: 200px auto;
            width: 200px;
            list-style-type: none;
        }
        li{
            margin: 5px;
            text-align: center;
            width: 200px;
            height: 30px;
            background: skyblue;
        }
        .list .moving{
            background: transparent;
            color: transparent;
            border: 1px dashed #ccc;
        }  
    <ul class="list">
        <li >1</li>
        <li >2</li>
        <li >3</li>
        <li >4</li>
        <li >5</li>
    </ul>

此時(shí)我們的頁(yè)面如下圖

現(xiàn)在還不可以進(jìn)行拖拽操作,為了可以實(shí)現(xiàn)拖拽操作,我們必須給每個(gè)元素設(shè)置 draggable="true"

    <ul class="list">
        <li draggable="true">1</li>
        <li draggable="true">2</li>
        <li draggable="true">3</li>
        <li draggable="true">4</li>
        <li draggable="true">5</li>
    </ul>

元素已經(jīng)可以基礎(chǔ)的拖拽

image.png

接下來(lái)我們需要在JS中對(duì)DOM元素進(jìn)行一系列操作來(lái)實(shí)現(xiàn)對(duì)應(yīng)的效果

  • 實(shí)現(xiàn)拖出去的元素,原位置樣式變?yōu)橥该魈摼€
  • 實(shí)現(xiàn)拖動(dòng)到其他元素上時(shí),列表順序發(fā)生改變
        let list = document.querySelector('.list')
        let currentLi      // 記錄拖拽元素

我們用事件委托,監(jiān)聽(tīng) "dragstart" 事件,給拖動(dòng)的元素添加類名,修改樣式,這里會(huì)出現(xiàn)奇怪的一幕就是,拖動(dòng)的樣式和原來(lái)的樣式同時(shí)變成了透明。

        list.addEventListener('dragstart',(e)=>{
            e.dataTransfer.effectAllowed = 'move'   // 拖動(dòng)樣式改為 "move"
            currentLi = e.target  
            currentLi.classList.add('moving')
        })

這里會(huì)出現(xiàn)奇怪的一幕就是,拖動(dòng)的樣式和原來(lái)的樣式同時(shí)變成了透明。這是因?yàn)楦S鼠標(biāo)拖動(dòng)的元素的樣式在拖動(dòng)的那一刻是原始元素的樣式,所以也會(huì)添加"moving", 那么在這里我們加一個(gè)異步

        list.addEventListener('dragstart',(e)=>{
            e.dataTransfer.effectAllowed = 'move'
            currentLi = e.target
            setTimeout(()=>{
                currentLi.classList.add('moving')
            })
        })

到這里距離目標(biāo)又更近了一步,

接下來(lái)我們需要在拖動(dòng)的過(guò)程中對(duì)列表的元素進(jìn)行重新的排序

Node.insertBefore():方法在參考節(jié)點(diǎn)之前插入一個(gè)擁有指定父節(jié)點(diǎn)的子節(jié)點(diǎn)

        list.addEventListener('dragenter',(e)=>{
            e.preventDefault()  // 阻止默認(rèn)事件
            if(e.target === currentLi||e.target === list){   // 當(dāng)移動(dòng)到當(dāng)前拖動(dòng)元素,或者父元素上面我們不做操作
                return
            }
            let liArray = Array.from(list.childNodes)
            let currentIndex = liArray.indexOf(currentLi)   // 獲取到拖動(dòng)元素的下標(biāo)
            let targetindex = liArray.indexOf(e.target)     // 獲取到目標(biāo)元素的下標(biāo)

            if(currentIndex<targetindex){
                list.insertBefore(currentLi,e.target.nextElementSibling)
            }else{
                list.insertBefore(currentLi,e.target)
            }
        })

最后我們需要在拖拽結(jié)束將元素的moving類名移除,以及阻止拖拽到一個(gè)目標(biāo)上的默認(rèn)事件(否則會(huì)出現(xiàn)禁止)

        list.addEventListener('dragover',(e)=>{
            e.preventDefault()
        })
        list.addEventListener('dragend',(e)=>{
            currentLi.classList.remove('moving')
        })

至此,一個(gè)簡(jiǎn)單的拖拽排序功能就實(shí)現(xiàn)了

完整代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        ul{
            margin: 200px auto;
            width: 200px;
            list-style-type: none;
        }
        li{
            margin: 5px;
            text-align: center;
            width: 200px;
            height: 30px;
            background: skyblue;
        }
        .list .moving{
            background: transparent;
            color: transparent;
            border: 1px dashed #ccc;
        }  
        </style>
</head>
<body>
    <ul class="list">
        <li draggable="true">1</li>
        <li draggable="true">2</li>
        <li draggable="true">3</li>
        <li draggable="true">4</li>
        <li draggable="true">5</li>
    </ul>

    <script>
        let list = document.querySelector('.list')
        let currentLi
        list.addEventListener('dragstart',(e)=>{
            e.dataTransfer.effectAllowed = 'move'
            currentLi = e.target
            setTimeout(()=>{
                currentLi.classList.add('moving')
            })
        })

        list.addEventListener('dragenter',(e)=>{
            e.preventDefault()
            if(e.target === currentLi||e.target === list){
                return
            }
            let liArray = Array.from(list.childNodes)
            let currentIndex = liArray.indexOf(currentLi)
            let targetindex = liArray.indexOf(e.target)

            if(currentIndex<targetindex){
     
                list.insertBefore(currentLi,e.target.nextElementSibling)
            }else{
      
                list.insertBefore(currentLi,e.target)
            }
        })
        list.addEventListener('dragover',(e)=>{
            e.preventDefault()
        })
        list.addEventListener('dragend',(e)=>{
            currentLi.classList.remove('moving')
        })
    </script>
</body>
</html>

以上就是原生JS實(shí)現(xiàn)拖拽排序的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于JS拖拽排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS實(shí)現(xiàn)從表格中動(dòng)態(tài)刪除指定行的方法

    JS實(shí)現(xiàn)從表格中動(dòng)態(tài)刪除指定行的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)從表格中動(dòng)態(tài)刪除指定行的方法,通過(guò)getElementById獲取指定行再使用deleteRow方法來(lái)實(shí)現(xiàn)刪除行的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • JavaScript中的scrollTop詳解(滾動(dòng)到頂部)

    JavaScript中的scrollTop詳解(滾動(dòng)到頂部)

    scrollTop是JavaScript中一個(gè)非常有用且重要的方法,它用于獲取或設(shè)置元素的垂直滾動(dòng)條位置,這篇文章主要給大家介紹了關(guān)于JavaScript中scrollTop詳解(滾動(dòng)到頂部)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • javascript實(shí)現(xiàn)全角轉(zhuǎn)半角的方法

    javascript實(shí)現(xiàn)全角轉(zhuǎn)半角的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)全角轉(zhuǎn)半角的方法,涉及JavaScript字符串遍歷與編碼轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • JavaScript實(shí)現(xiàn)簡(jiǎn)單獲取當(dāng)前網(wǎng)頁(yè)網(wǎng)址的方法

    JavaScript實(shí)現(xiàn)簡(jiǎn)單獲取當(dāng)前網(wǎng)頁(yè)網(wǎng)址的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單獲取當(dāng)前網(wǎng)頁(yè)網(wǎng)址的方法,通過(guò)location對(duì)象的href方法來(lái)獲取網(wǎng)址,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-11-11
  • JavaScript常用腳本匯總(二)

    JavaScript常用腳本匯總(二)

    本文給大家分享的javascript常用腳本有把JavaScript中的偽數(shù)組轉(zhuǎn)換為真數(shù)組、JavaScript設(shè)置主頁(yè)功能、JavaScript收藏功能、javascript檢測(cè)元素是否支持某個(gè)屬性代碼、創(chuàng)建和使用命名空間,有需要的小伙伴們快來(lái)看看吧。
    2015-03-03
  • 微信小程序在Tab的icon上顯示消息數(shù)量的方法

    微信小程序在Tab的icon上顯示消息數(shù)量的方法

    這篇文章主要介紹了微信小程序在Tab的icon上顯示消息數(shù)量的方法,首先,在app.json文件中,找到對(duì)應(yīng)的tabBar配置,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • js獲取隱藏元素寬高的實(shí)現(xiàn)方法

    js獲取隱藏元素寬高的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇js獲取隱藏元素寬高的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • JavaScript和JQuery的鼠標(biāo)mouse事件冒泡處理

    JavaScript和JQuery的鼠標(biāo)mouse事件冒泡處理

    這篇文章主要介紹了JavaScript和JQuery的鼠標(biāo)mouse事件冒泡處理,本文總結(jié)出了mouse事件的一些定論,并分別給出了JavaScript和JQuery測(cè)試代碼,需要的朋友可以參考下
    2015-06-06
  • 微信小程序獲取當(dāng)前位置和城市名

    微信小程序獲取當(dāng)前位置和城市名

    這篇文章主要介紹了微信小程序獲取當(dāng)前位置和城市名的思路,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 前端如何實(shí)現(xiàn)動(dòng)畫(huà)過(guò)渡效果

    前端如何實(shí)現(xiàn)動(dòng)畫(huà)過(guò)渡效果

    這篇文章主要介紹了前端如何實(shí)現(xiàn)動(dòng)畫(huà)過(guò)渡效果,幫助大家更好的理解和學(xué)習(xí)前端開(kāi)發(fā)網(wǎng)頁(yè),感興趣的朋友可以了解下
    2021-02-02

最新評(píng)論

黄石市| 太白县| 华蓥市| 岳阳县| 图木舒克市| 凌云县| 普安县| 饶平县| 环江| 额尔古纳市| 曲阳县| 辛集市| 宁海县| 牙克石市| 延寿县| 大城县| 洪江市| 尼玛县| 南雄市| 鞍山市| 前郭尔| 四平市| 江油市| 休宁县| 芦山县| 廉江市| 高雄市| 安徽省| 留坝县| 南宫市| 丰宁| 云安县| 平罗县| 杭州市| 惠水县| 宿州市| 桃江县| 平陆县| 郓城县| 自治县| 宁强县|