canvas画布的坐标系

canvas画布是通过HTML的标签嵌入到web页面中的,它支持通过CSS结构来设置canvas的一些样式。比如通过style来设置canvas的width,height。这个设置的画布的表象,同时canvas标签还有两个属性width,height,这个用来设置canvas的坐标系的大小。

看了这个不明白?

好吧,我觉得用语言说也说不太明白,还得配合代码例子才能讲明白。html,body{

height:100%;

overflow: hidden;

}

body{

margin:0;

padding:0;

}

.stage{

width:100%;

height:100%;

box-sizing:border-box;

border:1px solid #e74c3c;

}

var cvs=document.getElementById("mystage");

var ctx=cvs.getContext("2d");

console.log(cvs.width);

console.log(cvs.height);

ctx.moveTo(0,0);

ctx.lineTo(200,200);

ctx.strokeStyle="#2A35A4";

ctx.strokeWidth="5px";

ctx.lineCap="round";

ctx.stroke();

这段代码中canvas标签有一个class样式stage,stage结合body的css样式,目的是设置画布的大小和浏览器窗口一样大。通过这些设置,canvas听话的达到了和浏览器一样的大小。然后canvas标签的属性上width,height的大小是200,200。注意这里是没有单位的。当然你设置单位也一样,比如“px”,"em",但他们的效果跟没有单位的纯数值是一样的。这里的单位跟svg的坐标系一样,属于相对单位。看到这里你应该若有所思,那么canvas虽然看上去的大小是跟浏览器窗口一样大的,可他的坐标系的大小只有200*200的大小。那么我们moveTo(0,0) ,lineTo(200,200)所画的这条直线应该是从左上角到右下角。结果也是这样。

代码运行结果如下:

写了个Demo:canvas坐标系示例。你应该在demo中通过改变浏览器的大小来观察,canvas画布的大小是跟随浏览器的宽度进行变化的一个矩形。但是canvas的坐标系的大小却始终是200*200。

这里我们就应该理解canvas的坐标系是的单位是相对单位,并且canvas的坐标系的刻度是通过类似scale缩放的方式映射到实际的我们通过style设置的大小。

canvas的width,height可以不设置,不设置的时候默认大小是宽300,高150的坐标系。

上面我们画的斜线不能反映画布坐标系和展现的缩放效果,我们在上面的代码中绘制一个圆形,来体现其坐标系和渲染的canvas舞台的缩放关系。

var cvs=document.getElementById("mystage");

var ctx=cvs.getContext("2d");

console.log(cvs.width);

console.log(cvs.height);

ctx.moveTo(0,0);

ctx.lineTo(200,200);

ctx.strokeStyle="#2A35A4";

ctx.strokeWidth="5px";

ctx.lineCap="round";

ctx.stroke();

ctx.closePath();

ctx.beginPath();

ctx.strokeStyle="#D15815";

ctx.arc(100,100,50,0,360);

ctx.stroke();

我们在代码中添加了一个圆形的绘制。注意其中的closePath,beginPath的使用,是为了结束上一个斜线的stroke路径的结束,然后开始下一个圆形stroke的绘制。如果不加这两个路径的操作,圆形和斜线的颜色会变成一样,并且圆形会和斜线的结束或开始多出一条直线相连接。

因为我们设置的canvas的坐标系是200*200的大小,所以如果canvas的css设置的舞台的大小也是一个正方形,那么他它应该是一个正圆,而如果canvas的舞台大小是一个长方形,那么这个通过arc绘制的圆形会变成以一个椭圆。

正如我们所料,结果如下:

我们把浏览器缩放成一个长方形,圆形变成了一个椭圆。这也说明了canvas的坐标系和舞台之间的scale缩放映射关系。

canvas的坐标系跟svg的坐标的原理是一样的,svg是通过svg 的preserveAspectRatio和viewBox来实现坐标系和舞台的缩放映射的。当然,我承认,svg的缩放貌似更高级点,因为它有选择是变形缩放还是保持宽高比的选项。canvas只有变形缩放这一个缩放方式。

说道这里,我们想起了微信小程序里面的canvas标签,微信小程序的canvas没有设置width,height属性的功能,JS的api也没有提供这个功能,它貌似把坐标系和舞台设置同一个坐标了,并且微信小程序里面无法操作“DOM”元素,通过类似“getBoundingClientRect”的方式获取元素宽高,所以在微信小程序里面绘图,只能设置canvas的大小为固定的宽高,比如“300*150”,并且这个宽高就是坐标系和舞台的大小。没有坐标系和舞台的缩放映射关系,我们没有办法让微信小程序里面的canvas的渲染大小自适应手机的大小。这个问题相比困扰着很多想要在微信小程序里面实现图表绘制功能的开发人员。不知道微信什么时候能够对这个问题作出处理或提供解决方案,且翘首以待。

