前端培訓-中級階段(19)- 拖拽API(2019-10-03期)

前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,如今前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本着提高技術水平,打牢基礎知識的中心思想,咱們開課啦(每週四)。html

clipboard.png

其實在以前就寫過一篇拖拽相關的內容。今天簡單說說吧。拖拽想要實現分爲兩種形式:前端

  1. 模擬實現
  2. drag API 實現jquery

    1. M 端表現
    2. pc 端表現

模擬實現拖拽

實現方案

  1. 鼠標按下的時候記錄按下的DOM。(若是有須要會進行查詢父級)
  2. 鼠標移動時,根據鼠標位置修改DOM的位置。(若是要求原位置不變,能夠clone一個新的)
  3. 鼠標擡起的時候判斷父級不一樣則移入。(若是有須要會進行查詢父級,若是是同級的標籤能夠作排序操做,目前代碼中是追加)

測試地址segmentfault

實現代碼

var drapDOM = null;
window.addEventListener('mousedown', function(e){
    if(e.target.classList.contains('drap')){
        drapDOM = e.target;
    }
})
window.addEventListener('mousemove', function(e){
    if(drapDOM){
        drapDOM.style.position = 'fixed';
        drapDOM.style.pointerEvents =  'none';
        drapDOM.style.left = e.clientX + 'px'
        drapDOM.style.top = e.clientY + 'px'
        console.log(e)
    }
})
window.addEventListener('mouseup', function(e){
    console.log(e.target)
    if(drapDOM){
        drapDOM.style.position = 'initial';
        drapDOM.style.pointerEvents =  'initial';
        drapDOM.style.left = '0'
        drapDOM.style.top = '0';
        if(drapDOM.parentNode != e.target){
            e.target.appendChild(drapDOM)
        }
        drapDOM = null
    }
})

注意事項

  1. drapDOM.style.pointerEvents = 'none' 防止副本干擾e.target
  2. 能夠拖拽的DOM
  3. 能夠放置的DOM

drag API 實現

先說說有什麼好處微信

  1. 能夠自動生成副本樣式
  2. 動做週期的事件,能夠方便的區分出(目標對象與源對象)app

    1. ondragstart:源對象開始被拖動
    2. ondrag:源對象被拖動的過程當中
    3. ondragend:源對象被拖動結束
    4. ondragenter:目標對象被源對象拖動進入
    5. ondragover:目標對象被源對象懸浮在上面
    6. ondragleave:源對象拖動着離開了目標對象
    7. ondrop:源對象拖動着在目標對象上方鬆手
  3. 數據傳遞:框架

    1. 源對象數據保存:e.data.Transfer.setData(k,v)//k-v必須都是string類型
    2. 目標對象獲取數據:e.data.Transfer.getData(k,v)

實現方案

測試地址函數

  1. 可拖拽點增長屬性( draggable="true"
  2. 可拖拽點增長監聽函數 dragstart 記錄當前拖拽點
  3. 放置點增長監聽函數 dropdragover 阻止默認事件,防止(打開、不能拖拽)
  4. 放置點增長監聽函數 drop 判斷若是拖拽點不在放置點內(if(!$(ev.target).find(dragged).length){)就追加

實現代碼

var dragged;
function allowDrop(ev){
    // console.log('allowDrop', ev)
    ev.preventDefault();
}

function drag(ev){
    // console.log('drag', ev)
}

function drop(ev){
    console.log('drop', ev)
    ev.preventDefault();
    if(!$(ev.target).find(dragged).length){
        $(ev.target).append(dragged)
    }

}

function dragstart(ev){
    dragged = ev.target;
}
$(function(){
    $('ul').off().on('drop', drop).on('dragover', allowDrop)
    $('li[draggable="true"]').off().on('drag', drag).on('dragstart', dragstart)
})

注意事項

  1. 放置點增長監聽函數 dropdragover 阻止默認事件,防止(打開、不能拖拽)
  2. draggable="true" 用來標識這是一個可拖拽點。
  3. M端 和 PC端 表現其實還不同的。好比M拖動會觸發滾動

其餘方案&開源框架

  1. jquery-ui
  2. sortable.js

微信公衆號:前端linong

clipboard.png

相關文章
相關標籤/搜索