• HTML5的canvas元素使用JavaScript画图;
  1. <canvas width="600" height="400"> </canvas>

canvas画图的基本框架

  • 画布默认背景颜色为白色,大小为300*150;
  • 若要设置画布大小,不建议在style的样式设置尺寸,效果相当于将原本300*150的画布等比例放大缩小,包括里面画的图;
  • 建议在元素本身设置;
  1. <body>
  2. <!-- 准备画布 -->
  3. <canvas width="600" height="400"></canvas>
  4. <!-- 准备绘制工具 -->
  5. <!-- 利用工具绘图 -->
  6. <script>
  7. // 获取元素
  8. var myCanvas=document.querySelector('canvas');
  9. // 获取上下文,绘制工具箱
  10. var ctx=myCanvas.getContext('2d');
  11. // 移动画笔
  12. ctx.moveTo(100,100);
  13. // 绘制直线(轨迹,绘制路径)
  14. ctx.lineTo(200,100);
  15. // 描边
  16. ctx.stroke();
  17. </script>
  18. </body>

关于线条的问题

  1. 默认宽度为1px
  2. 默认颜色黑色
  3. 但是显示是灰色,2px宽度,原因是对其点是线的中心位置,会把线分成两个0.5px,显示的会是不饱和增加宽度;
  4. 解决方法:前或后移动0.5px即可;
  • 当要画多条不同样式的平行线时,存在样式覆盖问题,需要开辟新路径;
  1. <body>
  2. <canvas width="600" height="400"></canvas>
  3. <script>
  4. var myCanvas=document.querySelector("canvas");
  5. var ctx=myCanvas.getContext("2d");
  6. // 画平行线
  7. // 蓝色 10px
  8. ctx.moveTo(100,100);
  9. ctx.lineTo(200,100);
  10. ctx.strokeStyle="blue";
  11. ctx.lineWidth=10;
  12. ctx.stroke();
  13. // 红色 20px
  14. ctx.beginPath();//开辟新路径
  15. ctx.moveTo(100,200);
  16. ctx.lineTo(200,200);
  17. ctx.strokeStyle="red";
  18. ctx.lineWidth=20;
  19. ctx.stroke();
  20. // 绿色 30px
  21. ctx.beginPath();//开辟新路径
  22. ctx.moveTo(100,300);
  23. ctx.lineTo(200,300);
  24. ctx.strokeStyle="green";
  25. ctx.lineWidth=30;
  26. ctx.stroke();
  27. </script>
  28. </body>
  • 当绘制图形,需要填充颜色时,使用fill()函数;默认填充颜色为黑色;
  1. <body>
  2. <canvas width="600" height="400"></canvas>
  3. <script>
  4. var myCanvas = document.querySelector("canvas");
  5. var ctx = myCanvas.getContext("2d");
  6. // 绘制一个三角形
  7. ctx.moveTo(100,100);
  8. ctx.lineTo(200,100);
  9. ctx.lineTo(200,200);
  10. ctx.lineTo(100,100);
  11. // 描边
  12. ctx.stroke();
  13. // 填充
  14. ctx.fill();
  15. </script>
  16. </body>
  • 当绘制封闭图形时,会出现起始点和lineTo的结束点无法完全闭合,有缺角
  • 解决方法:使用canvas的自动闭合路径closePath();
  1. <canvas width="600" height="400"></canvas>
  2. <script>
  3. var myCanvas = document.querySelector("canvas");
  4. var ctx = myCanvas.getContext("2d");
  5. // 绘制一个三角形
  6. ctx.moveTo(100,100);
  7. ctx.lineTo(200,100);
  8. ctx.lineTo(200,200);
  9. // 起始点和lineTo的结束点无法完全闭合,有缺角;
  10. // ctx.lineTo(100,100);
  11. // 使用canvas自动闭合
  12. ctx.closePath();
  13. ctx.lineWidth=10;
  14. // 描边
  15. ctx.stroke();
  16. </script>

