1. 程式人生 > >對頁面某個節點的拖曳(原生js和vue專案)

對頁面某個節點的拖曳(原生js和vue專案)

HTML5中的draggable

draggable 屬性規定元素是否可拖動(連結和影象預設是可拖動的。)

/// true:規定元素是可拖動的,false:規定元素是不可拖動的,auto:使用瀏覽器的預設特性。
<element draggable="true|false|auto">

在拖放的過程中會觸發以下事件:

  • 在拖動目標上觸發事件 (源元素):
  • ondragstart - 使用者開始拖動元素時觸發
  • ondrag - 元素正在拖動時觸發
  • ondragend - 使用者完成元素拖動後觸發

釋放目標時觸發的事件:

  • ondragenter
    - 當被滑鼠拖動的物件進入其容器範圍內時觸發此事件
  • ondragover - 當某被拖動的物件在另一物件容器範圍內拖動時觸發此事件
  • ondragleave - 當被滑鼠拖動的物件離開其容器範圍內時觸發此事件
  • ondrop - 在一個拖動過程中,釋放滑鼠鍵時觸發此事件
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>ondrag相關事件</title>
<style>
.droptarget {
    float:
left; width: 100px; height: 35px; margin: 15px; padding: 10px; border: 1px solid #aaaaaa; } </style> </head> <body> <
p>在兩個矩形框中來回拖動 p 元素:</p> <div class="droptarget"> <p draggable="true" id="dragtarget">拖動!!!</p> </div> <div class="droptarget"></div> <p style="clear:both;"><strong>注意:</strong>Internet Explorer 8 及更早 IE 版本或 Safari 5.1 及更早版本的瀏覽器不支援 drag 事件。</p> <p id="demo"></p> <script> ///* 拖動時觸發*/ document.addEventListener("dragstart", function(event) { //dataTransfer.setData()方法設定資料型別和拖動的資料 event.dataTransfer.setData("Text", event.target.id); // 拖動 p 元素時輸出一些文字 document.getElementById("demo").innerHTML = "開始拖動 p 元素."; //修改拖動元素的透明度 event.target.style.opacity = "0.4"; }); //在拖動p元素的同時,改變輸出文字的顏色 document.addEventListener("drag", function(event) { document.getElementById("demo").style.color = "red"; }); // 當拖完p元素輸出一些文字元素和重置透明度 document.addEventListener("dragend", function(event) { document.getElementById("demo").innerHTML = "完成 p 元素的拖動"; event.target.style.opacity = "1"; }); /* 拖動完成後觸發 */ // 當p元素完成拖動進入droptarget,改變div的邊框樣式 document.addEventListener("dragenter", function(event) { if ( event.target.className == "droptarget" ) { event.target.style.border = "3px dotted red"; } }); // 預設情況下,資料/元素不能在其他元素中被拖放。對於drop我們必須防止元素的預設處理 document.addEventListener("dragover", function(event) { event.preventDefault(); }); // 當可拖放的p元素離開droptarget,重置div的邊框樣式 document.addEventListener("dragleave", function(event) { if ( event.target.className == "droptarget" ) { event.target.style.border = ""; } }); document.addEventListener("drop", function(event) { event.preventDefault(); if ( event.target.className == "droptarget" ) { document.getElementById("demo").style.color = ""; event.target.style.border = ""; var data = event.dataTransfer.getData("Text"); event.target.appendChild(document.getElementById(data)); } }); </script> </body> </html>

vue專案中的Vue.Draggable

1.安裝

npm install vuedraggable

2.引入

import draggable from ‘vuedraggable’

3.註冊

components:{
draggable
}

4.使用

<draggable v-model="itemlis" 

//開始移動方法
:move="getdata" 
@update="datadragEnd"

//引數配置 
:options="{animation: 60,handle:'.drag-icon'}"
>
               <transition-group>
                   <el-row class="album-list-list-item" v-for="(item,index) in itemlis" :key="item.id">
                       <el-col :span="13">
                           <div class="grid-content ">
                               <i class="icon drag-icon iconfont icon-Icon-tuozhuai"></i>
                               <el-checkbox v-model="item.checked" :value="item.id"></el-checkbox> <span class="album-info-net">{{item.net}}</span>
                           </div>
                       </el-col>
                       <el-col :span="4">
                           <div class="grid-content ">
                               <span>{{item.time}}</span>
                           </div>
                       </el-col>
                       <el-col :span="4">


                           <el-popover
                                   placement="left-start"
                                   visible-arrow=false
                                   width="120"
                                   trigger="hover"
                           >
                               <div class="code-img">
                                   <img src="../assets/images/1.png"/>
                               </div>
                               <span slot="reference">{{item.wqcode}}</span>
                           </el-popover>

                       </el-col>

                       <el-col :span="3">
                           <div class="grid-content album-l-l-tool ">
                               <div class="more-tip-op">
                                   <el-dropdown>
                                       <span class="el-dropdown-link"><em class="el-icon-more"></em></span>
                                       <el-dropdown-menu slot="dropdown" >
                                           <el-dropdown-item :data-url="item.opUrl.removeUrl" @click.native="moveTo(item,$event)">移動</el-dropdown-item>
                                           <el-dropdown-item :data-url="item.opUrl.copyUrl" @click.native="copyTo(item,$event)">複製</el-dropdown-item>
                                           <el-dropdown-item @click.native="itemDel(index,$event)" :data-url="item.opUrl.delUrl">刪除 </el-dropdown-item>
                                           <el-dropdown-item :data-url="item.opUrl.exportUrl">匯出</el-dropdown-item>
                                           <el-dropdown-item :data-url="item.opUrl.editName" @click.native="getEditDialog(item,$event)">編輯</el-dropdown-item>
                                           <el-dropdown-item @click.native="getCodeDialog(item,$event)" >檢視二維碼</el-dropdown-item>

                                       </el-dropdown-menu>
                                   </el-dropdown>
                               </div>
                           </div>
                       </el-col>
                   </el-row>
               </transition-group>
           </draggable>