最近公司須要作任務看板,須要拖拽效果。點擊查看效果。因爲網站是基於vue的技術棧,最開始找了一個現成的vue封裝的拖拽組件:Vue.Draggable,該組件是基於sortable封裝的。可是因爲使用的原生html5的拖拽屬性,致使拖拽過程有透明度,並且不能修改透明度和傾斜度,達不到產品的要求(產品要求模仿worktile的使用體驗)。同時我也看了同行不少相似的看板效果,都有傾斜度和非透明,經研究,採用的jquery-ui的sortable。因此,死皮賴臉的選擇jquery-ui的sortable來操做,實際上是極不情願的使用:由於基於jQuery的,jQuery佔空間太大。但因爲是pc端,也還能夠接受。css
在開發以前,能夠先看jquery-ui的sortable的官方文檔和國人整理的文檔的一些實例。html
// 引入樣式文件 <link rel="stylesheet" href="https://static.clouderwork.com/task/static/js/jquery-ui.min.css"> // 引入jquery 庫 <script src="https://static.clouderwork.com/task/static/js/jquery.min.js"></script> // 引入jquery-ui庫 <script src="https://static.clouderwork.com/task/static/js/jquery-ui.min.js"></script>
// 初始化拖拽 initSort () { // 拖拽時開始滾動的間距 var scrollingSensitivity = 20 // 拖拽時滾動速度 let scrollingSpeed = 20 // 拖拽前的父級節點 let dragBeforeParentNode = null // 初始化拖拽函數 $('.task-lists').sortable({ // 自適應placeholder的大小 forceHelperSize: true, // 拖拽時的鼠標形狀 cursor : '-webkit-grabbing', // 拖拽的父級節點(該節點必定要注意,配置錯誤會致使當前屏幕外的元素無法自動滾動拖拽,兩列之間拖拽的滾動也會出問題) appendTo: '.drag-task', // 拖拽時的傾斜度 rotate: '5deg', // 延遲時間(毫秒),避免和click同時操做時出現的衝突 delay: 150, // 以clone方式拖拽 helper: 'clone', // 拖拽到邊框出現滾動的間距, scrollSensitivity:scrollingSensitivity, // 應用於拖拽空白區域的樣式 placeholder: 'portlet-placeholder ui-state-highlight', // 容許拖拽預留空白區域 forcePlaceholderSize: true, // 多個列表之間的拖拽的dom元素 connectWith: '.task-lists', // 拖拽結束函數 stop: (e, ui) => { // 當前拽入的元素 let item = $(ui.item) // 當前拽入元素的下標 let index = item.index() let kid = '' // xxxx 這裏面能夠操做數據更新 }, // 開始拖拽時的函數 start: (e, ui) => { // 拖拽前的父級節點 dragBeforeParentNode = ui.item[0].parentNode // 讓placeholder和源高度一致 ui.placeholder.height(ui.helper[0].scrollHeight).width(258) // xxxx 這裏能夠記錄一些拖拽前的元素屬性 }, // 處理兩列滾動條問題 sort:function(event, ui){ var scrollContainer = ui.placeholder[0].parentNode // 跨列拖拽的狀況 if (dragBeforeParentNode && dragBeforeParentNode.id !== scrollContainer.id) { // 設置拽入的列表的滾動位置 var overflowOffset = $(scrollContainer).offset() if((overflowOffset.top + scrollContainer.offsetHeight) - event.pageY < scrollingSensitivity) { scrollContainer.scrollTop = scrollContainer.scrollTop + scrollingSpeed } else if(event.pageY - overflowOffset.top < scrollingSensitivity) { scrollContainer.scrollTop = scrollContainer.scrollTop - scrollingSpeed } } } }).disableSelection()
在開發的時候必定要多看文檔,瞭解其屬性的含義會事半功倍,順延解決問題。
下面給一個實例供參考:jquery-ui-sortable 實例, 源代碼在github上面,地址vue