前言

我们使用canvas的时候一般在canvas元素中直接设置它的width和height:

<canvas id="myCanvas" width="300" height="150">browser don't support canvas</canvas>

当然,也可以不在canvas中进行设置,直接在css样式中设置,因为canvas本身也是一个html节点

canvas{width:600px;height:300px}

设置以后,打开页面,发现canvas画布展示大小也ok,这个时候,我们在上面画一个40*40矩形,看下效果

var canvas = document.getElementById('canvas'),
context = canvas.getContext('2d'); context.fillStyle = 'cornflowerblue';
context.fillRect(0, 0, 40, 40);

运行页面,展示如下

canvas大小为600px,高为300px,没有任何问题,符合预期。但是矩形...这显然不是40*40好吧,这是80*80

为什么会发生这种情况呢?

canvas的元素大小与绘图表面大小

canvas的大小分为两种,一个是canvas作为html元素本身的尺寸,另外一个canvas作为绘图容器的绘图表面大小。

在canvas元素中设置宽高,同时指定了canvas的元素尺寸以及绘图表面的尺寸,两者相等,绘图不会有任何问题

但如果使用css设置canvas高宽,其实只是指定了canvas的元素尺寸,而不会影响canvas的绘图表面的尺寸,如果两者尺寸是一致的,并不会产生什么问题,但如果不一致,就会出现各种奇怪的问题,这个时候浏览器会有自动缩放的机制,对绘图表面进行缩放,使之适应canvas元素的尺寸。

看我们前面的例子,canvas元素以及绘图表面的尺寸是300*150,但css中设置了canvas元素尺寸是600*300,实际矩形的绘制是在300*150的绘图表面中进行绘制的,绘制完成以后要显示在canvas元素中,需要进行缩放,故产生了图形变化的问题。

在前面的例子我们打印一下日志:

var box = canvas.getBoundingClientRect(); //canvas元素的边界框
console.log(canvas.width + "---" + canvas.height) //300-150
console.log(box.width + "---" + box.height); //600-300

其中canvas对象获取的其实是绘图表面大小,box获取的是canvas元素的大小

那缩放的规则是什么?

我们用几个例子来看一下

1. css中设置canvas元素600*300,绘图表面300*100,画矩形40*40

实际矩形80*120

宽度是预期的两倍,高度是预期3倍

2. Css中设置canvas元素600*300,绘图表面200*150,画矩形40*40

实际矩形120*80

宽度是预期的3倍,高度是预期的2倍

3. Css中设置canvas元素600*300,绘图表面1200*900,画矩形60*60

实际矩形30*20

宽度是预期的1/2,高度是预期的1/3

4. Css中设置canvas元素600*300,绘图表面1800*600,画矩形60*60

实际矩形20*30

宽度是预期的1/3,高度是预期的1/2

我们用element表示canvas元素,用canvas表示绘图表面,src表示绘制的内容,dest表示展示的内容,缩放规则为:dest.size = src.size * (element.size / canvas.size)

其它

其实不仅仅是大小缩放的问题,坐标也会偏移,在canvas中画圆,如果canvas元素与绘图表面的尺寸不一致,会发现实际展示的圆心位置并不是你指定的坐标,实际展示的坐标位置同样遵循上面所述的规则。

当然,解决这些问题非常简单,就是不要使用css来指定canvas元素大小,保持canvas元素尺寸与绘图表面尺寸的一致性

