Vue3+canvas實(shí)現(xiàn)鼠標(biāo)拖拽生成矩形框

<canvas id="myCanvas" ref="myCanvas" >

? </canvas>

const flag = ref(false)

const rectWidth = ref(0)//矩形框的寬

const rectHeight = ref(0) //矩形框的高

const totalRect = reactive([])? //畫的所有的矩形坐標(biāo)長(zhǎng)度數(shù)據(jù)存儲(chǔ)在數(shù)組中

const downX = ref(0)//鼠標(biāo)點(diǎn)擊圖片落下時(shí)的位置(X)

const downY = ref(0)//鼠標(biāo)點(diǎn)擊圖片落下時(shí)的位置(Y)

const ctx = ref("")//dom節(jié)點(diǎn)

const delIndex = ref(null)//刪除時(shí)選中的矩形框的index

const? myCanvas = ref(null);

const canvas = myCanvas.value;

const atime = ref('');

// // 放下鼠標(biāo)

const mousedown= (e)=>{

? console.log("鼠標(biāo)落下");

? atime.value= new Date().getTime();

? flag.value= true;

? downX.value= e.offsetX; // 鼠標(biāo)落下時(shí)的X

? downY.value= e.offsetY; // 鼠標(biāo)落下時(shí)的X

? mousemove(e);

}

// // 移動(dòng)鼠標(biāo)

const mousemove=(e)=>{

? if(flag.value){

? ? //判斷如果重右下往左上畫褪秀,這種畫法直接return

? ? if(downX.value- e.offsetX> 0 || downY.value- e.offsetY> 0){

? ? ? console.log("重右下往左上畫");

? ? return

? ? }else{

? ? ? console.log("重左上往右下畫");

//? ? ? //如果重左上往右下畫小槐,計(jì)算出鼠標(biāo)移動(dòng)的距離誓沸,也就是矩形框的寬和高

? ? ? rectWidth.value= Math.abs(downX.value- e.offsetX)

? ? ? rectHeight.value= Math.abs(downY.value- e.offsetY)

? ? ? console.log("this.rectWidth",? rectWidth.value);

? ? ? console.log("this.rectHeight", rectHeight.value);

//? ? ? //判斷這個(gè)寬高的長(zhǎng)度杏节,如果小于10,直接return鸵鸥,因?yàn)槭髽?biāo)移動(dòng)距離過(guò)于短

//? ? ? //防止點(diǎn)擊頁(yè)面時(shí),會(huì)畫成一個(gè)點(diǎn)颖侄,沒(méi)有意義

? ? ? if (rectWidth.value< 10 || rectHeight.value< 10) {

? ? ? ? console.log("只是點(diǎn)擊");

? ? ? ? rectWidth.value= 0;

? ? ? ? rectHeight.value= 0;

? ? ? ? return;

}

? ? ? clear();? //清空畫布

? ? ? redrawAll();

? ? drawRect(

? ? ? ? ? downX.value,

? ? ? ? ? downY.value,

? ? ? ? ? rectWidth.value,

? ? ? ? ? rectHeight.value

);

}

}

}

const redrawAll= ()=>{

? console.log("先畫之前畫過(guò)的圖,保證畫多個(gè)的時(shí)候看起來(lái)像前一個(gè)不消失");

? if(totalRect.length> 0){

? ? totalRect.forEach((e) => {

? ? ? drawRect(e.beforex, e.beforey, e.rectW, e.rectH);

});

}

}

// //清除畫布

const clear= ()=>{

? const canvas= myCanvas.value;

? let ctx= canvas.getContext("2d");

? ctx.clearRect(0, 0, canvas.width, canvas.height);

}

