1. 程式人生 > >vue元件拖拽-矩形自由拖拽

vue元件拖拽-矩形自由拖拽

    最近公司有個需求,需要實現元件拖拽,實現方式:主要通過vue元件實現,通過在網上查詢資料,發現沒有真正符合需求的例子,但是有一些功能可以參考,無奈之下打算自己封裝一個,一方面也想證明一下自己的能力,此篇博文只是記錄一下,方便以後遇到此類問題,有個參考。

  經過一段時間的研究需求發現需要實現元件的自由拖拽,以及放大縮小等功能,需要腳踏實地的一點一點的封裝,下面列舉一下主要實現的功能點:

1.封裝點元件 ,主要實現在容器內自由拖拽;

2.封裝正方形元件,和點元件結合使用,通過點元件建立8個座標點作為可拖拽的物件,根據點座標的位移實現正方形的放大縮小;

3.使用canvas實現建立各種圖形介面;

4.後期維護畫板功能,讓元件只能在一定區域內移動;

按照上一篇得到的可以自由放大縮小的矩形,下面開始點元件的封裝,目的實現矩形的位置自由擺放:

建立html:

<template>

<div class="square" v-customSquare ref="square">

<porint v-customPoint="1" :pointType="1" :isShow="showPoint" @movePoint="movePoint1"></porint>

<porint v-customPoint="2" :pointType="2" :isShow="showPoint" @movePoint="movePoint2"></porint>

<porint v-customPoint="3" :pointType="3" :isShow="showPoint" @movePoint="movePoint3"></porint>

<porint v-customPoint="4" :pointType="4" :isShow="showPoint" @movePoint="movePoint4"></porint>

<porint v-customPoint="5" :pointType="5" :isShow="showPoint" @movePoint="movePoint5"></porint>

<porint v-customPoint="6" :pointType="6" :isShow="showPoint" @movePoint="movePoint6"></porint>

<porint v-customPoint="7" :pointType="7" :isShow="showPoint" @movePoint="movePoint7"></porint>

<porint v-customPoint="8" :pointType="8" :isShow="showPoint" @movePoint="movePoint8"></porint>

<div class="draggable" @mousedown="move"></div>

</div>

</template>

這裡的程式碼和上一篇程式碼幾乎差不多,但是多了一個div,主要就是通過這個div來實現矩形的自由拖拽。請檢視css程式碼:

<style lang="scss">

.draggable{

position: absolute;

width: 100%;

height: 100%;

z-index: 1;

}

</style>

看到這裡,大家就應該差不多明白了,實際上這個div 就是覆蓋了 元件內容,通過給div 繫結 mousedown事件,不瞭解的可以看上一篇程式碼,已經給出詳細示例:

move(evt){

let odiv = evt.target;// 獲取目標元素

let parentObj = evt.path[1];

let parentPositionWidth = parentObj.style.width.split('p')[0] * 1;

let parentPositionLeft = parentObj.style.left.split('p')[0]* 1;

let parentPositionTop = parentObj.style.top.split('p')[0]*1;

let parentPositionHeight = parentObj.style.height.split('p')[0] * 1;

let x = evt.clientX - odiv.offsetLeft;

let y = evt.clientY - odiv.offsetTop;

document.onmousemove = (e) => {

let left = e.clientX - x;

let top = e.clientY - y;

if(left<= -parentPositionLeft){

left =-parentPositionLeft;

}

if (top <= -parentPositionTop) {

top = -parentPositionTop;

}

if (left >= this.drawingBoardWidth - odiv.offsetWidth - parentPositionLeft){

left =this.drawingBoardWidth - odiv.offsetWidth- parentPositionLeft;

}

if (top >= this.drawingBoardHeight -odiv.offsetHeight - parentPositionTop){

top = this.drawingBoardHeight -odiv.offsetHeight - parentPositionTop;

}

parentObj.style.left = parentPositionLeft + left + 'px';

parentObj.style.top = (parentPositionTop+top)+'px';

}

// 為了防止 火狐瀏覽器 拖拽陰影問題

document.onmouseup = (e) => {

document.onmousemove = null;

document.onmouseup = null;

}

}

下一篇將更新在畫板裡動態建立元件。