扫码关注官方订阅号
欢迎选择我的课程,让我们一起见证您的进步~~
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <canvas id="mycanvas" width="400" height="400" style="border: 1px solid #0E2D5F"></canvas> <script> var canvasDom=document.getElementById("mycanvas"); var ctx=canvasDom.getContext("2d"); var rectWidth=100; var rectHeight=100; function drawRect(centerX,centerY,scaleX,scaleY){ ctx.clearRect(0,0,canvasDom.width,canvasDom.height); ctx.save(); ctx.translate(centerX,centerY); ctx.scale(scaleX*2,scaleY*2); ctx.fillStyle="#0E2D5F"; ctx.fillRect(-rectWidth/2,-rectWidth/2,rectWidth,rectHeight); ctx.restore(); ctx.save(); ctx.translate(centerX,centerY); ctx.scale(scaleX,scaleY); ctx.fillStyle="#ffffff"; ctx.fillRect(-rectWidth/2,-rectWidth/2,rectWidth,rectHeight); ctx.restore(); } drawRect(canvasDom.width/2,canvasDom.height/2,1,1); </script> </body> </html>
var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); canvas.width = 1200; canvas.height = 900; var scale = 1.3, _width = 100, _height = 100, _left = 200, _top = 200 ; context.strokeRect(_left,_top,_width,_height); context.translate((_left + _width/2) - (_width / 2) * scale, (_top + _height/2) - (_height / 2) * scale); context.scale(scale, scale); context.strokeRect(0, 0, _width, _height);
效果是正常了,但是总觉得有点别扭,大神帮我看看行不行??
可以用 css
css
<p class="square"> </p>
.square{ width:100px; height:100px; border:1px solid green; margin:100px; -webkit-transition:all 1s ease; transition:all 1s ease; -webkit-transform-origin:center center; transform-origin:center center; } .square:hover{ -webkit-transform:scale(1.3); transform:scale(1.3); }
scale和rotate这样的方法都是针对坐标原点(默认左上角)进行操作的。所以在你的第一次scale两倍的时候,正方形整体向右下角放大了两倍。
所以如果你想让正方形在原来的位置放大,那么你需要将坐标原点调整(translate)到正方形的中心点,然后再进行放大。这里的调整是根据放大前正方形的大小来进行的。
为了不影响之后的其他绘制操作,一般我们在做这样的原点中心调整前,会将原点的状态保存下来
ctx.save()
在你的绘制(需要translate原点)完成后,再将原点恢复到你的绘制动作之前
ctx.restore()
默认是左上角为基准点的。如果要实现LZ的效果,可以通过css改变transform-origin,或者canvas把小正方形中心点作为原点绘图。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
效果是正常了,但是总觉得有点别扭,大神帮我看看行不行??
可以用
cssscale和rotate这样的方法都是针对坐标原点(默认左上角)进行操作的。所以在你的第一次scale两倍的时候,正方形整体向右下角放大了两倍。
所以如果你想让正方形在原来的位置放大,那么你需要将坐标原点调整(translate)到正方形的中心点,然后再进行放大。这里的调整是根据放大前正方形的大小来进行的。
为了不影响之后的其他绘制操作,一般我们在做这样的原点中心调整前,会将原点的状态保存下来
在你的绘制(需要translate原点)完成后,再将原点恢复到你的绘制动作之前
默认是左上角为基准点的。
如果要实现LZ的效果,可以通过css改变transform-origin,或者canvas把小正方形中心点作为原点绘图。