const drawRect= (x:any,y:any,lineW:any,lineY:any)=>{

? const canvas= myCanvas.value;

? let ctx= canvas.getContext("2d");

? //? 開(kāi)始繪制;

? ctx.beginPath();

? //? //設(shè)置線條顏色载萌,必須放在繪制之前

? ctx.strokeStyle= "#850a1e";

? console.log("44444444");

? // 線寬設(shè)置惧财,必須放在繪制之前

? ctx.lineWidth= 2;

? // strokeRect參數(shù):(左上角x坐標(biāo),y:左上角y坐標(biāo)扭仁,繪畫矩形的寬度垮衷,繪畫矩形的高度)

? ctx.strokeRect(x, y, lineW, lineY);

? console.log("66666666666666");

}

// //點(diǎn)擊畫布

const findRect= (e)=>{

? if (rectTag.value) {

? ? console.log("eeeeeeeeeee", e);

? ? console.log("this.totalRect", this.totalRect);

? ? //當(dāng)點(diǎn)擊畫布的時(shí)候,計(jì)算有沒(méi)有點(diǎn)再矩形框內(nèi)乖坠、哪個(gè)矩形框內(nèi)

? ? totalRect.map((item, index) => {

? ? ? if (

? ? ? ? ? e.offsetX- item.beforex> item.rectW||

? ? ? ? ? e.offsetX< item.beforex||

? ? ? ? e.offsetY- item.beforey> item.rectH||

? ? ? ? ? e.offsetY< item.beforey

){

? ? ? return;

? ? }else {

? ? ? ? //找到之后搀突,設(shè)置下標(biāo)

? ? ? ? delIndex.value= index;

? ? ? ? console.log("this.delIndex", this.delIndex);

}

})

}

}

//點(diǎn)擊刪除按鈕

del() {

? this.dialogVisible= false;

? //刪除

? this.ctx.clearRect(

? ? ? this.totalRect[this.delIndex].beforex- 2,

? ? ? this.totalRect[this.delIndex].beforey- 2,

? ? ? this.totalRect[this.delIndex].rectW+ 4,

? ? ? this.totalRect[this.delIndex].rectH+ 4

? );

? //刪掉totalRect的數(shù)據(jù),真正的項(xiàng)目中需要調(diào)用后臺(tái)接口熊泵,刪掉數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)

? this.totalRect.splice(this.delIndex, 1);

? //刪掉之后仰迁,再畫一次,刷新頁(yè)面

? this.redrawAll();

? console.log(this.totalRect, "刪除了沒(méi)");

},

},

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顽分,一起剝皮案震驚了整個(gè)濱河市徐许,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卒蘸,老刑警劉巖雌隅,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恰起,警方通過(guò)查閱死者的電腦和手機(jī)修械,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)检盼,“玉大人祠肥,你說(shuō)我怎么就攤上這事√菝螅” “怎么了仇箱?”我有些...
    開(kāi)封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)东羹。 經(jīng)常有香客問(wèn)我剂桥,道長(zhǎng),這世上最難降的妖魔是什么属提? 我笑而不...
    開(kāi)封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任权逗,我火速辦了婚禮,結(jié)果婚禮上冤议,老公的妹妹穿的比我還像新娘斟薇。我一直安慰自己,他們只是感情好恕酸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布堪滨。 她就那樣靜靜地躺著,像睡著了一般蕊温。 火紅的嫁衣襯著肌膚如雪袱箱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天义矛,我揣著相機(jī)與錄音发笔,去河邊找鬼。 笑死凉翻,一個(gè)胖子當(dāng)著我的面吹牛了讨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播制轰,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼前计,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了艇挨?” 一聲冷哼從身側(cè)響起残炮,我...
    開(kāi)封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缩滨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脉漏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年苞冯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侧巨。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舅锄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出司忱,到底是詐尸還是另有隱情皇忿,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布坦仍,位于F島的核電站鳍烁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏繁扎。R本人自食惡果不足惜幔荒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梳玫。 院中可真熱鬧爹梁,春花似錦、人聲如沸提澎。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盼忌。三九已至莉炉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碴犬,已是汗流浹背絮宁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留服协,地道東北人绍昂。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像偿荷,于是被迫代替她去往敵國(guó)和親窘游。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容