canvas总结:元素大小与绘图表面大小的更多相关文章

  1. canvas元素大小与绘图表面大小

    原文链接:canvas总结:元素大小与绘图表面大小 前言 我们使用canvas的时候一般在canvas元素中直接设置它的width和height: 1 <canvas id="myCa ...

  2. 使用html元素的getBoundingClientRect来获取dom元素的时时位置和大小

    使用: var section = $('.section'):这是jquery包装的dom元素,其他前端框架返回的可能也是一个包装元素, 我们需要获得的是里面的html的dom元素 然后:secti ...

  3. Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8303098 在前文中,我们分析了应用程序窗口连 ...

  4. 有关Canvas的一点小事--鼠标绘图

    1.  如何根据鼠标位置获取canvas上对应位置的x,y. 2.  canvas的图糊了,设置宽和高的方式不对. 3.鼠标绘图代码 之前听说过canvas这个元素,但是实际上并没有深入了解过.不过日 ...

  5. HTML5 canvas 内部元素事件响应

    HTML5 canvas 内部元素事件响应 isPointInPath 只能拿当前上下文的路径 重画每个部分 都isPointInPath判断

  6. SQL Server 如何设置数据库的默认初始大小和自动增长大小

    我们在SQL Server中新建数据库的时候,可以选择数据库文件及日志文件的初始大小.自动增长大小和最大大小,如下图所示: 可以通过设置更改数据库初始大小.自动增长大小和最大大小: 但是其实在SQL ...

  7. C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变

    class Program { static void Main(string[] args) {//G:\zhyue\backup\projects\Test\ConsoleApplication1 ...

  8. 修改帧大小和socket缓冲区大小(转)

    修改帧大小和socket缓冲区大小 MTU (最大传输单元)的缺省值为1500. 通过下面命令将其改为9000(jumbo frame) % ifconfig eth0 mtu 9000 socket ...

  9. AS3舞台的大小,可视区域大小及SWF文件的原始尺寸大小

    AS3舞台的大小,可视区域大小及SWF文件的原始尺寸大小三者之间没有什么关系. 当前可视区域:stage.stageWidth,stage.stageHeight.SWF文件编译后的原始尺寸大小:lo ...

随机推荐

  1. 升级10.11后使用CocoaPod出现-bash: pod: command not found 解决办法-备

    升级10.11后,运行pod命令出现: -bash: pod: command not found 解决办法: sudo gem install -n /usr/local/bin cocoapods ...

  2. hdu 3461 Code Lock

    http://acm.hdu.edu.cn/showproblem.php?pid=3461 并差集和幂取模 这道题主要是求不可操作区间. #include <cstdio> #inclu ...

  3. Codeforces 366C Dima and Salad

    http://codeforces.com/problemset/problem/366/C 题意:在一个冰箱里有n种水果,并且这些水果每一种都有一个美味度和一个卡路里的属性, 小明要从这些水果中选出 ...

  4. windows下删除Linux

    在Windows下删除Linux系统的方法(附修复MBR的工具下载) 我的电脑安装了双系统,Windows和Linux,不过由于Linux在最近一段时间内不会使用,所以我打算删除Linux.   删除 ...

  5. 【转】android4.1.2 CTS测试总结

    原文网址:http://blog.csdn.net/bboyliaoye/article/details/17299259 公司客户的产品要过google GMS认证,首先要过的就是兼容性测试(CTS ...

  6. 关于部分应用无法向POJ提交代码的解决方案

    有个一年没做过题了,最近有骚年反映他们的VirtualJudge无法做POJ的题目,一直都是JudgeError状态. 于是登录到那个VJudge试了试,代码的确一直无法提交成功,他们的服务器发回50 ...

  7. 【BBST 之伸展树 (Splay Tree)】

    最近“hiho一下”出了平衡树专题,这周的Splay一直出现RE,应该删除操作指针没处理好,还没找出原因. 不过其他操作运行正常,尝试用它写了一道之前用set做的平衡树的题http://codefor ...

  8. poj 3190 Stall Reservations 贪心 + 优先队列

    题意:给定N头奶牛,每头牛有固定的时间[a,b]让农夫去挤牛奶,农夫也只能在对应区间对指定奶牛进行挤奶, 求最少要多少个奶牛棚,使得在每个棚内的奶牛的挤奶时间不冲突. 思路:1.第一个想法就是贪心,对 ...

  9. Eat Candy(暴力,水)

    Eat Candy Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 6[Submit][Status][Web Board] Des ...

  10. Jquery面试题整合

    来自棱镜学院-在线IT教育     www.prismcollege.com 一.Jquery測试题 以下哪种不是jquery的选择器?(单选) A.基本选择器 B.后代选择器 C.类选择器 D.进一 ...