填充规则(非零环绕)

  • 看一块区域是否被填充,从区域画一条直线,看和这条直线相交的轨迹;
  • 如果是顺时针就+1,逆时针就-1;
  • 计算所有轨迹的和,如果非0就填充,是0就不填充;
  • 如上图1区域:轨迹和为1,填充;2区域:轨迹和为2,填充;3区域:轨迹和为0,不填充;

画虚线

  1. <script>
  2. var myCanvas = document.querySelector("canvas");
  3. var ctx = myCanvas.getContext("2d");
  4. // 画线
  5. ctx.moveTo(100.5, 100.5);
  6. ctx.lineTo(300, 100.5);
  7. ctx.setLineDash([5,10,15]);
  8. ctx.stroke();
  9. </script>

  • 画虚线:通过数组描述虚线的排列方式;
  • 获取虚线的排列方式,获取的是不重复的那一段的排列方式;
  • 例如:console.log(ctx.setLineDash());获取的是5 10 15 5 10 15;
  • 括号里数字为[数字长度,空格长度,数字长度,空格长度…];

画渐变矩形(例如黑白渐变)

  • 主要利用for循环,逐渐改变线条颜色,矩形通过多个线条拼凑;
  1. <body>
  2. <canvas width="600" height="400"></canvas>
  3. <script>
  4. var myCanvas = document.querySelector("canvas");
  5. var ctx = myCanvas.getContext("2d");
  6. // 绘制一个矩形
  7. // ctx.moveTo(100, 100);
  8. // ctx.lineTo(255,100);
  9. // ctx.lineWidth='30';
  10. // // 颜色填充
  11. // ctx.strokeStyle='#fff';
  12. // // 从黑到白
  13. // ctx.stroke();
  14. // 线是由点构成的
  15. ctx.lineWidth = '30';
  16. //起始位置
  17. // ctx.moveTo(100, 100);
  18. for (var i = 0; i < 255; i++) {
  19. //画255条1px长的线;
  20. //每次开辟一条新路径,不然会样式覆盖
  21. ctx.beginPath();
  22. //起始位置
  23. ctx.moveTo(100 + i - 1, 100);
  24. //结束位置
  25. ctx.lineTo(100 + i, 100);
  26. ctx.strokeStyle = 'rgb(' + i + ',' + i + ',' + i + ')';
  27. //描边
  28. ctx.stroke();
  29. }
  30. </script>
  31. </body>

网格、坐标系、点的绘制

  • 网格即多条线按一定的规则排列组成;
  • 坐标系绘制两条相互垂直的有向线段,箭头自己计算画三角形,进行填充即可;
  • 点的绘制
  • 需要注意的是,点的坐标要先定下来,用对象存储
  • 点的绘制就是以点的坐标为中心,绘制一个正方形,进行填充,点的大小可以控制;
  1. <body>
  2. <canvas width="600" height="400"></canvas>
  3. <script>
  4. var myCanvas = document.querySelector('canvas');
  5. var ctx = myCanvas.getContext('2d');
  6. //绘制点
  7. //点的尺寸
  8. //以坐标中心绘制点
  9. //点坐标
  10. var coordinate = {
  11. x: 146,
  12. y: 357
  13. }
  14. //点尺寸
  15. var dottedSize = 6;
  16. ctx.moveTo(coordinate.x - dottedSize / 2, coordinate.y - dottedSize / 2);
  17. ctx.lineTo(coordinate.x + dottedSize / 2, coordinate.y - dottedSize / 2);
  18. ctx.lineTo(coordinate.x + dottedSize / 2, coordinate.y + dottedSize / 2);
  19. ctx.lineTo(coordinate.x - dottedSize / 2, coordinate.y + dottedSize / 2);
  20. ctx.closePath();
  21. ctx.fill();
  22. </script>
  23. </body>

图形绘制

  • 参数(x,y)为坐标,(w,h)为宽高;

