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

vue實現(xiàn)前端拖拽div位置交換的方法詳解

 更新時間:2025年01月04日 11:56:50   作者:Loong_DQX  
這篇文章主要介紹了如何使用Vue技術實現(xiàn)一個簡單的備忘錄應用,包括添加條目和拖拽條目兩個功能,文章還詳細解釋了如何使用Vue的draggable屬性和JavaScript獲取同級元素節(jié)點的方法,需要的朋友可以參考下

一、場景描述

類似備忘錄,點擊添加按鈕,多一條條目。然后手動拖拽條目可以更換條目之前的位置。

二、問題拆解

這里可以分成兩個問題,第一個是添加,第二個是拖拽。
添加的實現(xiàn):vue技術像一個前端頁面的數(shù)據(jù)管理器,它里面的 “v-for”列表渲染指令支持當列表數(shù)據(jù)增加的時候實現(xiàn)重新渲染增加一個條目。
拖拽的實現(xiàn):拖拽事件,開始的時候需要記錄所拖拽的目標,拖拽經過的實現(xiàn)交換。

三、知識背景

3.1 vue拖拽事件

在這里,我們使用的是開始拖拽事件和在有效區(qū)域移動事件,為的是得到所拖拽的標簽元素以及被拖動標簽元素所要到達的原有標簽元素的位置。
下面舉例一下拖拽事件怎么用。

首先需要開始標簽拖拽功能:draggable=“true” ,再添加拖拽事件。

<div class="task" draggable="true" @dragstart.self = "ondragstart($event)" @dragover.self = "ondragover($event)">
</div>

3.2 js獲得同級元素節(jié)點

ele.previousSibling ele.previousElementSibling 獲取同級的上下級,(前一個標簽元素和后一個標簽元素)
ele.nextSibling ele.nextElementSibling

<input id="a5" type="button" onclick="console.log('previousSibling是'+this.previousSibling);" value="e" />
<!-- 這是個text對象,因為在這個標簽元素前面是一個換行符 -->
<input id="a6" type="button" onclick="console.log(this.previousSibling);" value="e" />

<input id="a7" type="button" onclick="console.log('previousElementSibling是'+this.previousElementSibling);" value="e" />
<!-- 這是個標簽元素,因為在這個js代碼所取的是一個前一個標簽對象 -->
<input id="a8" type="button" onclick="console.log(this.previousElementSibling);" value="e" />

四、場景實現(xiàn)

添加的實現(xiàn):就是用vue中的v-for指令。點擊按鈕之后,在列表中加一個列表元素,就會重新渲染。

拖拽的實現(xiàn):這里有兩種可能性,一個是如果是往前拖拽,則所要拖拽元素放在目標元素之前;如果是往后拖拽,則所要拖拽元素放在目標元素之后。

因此需要判斷目標元素是否是前面的元素。

isPreviousElements(sourse, target){
    //這里是判斷前面是否還有元素,sourse是不是第一個元素
    if(!sourse.previousElementSibling){
        return false;
    }
    //這里是判斷
    if(target.isEqualNode(sourse.previousElementSibling)){
        return true;
    }
    return this.isPreviousElements(sourse.previousElementSibling, target)
},

然后把標簽元素放入到目標元素之前或之后。

完整代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>todayTask</title>
    <script src="../js/vue.js"></script>
    <style>
        .task{
            width: 300px;
            height: 50px;
            list-style-type:decimal;
            list-style-position:inside;    
            cursor: grab;
            position: absolute;
            transition: top;
            transition-duration: 0.6s;
        }
        .taskList{
            position: relative;
            display: flex;
            flex-direction: column;
        }
        .addTask{
            display: block;
        }
    </style>
</head>
<body>
    <div class="container">
        <button class="addTask" @click="addTask">添加任務</button>
        <div class="taskList">
            <div class="task" draggable="true" @dragstart.self = "ondragstart($event)" @dragover.self = "ondragover($event)" v-for="task in tasks" :key="task.id">
                <span>
                    {{task.id}}
                    <input type="text" v-model="task.task">
                </span>
            </div>
        </div>
 
    </div>