html 重置画布坐标系,H5中canvas的坐标系(画布初始)相关推荐

  1. H5中canvas和svg绘图方式介绍

    在HTML5中包括了两种绘图方式,canvas和svg(矢量呈现),而与canvas不同的是,svg是一种XML标记语言,它既可以单独保存以".svg"为后缀的文件在浏览器中打开显 ...

  2. H5中canvas标签制作在线画板

    1.介绍 左键点击下移动开始画图.放开鼠标不在画图. 2.重要使用理论 query的使用: 鼠标的按下mousedown 鼠标的移动mousemove 鼠标的放开 mouseup 3.程序 1 < ...

  3. 【Android UI】Canvas 画布 ⑨ ( Canvas 绘图坐标系平移实例 )

    文章目录 一.Canvas 绘图坐标系平移实例 二.代码示例 Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ; 其中 图层栈 又称为 Layer 栈 ; Canv ...

  4. 用h5的canvas实现动画的泡沫

    效果图一 代码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

  5. matlab三维 旋转矩阵,matlab中的三维坐标系与旋转

    1. matlab中的三维坐标系 matlab中的三维坐标系是使用的右手坐标系: 输入以下代码: >> plot3(0,0,0) >> xlabel('axis X') > ...

  6. matlab中如何转动三维图_matlab中的三维坐标系与旋转

    1. matlab中的三维坐标系 matlab中的三维坐标系是使用的右手坐标系: 输入以下代码: >> plot3(0,0,0) >> xlabel('axis X') > ...

  7. 关于H5中的Canvas API的探索

    Canvas API 是H5中比较炫酷的一部分内容.可以通过它动态的生成和展示图形.图表.图像以及动画.下面我将学习一下Canvas API. 最后有书籍和源码. 一.概述: 1.基本元素: 在网页上 ...

  8. android 清空画布内容,Android,canvas:如何清除(删除)位于surfaceView中的画布(=位图)的内容?...

    为了制作一个简单的游戏,我使用了一个模板来绘制带有位图的画布,如下所示: private void doDraw(Canvas canvas) { for (int i=0;i<8;i++) f ...

  9. html中canvas动画游戏显示,【Fes】基于canvas的前端动画/游戏入门(一)

    前言 本系列虽说是基础教程,但这是相对动画/游戏领域来说,在前端领域算是中级教程了,不适合前端小白或萌新.阅读前请确保自己对前端三大件(JavaScript+CSS+HTML)的基础已经十分熟悉,而且 ...

最新文章

  1. python表单防重复提交_防止表单重复提交的几种策略
  2. bcrypt如何内置盐?
  3. unlink与close关系
  4. 如何删除 AWS 资源以及关闭账户(来自亚马逊官方提供文档,记录一下方便查看)
  5. px, dip, dp,sp使用场景
  6. javafx中的tree_JavaFX中的塔防(5)
  7. ubuntu 修改旋转屏幕显示方向 恢复正常模式
  8. 请问asp.net网页里能显示tiff格式的图片吗?
  9. 文具订购(【CCF】NOI Online能力测试 入门组第一题)
  10. JS根据分数,计算名次(分数相同名次相同)
  11. Android Activity类详解
  12. 不一样的摊余成本法债基—终篇
  13. C++中rapidxml用法及例子
  14. 近期14个“AI产品经理”职位JD推荐(覆盖北京、上海、深圳、成都、重庆、杭州)
  15. 穷建站(二):在DnsPod中为申请的tk域名进行域名解析
  16. 基于Java的旅游门票管理系统JAVA MYSQL
  17. 阿龙学堂-启动spark任务的两种方式
  18. 特斯拉Model 3设计缺陷导致底盘经常堆积厚厚泥沙
  19. 基于spring cloud的阿峰微服务0到0.5历程
  20. 大数据阶段项目之项目介绍

热门文章

  1. linux ntfs双系统安装,安装Windows和Linux双系统
  2. Vscode c与c++编译环境配置(.vscode),看这一篇就够了
  3. 蓝牙基带分配编号(设备/服务类型)详解
  4. 阿里执行副主席蔡崇信投资NBA篮网队;工信部约谈运营商,不得限制用户资费选择丨价值早报
  5. 新电脑安装Ubuntu的血泪史:UEFI+GPT模式下在同一块固态硬盘上安装win10和Ubuntu16.04双系统
  6. 【system】利用Diskpart命令(cmd)解决装机分区格式不对,增大C盘空间问题
  7. 计算机动画主要学什么,动画专业主要学什么?
  8. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
  9. Unity_滚动文本字幕
  10. 1.5 synchronized类锁和对象锁快速区别