弧度绘制

  • 什么是弧度?
  • 一种长度的描述单位,一个圆有2Π个弧度,一个角度等于Π/180弧度
  1. <body>
  2. <canvas width="600" height="400"></canvas>
  3. <script>
  4. var myCanvas = document.querySelector('canvas');
  5. var ctx = myCanvas.getContext('2d');
  6. //绘制圆弧
  7. //1.确定圆心
  8. //2.确定圆的半径
  9. //3.确定起始位置和结束位置,确定圆弧长度和位置
  10. //4.确定绘制方向(一般是默认的顺时针)direction
  11. var w=ctx.canvas.width;
  12. var h=ctx.canvas.height;
  13. //在中心位置画一个半径150px的圆弧右下角(横坐标,纵坐标,半径,起始角度,结束角度)
  14. ctx.arc(w/2,h/2,150,0,Math.PI/2);
  15. ctx.stroke();
  16. </script>
  17. </body>
  • 绘制扇形时,圆心的确定要放在画弧形的前面;

绘制文本

  • ctx.font='微软雅黑’设置字体;
  • strokeText(text,x,y,maxWidth);
  • fillText(text,x,y,maxWidth);
  • text即要绘制的文本;
  • x,y为文本绘制的坐标(文本左下角);
  • maxWidth设置文本的最大宽度,可选参数;
  • ctx.textAlign文本水平对齐方式,相对绘制坐标来说;
  • 可取值有 left center right start默认 end
  • ctx.direction属性css(rtl ltr)start和end与此相关;
  • 若为ltr则start和left表现一致;
  • 若为rtl则start和right表现一致;
  • ctx.textBaseline设置基线(垂直对齐方式);
  • top文本的基线处于文本的正上方,并且有一段距离;
  • middle文本的基线处于文本的正中间
  • bottom文本的基线处于文本的正下方,并且有一段距离;
  • hanging文本的基线处于文本的正上方,并且与文本粘合;
  • alphabetic默认值,文本的基线处于文本的正下方,并且穿过文字;
  • ideographic和bottom相似,但是不一样;
  • measureText()获取文本的宽度obj.width;
  • 注意
  • 文本样式设置要在文本描边或者填充之前;
  • 左右对齐方式的对齐基准是文字描绘的起始坐标;

图片绘制

  • drawImage()
  • 三个参数drawImage( image, x , y);
  1. img图片对象、canvas对象、video对象
  2. x,y图像绘制的左上角
  • 五个参数drawImage( image, x , y , w, h);
  • w,h分别为图形的宽高设置,是缩放,不是截取,其余参数意义同上;
  • 九个参数drawImage( image, x , y , w , h, x1, y1 ,w1, h1);
  • image是图片对象,x,y是图片定位的坐标(即原图片上图片从哪开始截取),w,h是在原图片上的图片截取区域大小,x1,y1是绘制在画布上的坐标,w1,h1是绘制图片的大小,绘制的图片不是裁剪而是前面截取图片的缩放

canvas的2d转换

  • 移动, translate(x,y);移动的是坐标轴,不是绘制的内容
  • 缩放,scale(0.5,1),表示横坐标缩放0.5倍,纵坐标缩放1倍,缩放的是坐标轴,不是绘制的内容
  • 旋转,rotate(),旋转中心默认是坐标原点;

