canvas学习:绘制图形1(canvas尺寸)

本文介绍了canvas元素在绘制图形时出现尺寸问题的原因及解决方案。canvas有两个尺寸:元素尺寸和绘图表面尺寸。当两者不一致时,会导致图形变形。通过html设置canvas尺寸或在js中调整宽度和高度,可以避免此类问题,保持图形正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

canvas元素定义好之后,可以在其中绘制很多内容,图片,文字,更有人们都喜欢的动画!
首先使用最简单的矩形来练练手吧!

html代码:

<canvas id="mycanvas"></canvas>

css代码:

#mycanvas{width:400px;height:400px;border:1px solid #000}

js代码:

<script>
var mycanvas= document.getElementById("mycanvas");
var ctx =mycanvas.getContext('2d');
ctx.moveTo(0,0);
ctx.lineTo(100,100);
ctx.stroke();
ctx.fillStyle="#ccc";
ctx.fillRect(10,10,50,50);//此处数值没有单位
</script>

效果图:
这里写图片描述

理想的效果图应该是这样的:
这里写图片描述

原因

简直太奇怪了,一看呢大约能猜到是单位的问题,可是左右测试将px加上减去的反复操作也没能解决问题,绘图ctx.fillRect(10,10,50,50);好像是一个比例,到底是什么原因呢,终于在网上查到了一个关键的知识点:canvas元素大小与canvas绘图表面大小

canvas元素实际上有两套尺寸。一个是元素本身的大小,还有一个是元素绘图表面(drawing surface)的大小

html中单独写时,默认值为:

canvas元素本身尺寸: 300px,150px;
canvas绘图表面尺寸:300,150; //注意,canvas绘图尺寸没有单位

使用html代码定义canvas尺寸时:

<canvas id="mycanvas" width="400px" height="400px"></canvas>  //同时定义canvas元素本身尺寸和绘图表面尺寸

单独使用css定义尺寸时:

#mycanvas{width:400px;height:400px;}//只能定义元素本身尺寸,不能定义绘图表面尺寸

可见,若是只用css来定义canvas尺寸,则绘图尺寸还是默认的300*150,这个时候绘图尺寸与元素尺寸不相符,效果图就出现了变形;那么图形是如何变化的,可以如下来理解:

1 、首先元素尺寸有单位,是px;而绘图尺寸没有单位,默认情况下元素尺寸是300px*150px,绘图尺寸宽度300得到的实际长度应当为:300份 平分 元素尺寸的300px(每一份长度为1px);
2 、当绘图尺寸与元素尺寸不相符的时候,比如元素尺寸为400px*400px,默认绘图尺寸为300*150,这个时候则是如下状况:
宽度将400px分成300份,每一份得到的像素值是 (400/300)px,
高度400px 划分成150份,每一份得到的像素值是 (400/150)px,
命令 ctx.fillRect(10,10,50,50) 得到的实际宽度与高度分别是:
宽度:400px/300 * 50 = (200/3)px
高度:400px/150 * 50 =(400/3)px

综上,所以出现了上面的奇怪效果!原来计算机还是没有毛病,有问题的是自己不够理解他。(每次出现问题找不到答案,没办法时就想去 怪计算机 脑子出毛病了>.<,事实上最后总会得到一个残忍的结果,那就是脑子出毛病的是自己 :_:)

解决方法:

  1. html中定义canvas标签宽度和高度;
  2. js中写下如下代码:
    mycanvas.height=400;
    mycanvas.width=400;

总结:

  • canvas有两套尺寸,搞明白其中原理,可以根据需要放大缩小图案;但是一般绘图尺寸是和元素尺寸相匹配的,这样可读性好,方便其他人阅读理解;
  • 将尺寸写在html中,是解决上面问题的最简单方法;
  • 书写时一个带单位,一个不带单位;
  • 画图时js代码书写的是绘图尺寸,不写单位;css中定义的是元素尺寸;html中是两个尺寸同步定义;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值