canvas

<canvas>元素

<canvas id="tutorial" width="150" height="150"></canvas>

<canvas>元素只有两个属性,widthheight。这些都是可选的,也可以使用DOM 属性设置。如果未指定no widthheight属性,则画布最初将为300像素宽和150像素高。可以通过CSS任意调整元素的大小

渲染上下文

素创建一个固定大小的绘图表面暴露一个或多个渲染上下文,其被用于创建和操纵所示的内容

getContext(),用于获得呈现上下文和它的绘制功能。getContext()采用一个参数,即上下文的类型。对于2D图形(例如本教程介绍的图形

语法:

var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');

浏览器兼容性

通过简单地测试getContext()方法的存在来以编程方式检查支持

var canvas = document.getElementById('tutorial');if (canvas.getContext) {var ctx = canvas.getContext('2d');// drawing code here
} else {// canvas-unsupported code here
}

小案例

<!DOCTYPE html>
<html><head><meta charset="utf-8"/><title>Canvas tutorial</title><script type="text/javascript">function draw() {var canvas = document.getElementById('tutorial');if (canvas.getContext) {var ctx = canvas.getContext('2d');}}</script><style type="text/css">canvas { border: 1px solid black; }</style></head><body onload="draw();"><canvas id="tutorial" width="150" height="150"></canvas></body>
</html>

通过侦听load文档上的事件来完成的。这个功能,或者一个喜欢它,也可以使用所谓的window.setTimeout()window.setInterval()或任何其他事件处理程序,只要页面已经被第一次加载。

绘制两个相交的矩形,其中一个具有alpha透明度。

<!DOCTYPE html>
<html><head><meta charset="utf-8"/><script type="application/javascript">function draw() {var canvas = document.getElementById('canvas');if (canvas.getContext) {var ctx = canvas.getContext('2d');ctx.fillStyle = 'rgb(200, 0, 0)';ctx.fillRect(10, 10, 50, 50);ctx.fillStyle = 'rgba(0, 0, 200, 0.5)';ctx.fillRect(30, 30, 50, 50);}}</script></head><body onload="draw();"><canvas id="canvas" width="150" height="150"></canvas></body>
</html>

网格

可以吧canvas元素看成指定的片区域把区域内看成有网格左上到右上文x轴

左上到左下为y轴(x,y);如此表示坐标

绘制矩形的三个函数

``仅支持两种基本形状:矩形和路径(由线连接的点的列表)。所有其他形状必须通过组合一个或多个路径来创建。

fillRect(x, y, width, height)

绘制一个填充的矩形。

strokeRect(x, y, width, height)

绘制矩形轮廓。

clearRect(x, y, width, height)

清除指定的矩形区域,使其完全透明。

xy指定矩形左上角在画布上的位置(相对于原点)。widthheight提供矩形的大小。

function draw() {var canvas = document.getElementById('canvas');if (canvas.getContext) {var ctx = canvas.getContext('2d');ctx.fillRect(25, 25, 100, 100);ctx.clearRect(45, 45, 60, 60);ctx.strokeRect(50, 50, 50, 50);}
}

绘制路径

路径是由线段连接的点的列表,这些线段可以具有不同的形状(弯曲或不弯曲),不同的宽度和不同的颜色。路径甚至子路径都可以关闭

**思路过程 **

  1. 首先,创建路径。
  2. 然后,您可以使用[绘图命令]来绘制路径。
  3. 创建路径后,您可以描画或填充路径以进行渲染。

操作步骤方法

  • beginPath()

    创建一个新路径。创建之后,将来的绘图命令将直接进入路径并用于构建路径。

    路径方法

    语法:

    void ctx.beginPath();
    • 例子

    创建两个路径

    再开始前调用beginPath()方法

    <!DOCTYPE html>
    <html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="150" height="150"></canvas>
    </body>
    <script type="application/javascript">const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');// First pathctx.beginPath();ctx.strokeStyle = 'blue';ctx.moveTo(20, 20);ctx.lineTo(200, 20);ctx.stroke();// Second pathctx.beginPath();ctx.strokeStyle = 'green';ctx.moveTo(20, 20);ctx.lineTo(120, 120);ctx.stroke();
    </script>
    </html>
    

    结果:

    为对象设置不同路径的方法。

  • closePath()

    尝试从当前点到当前子路径的起点添加一条直线。如果形状已经闭合或只有一个点,则此功能不执行任何操作。此方法不会直接在画布上绘制任何内容

    向路径添加一条直线,转到当前子路径的起点。

    • 例子

      <!DOCTYPE html>
      <html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
      </body><script type="application/javascript">const canvas = document.getElementById('canvas');
      const ctx = canvas.getContext('2d');ctx.beginPath();
      ctx.moveTo(20, 140);
      ctx.lineTo(120, 10);
      ctx.lineTo(220, 140);
      ctx.closePath();
      ctx.stroke();</script>
      </html>

    此例子中closePath()方法创建三角形的底面,该方法会自动连接形状的第一个点和最后一个点。

    结果如图:

​ * 第二个案例:

<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');ctx.beginPath();
ctx.arc(240, 20, 40, 0, Math.PI);
ctx.moveTo(100, 20);
ctx.arc(60, 20, 40, 0, Math.PI);
ctx.moveTo(215, 80);
ctx.arc(150, 80, 65, 0, Math.PI);
ctx.closePath();
ctx.lineWidth = 6;
ctx.stroke();</script>
</html>

结果:

stroke()

通过抚摸轮廓来绘制形状。stroke() 方法会实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色。

fill()

​ 填充图形

通过填充路径的内容区域绘制实体形状。

语法:

void ctx.fill([fillRule]);
void ctx.fill(path [, fillRule]);
  • fillRule

    • “nonzero”:非零缠绕规则。默认规则。
    • **"evenodd":奇数缠绕规则。
  • path

    • Path2D填补的道路。
    • ​ 例子

    填充矩形本示例使用该fill()方法填充矩形。

<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
ctx.rect(10, 10, 150, 100);ctx.fill();</script>
</html>

运行结果:

具体步骤

第一步:

调用beginPath()。在内部,路径存储为一起形成形状的子路径(线,弧等)的列表。每次调用此方法时,列表都会重置,我们可以开始绘制新形

第二步:

调用实际指定要绘制路径的方法

第三步:

(可选步骤)是closePath()。此方法尝试通过绘制从当前点到起点的直线来闭合形状。如果形状已经关闭或列表中只有一个点,则此功能不执行任何操作。

画一个三角形:

function draw() {var canvas = document.getElementById('canvas');if (canvas.getContext) {var ctx = canvas.getContext('2d');ctx.beginPath();ctx.moveTo(75, 50);ctx.lineTo(100, 75);ctx.lineTo(100, 25);ctx.fill();}
}

移动笔

该功能是一个会成为上述路径列表的一部分moveTo()您可能最能想到的是将笔或铅笔从一张纸上的一个位置提起,然后放在另一张纸上。

moveTo(x, y)

移动笔由指定的坐标xy

初始化或beginPath()调用画布时,通常将需要使用该moveTo()函数将起点放置在其他位置。我们还可以moveTo()用来绘制未连接的路径。看看下面的笑脸。


<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
function draw() {var canvas = document.getElementById('canvas');if (canvas.getContext) {var ctx = canvas.getContext('2d');ctx.beginPath();ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // Outer circlectx.moveTo(110, 75);ctx.arc(75, 75, 35, 0, Math.PI, false);  // Mouth (clockwise)ctx.moveTo(65, 65);ctx.arc(60, 65, 5, 0, Math.PI * 2, true);  // Left eyectx.moveTo(95, 65);ctx.arc(90, 65, 5, 0, Math.PI * 2, true);  // Right eyectx.stroke();}}</script>
</html>

运行结果:

线数

lineTo()方法来绘制直线

lineTo(x, y)

绘制一条从当前绘图位置到所指定的位置的线xy

案例:

绘制两个三角形一个实心的一个空心的


<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
function draw() {var canvas=document.getElementById('canvas');if(canvas.getContext){var ctx=canvas.getContext('2d');//绘制实心的ctx.beginPath();ctx.moveTo(25,25)ctx.lineTo(105,25);ctx.lineTo(25,105);// 绘制实心的ctx.fill();//绘制空心的ctx.beginPath();ctx.moveTo(125, 125);ctx.lineTo(125, 45);ctx.lineTo(45, 125);// 连接起始点ctx.closePath();//绘制形状ctx.stroke();}}</script>
</html>

效果如下:

弧线

要绘制圆弧或圆,我们使用arc()arcTo()方法。

语法:

void ctx.arc(x, y, radius, startAngle, endAngle [, anticlockwise]);

arc()方法创建一个以(x, y)半径为中心的圆弧。路径从开始于,在结束于,并按照给出的方向(默认为顺时针)行进

  • 参量

    x

    圆弧中心的水平坐标

    y

    圆弧中心的垂直坐标。

    radius

    圆弧的半径。必须是积极的。

    startAngle

    从正x轴开始测量的弧度起始弧度的角度(以弧度表示)。

    endAngle

    从正x轴开始测量,弧结束的弧度角(以弧度表示)

    anticlockwise 可选的

    可选的Boolean。如果为true,则在起始角度和终止角度之间逆时针绘制圆弧。默认值为false(顺时针)。

  • 例子

    画一个完整的圆

    
    <!DOCTYPE html>
    <html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
    </body><script type="application/javascript">
    function draw() {const canvas = document.querySelector('canvas');
    const ctx = canvas.getContext('2d');ctx.beginPath();
    ctx.arc(100, 75, 50, 0, 2 * Math.PI);
    ctx.stroke();}</script>
    </html>

贝塞尔曲线和二次曲线

贝塞尔曲线大概就是ps中钢笔工具那个曲线

quadraticCurveTo(cp1x, cp1y, x, y)

从当前笔位置到由指定的结束点绘制的二次贝塞尔曲线x,并y使用由指定的控制点cp1xcp1y

例子:

此示例显示了如何绘制二次贝塞尔曲线。


<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');//贝塞尔曲线
ctx.beginPath();
ctx.moveTo(50, 20);
ctx.quadraticCurveTo(230, 30, 50, 100);
ctx.stroke();// 起点和终点
ctx.fillStyle = 'blue';
ctx.beginPath();
ctx.arc(50, 20, 5, 0, 2 * Math.PI);   //起始点
ctx.arc(50, 100, 5, 0, 2 * Math.PI);  // 终点
ctx.fill();// 控制点
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(230, 30, 5, 0, 2 * Math.PI);
ctx.fill();</script>
</html>

运行结果:

二次贝塞尔曲线

语法:

void ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
cp1x

第一个控制点的x轴坐标。

cp1y

第一个控制点的y轴坐标。

cp2x

第二个控制点的x轴坐标。

cp2y

第二个控制点的y轴坐标。

x

终点的x轴坐标。

y

终点的y轴坐标。

案例:

绘制一个三次贝塞尔曲线


<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
//定义画布和上下文
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');// 将点定义为{x,y}
let start = { x: 50,    y: 20  };
let cp1 =   { x: 230,   y: 30  };
let cp2 =   { x: 150,   y: 80  };
let end =   { x: 250,   y: 100 };// 三次贝塞尔曲线
ctx.beginPath();
ctx.moveTo(start.x, start.y);
ctx.bezierCurveTo(cp1.x, cp1.y, cp2.x, cp2.y, end.x, end.y);
ctx.stroke();// 起始点和终止点
ctx.fillStyle = 'blue';
ctx.beginPath();
ctx.arc(start.x, start.y, 5, 0, 2 * Math.PI);  // 起始点
ctx.arc(end.x, end.y, 5, 0, 2 * Math.PI);      // 终止点
ctx.fill();// 控制点
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(cp1.x, cp1.y, 5, 0, 2 * Math.PI);  // 控制点一
ctx.arc(cp2.x, cp2.y, 5, 0, 2 * Math.PI);  // 控制点二
ctx.fill();</script>
</html>

结果

案例二:

渲染语音气球


<!DOCTYPE html>
<html><head><meta charset="utf-8" /></head><body onload="draw();"><canvas id="canvas" width="400" height="400"></canvas>
</body><script type="application/javascript">
function draw() {var canvas = document.getElementById('canvas');if (canvas.getContext) {var ctx = canvas.getContext('2d');// 二次贝塞尔曲线案例ctx.beginPath();ctx.moveTo(75, 25);ctx.quadraticCurveTo(25, 25, 25, 62.5);ctx.quadraticCurveTo(25, 100, 50, 100);ctx.quadraticCurveTo(50, 120, 30, 125);ctx.quadraticCurveTo(60, 120, 65, 100);ctx.quadraticCurveTo(125, 100, 125, 62.5);ctx.quadraticCurveTo(125, 25, 75, 25);ctx.stroke();}
}</script>
</html>

效果

长方形

rect(x, y, width, height)

绘制一个矩形,其左上角由(xy)指定,width并带有指定的和height

在执行此方法之前,将moveTo()使用参数(x,y)自动调用该方法。换句话说,当前笔位置会自动重置为默认坐标。

html画布入门笔记相关推荐

  1. Unity 入门笔记 - 05 - 动画事件类音效对话框

    Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 前言:无 目录 Unity 入门笔记 - 05 - 动画事件&类&音效&对话框 一.动画 ...

  2. Unity 入门笔记 - 07(完) - 菜单手机端静态类生成游戏

    Unity 入门笔记 - 07(完) - 菜单&手机端&静态类&生成游戏 前言:入门笔记的最后一篇.这个系列教程看完了.接下来有空就看例子项目,动手做点东西. 目录 Unity ...

  3. gif透明背景动画_iPad Procreate入门笔记03 - GIF动画制作

    更新至Procreate 5 后,新增加了"动画辅助(animation assist)"功能,制作动画更加容易上手且方便了. 下面介绍几种简单的制作方法. 1. GIF最佳画布大 ...

  4. 使用pil读取gif图有些位置为黑色_iPad Procreate入门笔记03 - GIF动画制作

    更新至Procreate 5 后,新增加了"动画辅助(animation assist)"功能,制作动画更加容易上手且方便了. 下面介绍几种简单的制作方法. 1. GIF最佳画布大 ...

  5. vue router 入门笔记

    vue router 入门笔记 tips: components优先级大于component,即当一个route对象里同时配置了component和components时component视为无效 即 ...

  6. 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记

    整理 | Jane 编辑 | Just 出品 | AI科技大本营(ID:rgznai100) 近期,梁劲传来该笔记重大更新的消息.<机器学习--从入门到放弃>这本笔记的更新没有停止,在基于 ...

  7. html缩进快捷键_HTML 入门笔记

    HTML 入门笔记 HTML (HyperText Markup Language) 不是一门编程语言,而是一种用来告知浏览器如何组织页面的标记语言. HTML 可复杂.可简单,一切取决于开发者. 它 ...

  8. Python3入门笔记(1) —— windows安装与运行

    Python3入门笔记(1) -- windows安装与运行 Python的设计哲学是"优雅"."明确"."简单".这也是我喜欢Python ...

  9. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

最新文章

  1. ISE中ChipScope软件使用
  2. Flash XSS 漏洞详解 根治的好办法
  3. C/C++还能混合编程
  4. tcpdump的用法
  5. svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢
  6. 三个等价c语言表达式,C语言习题综合(20页)-原创力文档
  7. 组合数学 —— 康托展开
  8. 【pytorch 】torchvision.transforms.CenterCrop==>从图像中心裁剪图片
  9. opengl 创建context_OpenGL专业名词解析
  10. python按照区间长度给定不同数量的随机数
  11. 《Image Effects 》第一章学习笔记(2)
  12. 5G网络出现打乱传统网络范式,AI驱动+区块链能搞出啥新花样?
  13. 快速新建一个纯净的java pom项目 project
  14. php取excel中的值,在Php Excel中使用列名获取单元格值
  15. 在64位系统中无法看到Microsoft Excel Application的问题
  16. 新员工入职表_舞钢农商银行:组织新招录员工开展反假币培训
  17. iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?
  18. STOP 0X00000018关机蓝屏重启问题
  19. truncate table 用法
  20. Hiho303周 H国的身份证号码I

热门文章

  1. python分位数函数,Python解释数学系列——分位数Quantile
  2. 徕卡或于3月6日发布新款Q2相机
  3. Windows 下 MinGW-W64 与 CMake 的安装
  4. Gurobi学术版过期,重新申请学术许可
  5. 新疆一女子为减肥三天不吃饭 饿晕在路旁
  6. 【Vue 3 实战一】搭建一个新项目并上传至gitee
  7. 使用R包ggbio画单个基因的 autoplot转录本信息图
  8. eWebeditor在线编辑器漏洞利用
  9. 最适合程序员编程的10款字体
  10. Cesium从入门到放弃10:gif图片投影