用画布实现 鼠标绘制可拖动 可改变大小矩形框

网上找了一下 用canvas实现鼠标绘制矩形框 找到的都是需要用jQuery的,所以自己用js写了一个。效果图如下:
代码可能写的实在不算好,但是可以用,就当成一个demo来看吧。
实现原理的话和一般的鼠标拖动绘制矩形框(用div实现)原理差不多,计算鼠标的坐标点来减去画布距离网页窗口最左边以及最上边的距离 以此为基点 改变矩形框的大小,不同的是 这里每帧都要把画布清空以及重绘 这样最终看到的效果就是跟着鼠标的拖动 矩形框在变化。
还有需要注意的一点是,要怎么实现判断鼠标是否在矩形框内。只有实现了判断方法才可以实现 拖动以及改变矩形框的大小。实现方式 是通过画布的一个API isPointInPath
API所以我只要将鼠标相对于画布的坐标点这个参数传给 isPointInPath 我就可以在每次重绘画布的时候判断 这个坐标点是否在画布的某一个矩形内部。

function reshow(x,y){
   
        layers.forEach(item=>{
   
            ctx.beginPath();
            ctx.rect(item.x1,item.y1,item.width,item.height);
            ctx.strokeStyle=item.strokeStyle
             
            if(ctx.isPointInPath(x*scale,y*scale)){
   
				render(item);//改变鼠标指针样式 可以做相关操作
            }
            ctx.stroke();
        })
}

这段代码是我的重绘函数,我把已经绘制的矩形的相关属性放在了layers这个数组里,每帧的重绘操作就是 根据这个对象的描述重现 这个矩形框,然后判断x,y是否在这个矩形框的路径上 由此实现了判断鼠标是否在矩形框内。
下面是完整代码: github代码地址

<!DOCTYPE html>
<html>
<body>

<div style="width:1180px;height:800px;overflow:scroll;">
    <canvas id="myCanvas" width="1180" height="800" style="border:1px solid #d3d3d3;">
        Your browser does not support the HTML5 canvas tag.
    </canvas>
</div>
<button id="up">增大</button><button id="down">减小</button><button id="cancel">撤销</button><button id="clear">清空</button>
<script>
const c=document.getElementById("myCanvas");
const ctx=c.getContext("2d");
const scaleStep=1.05;
const minWidth=1180,minHeight=800,maxWidth=9000,maxHeight=7000;
const img=document.createElement('img');
const elementWidth=1180,elementHeight=800;
let startx,//起始x坐标
    starty,//起始y坐标
    flag,//是否点击鼠标的标志
    x,
    y,
    leftDistance,
    topDistance,
    op=0,//op操作类型 0 无操作 1 画矩形框 2 拖动矩形框
    scale=1,
	type=0;
let layers=[];//图层
let currentR;//当前点击的矩形框
img.src='xxx.png';
img.onload=function(){
   
    c.style.backgroundImage="url("+img.src+")";
    c.style.backgroundSize=`${
     c.width}px ${
     c.height}px`;
}
document.querySelector('#up').onclick=function(){
   
	if(c.width<=maxWidth&&c.height<=maxHeight){
   
		c.width*=scaleStep;
		c.height*=scaleStep;
		scale=c.height/minHeight;
		ctx.scale(scale,scale)
		c.style.backgroundSize=`${
     c.width}px ${
     c.height}px`;
		reshow()
	}
}
document.querySelector('#down').onclick=function(){
   
	if(c.width>=minWidth
  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值