canvas画布基本知识点总结的更多相关文章

  1. 软件项目技术点(6)——结合鼠标操作绘制动态canvas画布

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 我们创建一个类封装了所有鼠标需要处理的事件. export class MouseEventInfo { el: HTMLElemen ...

  2. html 5 canvas画布整理

    1. 创建canvas画布<canvas id="myCanvas" width="800" height="800" >< ...

  3. 用html5的canvas画布绘制贝塞尔曲线

    查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  4. 【读书笔记《Android游戏编程之从零开始》】12.游戏开发基础(Canvas 画布)

    1.Canvas 画布 画布类 Canvas 封装了图形和图片绘制等内容,此类常用的函数说明如下: drawColor(int color) 作用:绘制颜色覆盖画布,常用于刷屏 参数:颜色值,也可用十 ...

  5. 关于使用Css设置Canvas画布大小的问题

    问题分析 我们在调整画布大小时,希望画布中的图形保持不变,只是改变画布本身的大小.但是如果使用Css设置画布大小,则会出现问题. 问题描述 如果使用Css设置Canvas画布的大小,则导致画布按比例缩 ...

  6. Particles.js基于Canvas画布创建粒子原子颗粒效果

    文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...

  7. 自学HTML5第四节(canvas画布详解)

    canvas画布好像可是说是HTML5的精华了,一定要学好,嗯嗯,绚丽的东西就要从基础的开始.... 先看看啥玩意叫做canvas 什么是 Canvas? HTML5 的 canvas 元素使用 Ja ...

  8. “canvas画布仿window系统自带画图软件"项目的思考

    "canvas画布仿window系统自带画图软件"项目的思考 首先贴上DEMO图,并没有美化效果.对UI有要求的,请自带补脑技术. 思考一 在做项目的过程中,我发现"工具 ...

  9. 更新——Canvas画布动画效果之实现倒计时

    Hello,大家好! 小W复活啦!继续欢乐的给大家更博,输送新知识~~ 不开玩笑啦!秒进正题~~~ 上次更博,小W给大家介绍了Canvas画布的基础部分,以及实现了一个由7*10点阵图显示的倒计时的基 ...

随机推荐

  1. 论super().__init__()的用法

    当我们调用 super() 的时候,实际上是实例化了一个 super 类. super 是个类,既不是关键字也不是函数等其他数据结构,该对象就是专门用来访问父类中的属性的(严格按照继承的关系). -- ...

  2. 转 6 jmeter元件的作用域与执行顺序

    6 jmeter元件的作用域与执行顺序   元件的作用域 配置元件(config elements)会影响其作用范围内的所有元件.前置处理程序(Per-processors)在其作用范围内的每一个sa ...

  3. 请不要继续将数据库称为 CP 或 AP - 掘金 https://juejin.im/post/6844903878102614030

    请不要继续将数据库称为 CP 或 AP - 掘金 https://juejin.im/post/6844903878102614030

  4. Linux网络数据包的揭秘以及常见的调优方式总结

    https://mp.weixin.qq.com/s/boRWlx1R7TX0NLuI2sZBfQ 作为业务 SRE,我们所运维的业务,常常以 Linux+TCP/UDP daemon 的形式对外提供 ...

  5. C++学习之STL(一)vector

    前言 C++ Primer Plus读书笔记(三)复合类型 中已经简单介绍过vector是什么,这个系列主要是介绍STL特性. 声明 vector<ElemType> c; //创建一个空 ...

  6. loj10087

    Southwestern Europe 2002,题面可参考 POJ 1201. 给定 n 个闭区间 [a_i,b_i] 和 n 个整数c_i .你需要构造一个整数集合Z ,使得对于任意i (1< ...

  7. Elasticsearch如何保证数据不丢失?

    目录 如何保证数据写入过程中不丢 直接落盘的 translog 为什么不怕降低写入吞吐量? 如何保证已写数据在集群中不丢 in-memory buffer 总结 LSM Tree的详细介绍 参考资料 ...

  8. 统一资源定位符 (URL)

    统一资源标识符(uniform/universal resource identifier,URI)用于表示Internet中的资源(通常是文档).URI 主要用于两种目的,其一是命名资源,尽管此时把 ...

  9. Java泛型中的通配符T,E,K,V

    Java泛型中的通配符T,E,K,V 1.泛型的好处 2.泛型中的通配符 2.1 T,E,K,V,? 2.2 ?无界通配符 2.3 上界通配符 < ? extends E> 2.4 下界通 ...

  10. centos 7.6安装WeADMIN ITOSS步骤

    0.升级系统并安装必要的软件 yum -y update yum -y install wget unzip nmap 1.下载JDK jdk下载地址:http://www.oracle.com/te ...