</body>
<script>
    document.body.addEventListener("dragover",function(ev){
        ev.preventDefault();
    })
    new Vue({
        el:".container",
        data:{
            tasks:[
                {id:1,task:"",isDone:false}
            ],
            dragDiv:"",
            isMoving:false
        },
        methods:{
            addTask(){
                this.tasks.push({id:this.tasks.length+1,task:"",isDone:false})
                var taskList = document.getElementsByClassName("taskList")[0];
                taskList.style.height = this.tasks.length*50+"px"
            },
            sortDiv(divs){
                for(var i=0;i<divs.length;i++){
                    divs[i].style.top = i*50 + "px";
                }
            },
            isPreviousElements(sourse, target){
                //返回上一節(jié)點
                if(!sourse.previousElementSibling){
                    return false;
                }
            
                if(target.isEqualNode(sourse.previousElementSibling)){
                    return true;
                }
                return this.isPreviousElements(sourse.previousElementSibling, target)
            },
            ondragstart(ev){
                this.dragDiv = ev.target;
                console.log("dragstart");
            },
            ondragover(ev){
                overDrag = ev.target;
                console.log(overDrag.isEqualNode(this.dragDiv));
                console.log(this.isMoving);
                if(this.isMoving || overDrag.isEqualNode(this.dragDiv)){
                    return;
                }
                //判斷是否是前一個標簽元素
                if(this.isPreviousElements(overDrag,this.dragDiv)){
                    overDrag.parentNode.insertBefore(this.dragDiv,overDrag.nextElementSibling);
                }else{
                    overDrag.parentNode.insertBefore(this.dragDiv,overDrag);
                }
                this.isMoving = true;
                const self = this;
                var st = setTimeout(function(){
                    self.isMoving = false;
                    clearTimeout(st);
                },600);
                this.sortDiv(document.querySelectorAll(".task"));
            }
        },
        created(){
            //設置ul的盒子高度
            var taskList = document.getElementsByClassName("taskList")[0];
            taskList.style.height = this.tasks.length*50+"px";
            //設置每一個item的上邊緣top
            this.sortDiv(document.querySelectorAll(".task"));
        },
        updated(){
            this.sortDiv(document.querySelectorAll(".task"));
        }
    })
 
</script>
</html>

總結 

到此這篇關于vue實現(xiàn)前端拖拽div位置交換的文章就介紹到這了,更多相關vue前端拖拽div位置交換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式

    elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式

    這篇文章主要介紹了elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue中使用echarts制作圓環(huán)圖的實例代碼

    vue中使用echarts制作圓環(huán)圖的實例代碼

    這篇文章主要介紹了vue中使用echarts制作圓環(huán)圖的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Vue.js中$refs{}如何獲取DOM元素

    Vue.js中$refs{}如何獲取DOM元素

    這篇文章主要介紹了Vue.js中$refs{}如何獲取DOM元素問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • VUE使用draggable實現(xiàn)組件拖拽

    VUE使用draggable實現(xiàn)組件拖拽

    這篇文章主要為大家詳細介紹了VUE使用draggable實現(xiàn)組件拖拽,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue父列表數(shù)據(jù)獲取子列表數(shù)據(jù)的實現(xiàn)步驟

    vue父列表數(shù)據(jù)獲取子列表數(shù)據(jù)的實現(xiàn)步驟

    本文檔將介紹如何通過點擊父列表(表格)中的數(shù)據(jù)行來獲取到子列表(表格)的數(shù)據(jù),代碼示例是基于Vue框架實現(xiàn)的一個組件,包含了父列表和子列表,通過點擊父列表的數(shù)據(jù)行來動態(tài)獲取子列表的數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • element-ui?table表格底部合計自定義配置過程

    element-ui?table表格底部合計自定義配置過程

    這篇文章主要介紹了element-ui?table表格底部合計自定義配置過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue實現(xiàn)前端按鈕組件權限管理

    vue實現(xiàn)前端按鈕組件權限管理

    這篇文章主要為大家介紹了vue實現(xiàn)前端按鈕組件權限管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Vue使用Echarts實現(xiàn)數(shù)據(jù)可視化的方法詳解

    Vue使用Echarts實現(xiàn)數(shù)據(jù)可視化的方法詳解

    這篇文章主要為大家詳細介紹了Vue使用Echarts實現(xiàn)數(shù)據(jù)可視化的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Vue3中使用i18n,this.$t報錯問題及解決

    Vue3中使用i18n,this.$t報錯問題及解決

    這篇文章主要介紹了Vue3中使用i18n,this.$t報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • elementUi vue el-radio 監(jiān)聽選中變化的實例代碼

    elementUi vue el-radio 監(jiān)聽選中變化的實例代碼

    這篇文章主要介紹了elementUi vue el-radio 監(jiān)聽選中變化,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06

最新評論

盈江县| 射阳县| 福安市| 吴江市| 阿拉善盟| 天长市| 淮滨县| 青田县| 白朗县| 黑山县| 漳平市| 壤塘县| 柞水县| 周宁县| 敦化市| 龙南县| 莱阳市| 沛县| 卢龙县| 金湖县| 格尔木市| 平顶山市| 洞口县| 西林县| 芜湖县| 克山县| 普宁市| 高邮市| 九龙城区| 成都市| 龙海市| 白河县| 德安县| 景宁| 揭阳市| 安达市| 富宁县| 潼南县| 瑞安市| 大余县| 武隆县|