双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG

本文主要是介绍双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

<template><div class="mycanvas-container"><vue-drag-resize :isActive = 'true'/> <div class="left"><p>展示视口</p><div class="myshow"><img :src="mysrc" alt width="100%" /><!-- <div id="canvas" style="width:100%;height:100%" class="mycanvas"></div> --></div></div><div class="center"><p>操作视口</p><div class="myedit" ref="myedit"  @mousedown.prevent="" @mousemove.prevent="" @mouseup.prevent=""@contextmenu.prevent=""><!-- <img src="@/assets/jia.svg" alt=""> --><img :src="mysrc"  @mousedown.prevent="onMousedown" @mousemove="onMousemove" /><divclass="myedit-span"v-for="(item, index) in mydata":key="index":style="getSpanStyle(item)"@contextmenu.prevent="onContextmenu(item, $event)"><div class="br" @mousedown.prevent="onMousedownbr(item,$event)"@mousemove="onMousemovebr(item,$event)"@mouseup="onMouseupbr(item,$event)"></div></div><!-- <div id="canvas" style="width:100%;height:100%" class="mycanvas"></div> --></div></div><div class="right"><img src alt class="mybutton" /><input v-show="0" ref="file" type="file" class="mybutton" @change="onChange" /><button class="mybutton" @click="selectFile">导入图片</button><button class="mybutton">新增标注</button><button class="mybutton">修改标注</button><button class="mybutton">删除</button><button class="mybutton">保存</button></div><div class="myMenu" v-show="mymenu.current" :style="mymenu.style"><!-- <button @click="onRemoveItem">删除</button> --><ui-button type="primary" @click="onRemoveItem">删除</ui-button><ui-select></ui-select><select name="" id=""><option value="1">ceshi</option></select></div></div>
</template><script>import jiaIcon from "./jia.svg";
export default {data() {return {mysrc: "",mydata: [],mymenu: { current: null, style: { left: 0, top: 0 } }};},mounted() {document.addEventListener('mouseup', this.onMouseup)this.getData()},beforeDestroy() {document.removeEventListener('mouseup', this.onMouseup)},methods: {getData(){let url='/index'this.axios(url,{params:{status:1}}).then(data=>{console.log(data)}).catch(err => this.$Message.error(err.message))},getXY(e) {let rect = this.$refs.myedit.getBoundingClientRect()return {x: e.clientX - rect.left,y: e.clientY - rect.top}},// 上传图片1onChange(e) {this.mysrc = window.URL.createObjectURL(e.target.files[0]);e.target.value = ''},// 上传图片2,selectFile() {this.$refs.file.click();},// 矩形右下角拖动事件1onMousedownbr(item,e){e.target.removeEventListener('mousemove',this.onMousemove)e.target.removeEventListener('mouseup',this.onMouseup)this.canmove=trueconsole.log(1)console.log(this.getXY(e))this.startPosbr=this.getXY(e)console.log(2)console.log(this.startPosbr)e.target.addEventListener('mousemove',this.onMousemovebr)e.target.addEventListener('mouseup',this.onMouseupbr)},onMousemovebr(item,e){if(this.canmove){let { x, y } = this.getXY(e)console.log(3)console.log(this.getXY(e))item.w=item.w+(x-this.startPosbr.x)item.h=item.h+(y-this.startPosbr.y)console.log(4)console.log(item.w)// Math.sqrt(9)// 9**.5}},onMouseupbr(item,e){this.canmove=falsethis.startPos =this.startPosbr= null;e.target.removeEventListener('mousemove',this.onMousemovebr)e.target.removeEventListener('mouseup',this.onMouseupbr)},// 矩形右下角拖动事件2onMousedown(e) {e.target.addEventListener('mousemove',this.onMousemove)e.target.addEventListener('mouseup',this.onMouseup)this.mymenu.current = nulllet { x, y } = this.getXY(e)this.currentItem = { x, y, w: 0, h: 0, now: Date.now() }this.startPos = { x, y }this.mydata.push(this.currentItem)},onMousemove(e) {if (!this.currentItem) return;let { x, y } = this.getXY(e)this.currentItem.w = Math.abs(x - this.startPos.x)this.currentItem.h = Math.abs(y - this.startPos.y)},onMouseup(e) {this.currentItem = this.startPos =this.startPosbr= null;// this.mydata = this.mydata.filter(_ => _.w > 10 && _.h > 10)e.target.removeEventListener('mousemove',this.onMousemove)e.target.removeEventListener('mouseup',this.onMouseup)},onContextmenu(item, e) {this.mymenu = {current: item,style: {top: e.clientY + 'px',left: e.clientX + 'px'}}},onRemoveItem() {this.mydata.splice(this.mydata.indexOf(this.mymenu.current), 1)this.mymenu = { ...this.mymenu, current: null }},getSpanStyle(item) {return {width: `${item.w}px`,height: `${item.h}px`,top: `${item.y}px`,left: `${item.x}px`};}}
};
</script>
<style lang="less" scoped>
// 设置绘图样式1
body {user-select: none;
}.myMenu {position: fixed;top: 400px;left: 400px;width: 100px;padding: 8px 0;background-color: #fff;> * {width: 100%;}
}#canvas > div {/* border: 2px solid green; */position: absolute;background-color: transparent;
}#canvas > div > span {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);font-family: simsun;font-size: 9pt;
}// 设置绘图样式2.mycanvas-container {display: flex;justify-content: center;align-items: center;.left,.center,.right {width: 300px;// height: 520px;margin: 20px;p {text-align: center;}.myshow,.myedit {width: 300px;// height: 500px;border: 1px solid #000;position: relative;.myedit-span {position: absolute;border: 1px dashed #fff;// background: url("./jia.svg") no-repeat center center;background-size: contain;}.br,.divcenter{width: 10px;height: 10px;position: absolute;border: 1px solid #f00;background: #fff;border-radius: 50%;bottom:-5px;right:-5px;cursor:nwse-resize;}.divcenter{top:50%;left:50%;transform:translate(-5px ,-5px);cursor:move;}.mycanvas {border: 1px solid pink;position: absolute;top: 0;left: 0;}img {width: 100%;}}}.right {width: 150px;display: flex;justify-content: center;align-items: left;flex-direction: column;.mybutton {margin-top: 20px;display: block;}}
}
</style>

这篇关于双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805179

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用