drag功能是網頁設計和交互過程中經常會用到的功能,通過拖拽可以實現元素的位置變化、大小變化等等,可以更加方便的進行頁面布局。Vue作為現在非常流行的前端框架,也提供了drag的實現方法。在Vue中,drag主要分為兩類,一種是使用原生的HTML5 drag API,另一種則是使用一些第三方庫進行實現。
使用HTML5 drag API實現drag的方式相對比較簡單,只需要在HTML元素上添加相應的事件處理函數即可。例如,可以在元素的dragstart事件中,將需要移動的元素的id保存到內存中;在元素的dragover事件中獲取鼠標的當前位置,計算出需要移動的元素的位置并設置為樣式屬性。最后在元素的dragend事件中清除內存中保存的id信息,并做一些清理工作,這樣就完成了一個基本的drag的實現。
mounted() { const ele = this.$refs.box ele.addEventListener('dragstart', e =>{ const id = e.target.id e.dataTransfer.setData('id', id) }) ele.addEventListener('dragover', e =>{ e.preventDefault() const id = e.dataTransfer.getData('id') const target = document.getElementById(id) target.style.left = e.clientX + 'px' target.style.top = e.clientY + 'px' }) ele.addEventListener('dragend', e =>{ e.dataTransfer.clearData() }) }
但是使用HTML5 drag API存在一些局限性和兼容性問題。因此,一些第三方庫也提供了drag的實現方式,例如vue-draggable、vue-sortable、vuedraggable等等。這些庫使用了一些DOM操作和CSS動畫,提供了更加友好的API和UI。這里以vue-draggable為例,看一下具體的實現方式。
vue-draggable使用了Vue的渲染函數(render function)來動態生成DOM,通過實現組件的內部邏輯,來達到相應的drag的效果。在實現之前,需要安裝vue-draggable組件:npm i -S vuedraggable,然后在Vue的組件中導入vue-draggable組件:import draggable from 'vuedraggable'
< template >< draggable v-model="list" >< div v-for="(item, index) in list" :key="item.id" >{{ item.text }} div > draggable >< /template >< script >import draggable from 'vuedraggable' export default { data() { return { list: [ { id: 1, text: 'item 1' }, { id: 2, text: 'item 2' }, { id: 3, text: 'item 3' }, ] } }, components: { draggable } } script >
這樣就可以實現一個簡單的drag列表了。當然vue-draggable還提供了其他的一些配置項,例如設置觸發drag的選擇器、設置禁止某些元素進行drag等等。對于需要實現drag的業務,根據需求和實際情況選擇HTML5 drag API或者第三方庫實現即可。