双层拖拽事件,用鼠标画矩形,点击

2024-03-13 14:32

本文主要是介绍双层拖拽事件,用鼠标画矩形,点击,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

思路一是使用v-if 创建两个矩形框,一个使用vue-drag-resize,一个使用 自己的\span,点击按钮实现两个矩形框的切换,两个矩形框使用同一个currentitem,
使用两个相同的元素来回切换实现标注右键,左键,双击,放大缩小,拖动等功能
以下代码不完整,因为某些原因不可以上传,以下代码仅供参考

<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(item)console.log(this.getXY(e))this.startPosbr=this.getXY(e)console.log(2)console.log(this.startPosbr)e.target.addEventListener('mousemove',this.onMousemovebr(item,$event))e.target.addEventListener('mouseup',this.onMouseupbr(item,$event))},onMousemovebr(item,e){if(this.canmove){let { x, y } = this.getXY(e)console.log(3)console.log(this.getXY(e))let myw=item.w;let myh=item.h;let myx=item.x;let myy=item.y;let myn=item.now;item={w:x-this.startPosbr.x,h:y-this.startPosbr.y,x:myx,y:myy,now:myn}// 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){e.target.removeEventListener('mousemove',this.onMousemovebr)e.target.removeEventListener('mouseup',this.onMouseupbr)this.canmove=falsethis.startPos =this.startPosbr= null;},// 矩形右下角拖动事件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>

这篇关于双层拖拽事件,用鼠标画矩形,点击的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

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

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

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can