美文网首页
Canvas入门

Canvas入门

作者: David_Rao | 来源:发表于2020-01-29 23:33 被阅读0次

什么是Canvas?

Canvas是H5新增的一个标签,我们可以通过js在这个标签上绘制各种图案
Canvas拥有多种绘制路径、矩形、圆形、字符以及图片的方法

Canvas画图步骤

  1. 创建一个canvas标签
    默认宽度300px,默认高度150px
<canvas></canvas>
  1. 通过js代码拿到canvas标签
let oCanvas = document.querySelector("canvas");
  1. 从canvas标签中获取到绘图工具
let oCtx = oCanvas.getContext("2d");
  1. 通过绘图工具在canvas标签上绘制图形
    以绘制直线为例
// 4.1 设置路径的起点
oCtx.moveTo(50, 50);  // (x, y)
// 4.2 设置路径的终点
oCtx.lineTo(200, 50);  // (x, y)
// 4.3 告诉canvas将这些点连接起来
oCtx.stroke();

修改canvas标签宽高

// 拉伸,会影响到内容大小
canvas{
    width: 500px;
    height: 500px;
}
// 通过行内属性修改,内容不会被拉伸
<canvas width="500" height="500"></canvas>

线条默认宽度和颜色

  • 通过canvas绘制的线条默认宽度是1px,颜色是纯黑色
  • 但是由于默认情况下canvas会将线条的中心点和像素的底部对齐
  • 所以会导致显示效果是2px和非纯黑色问题

解决方法:

// 4.1 设置路径的起点
oCtx.moveTo(50, 50.5);  // (x, y)
// 4.2 设置路径的终点
oCtx.lineTo(200, 50.5);  // (x, y)
// 4.3 告诉canvas将这些点连接起来
oCtx.stroke();

canvas线条属性

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");
// 修改线条的高度
oCtx.lineWidth = 20;
// 修改线条的颜色
oCtx.strokeStyle = "blue";
// 修改线条两端样式,butt默认、round、square
oCtx.lineCap = "round";  
// 修改线条样式([虚线每一段的宽度, 每段虚线间的间隙])

oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.stroke();

canvas绘制多条直线

  • oCtx.beginPath();重新开启路径。不重新开始路径的话样式不变
  • 为了让绘制不相互影响,每次在绘制新路径之前,调用oCtx.beginPath();开启新的路径
let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");

oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
// 在画之前可以修改样式
oCtx.lineWidth = 20;
oCtx.strokeStyle = "blue";
oCtx.lineCap = "round";  
oCtx.stroke();

// 重新开始路径
oCtx.beginPath();  
oCtx.moveTo(50, 100);
oCtx.lineTo(200, 100);
// 在画之前重新设置样式
oCtx.lineWidth = 20;
oCtx.strokeStyle = "blue";
oCtx.lineCap = "round";  
oCtx.stroke();

canvas绘制三角形

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");

oCtx.beginPath();  
// 绘制三个点
oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.lineTo(200, 200);
// 注意点,需要手动回到起点
oCtx.lineTo(50, 50);  

// 加宽后发现,lineTo会出现转角缺失现象
oCtx.lineWidth = 20;
oCtx.stroke();

使用closePath()解决上述问题

let oCanvas = document.querySelector("canvas");
let oCtx = oCanvas.getContext("2d");

oCtx.beginPath();  
oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.lineTo(200, 200);
oCtx.closePath();

oCtx.lineWidth = 20;
// 设置转角样式,miter默认、round、bovel
oCtx.lineJoin = "bovel";
oCtx.stroke();

填充图形

oCtx.beginPath();  
oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.lineTo(200, 200);
oCtx.closePath();

oCtx.fillStyle = "blue";  // 填充颜色
oCtx.fill();  // 填充图形

若要在图形与另一图形之间填充颜色,需要注意连接点是顺时针还是逆时针

  1. 内外矩形均是顺时针

  1. 外矩形顺时针,内矩形逆时针

  1. 非零环绕规则
  • 判断哪里是否要填充,就从哪里引出直线
  • 与直线相交的向量指向顺时针方向,+1
  • 与直线相交的向量指向逆时针方向,-1
  • 结果大于0则要填充该区域,否则不填充
oCtx.beginPath();  
oCtx.moveTo(100, 100);
oCtx.lineTo(300, 100);
oCtx.lineTo(300, 300);
oCtx.lineTo(100, 300);
oCtx.closePath();

oCtx.moveTo(250, 150);
oCtx.lineTo(150, 150);
oCtx.lineTo(150, 250);
oCtx.lineTo(250, 250);
oCtx.closePath();

oCtx.fill();  // 填充图形

绘制虚线

// 修改线条样式
// ([虚线每一段的宽度, 每段虚线间的间隙])
// 三个参数的自己试一下([])
oCtx.setLineDash([5, 20]);
 // 获得虚线的格式
console.log(oCtx.getLineDash()); 
// 设置虚线偏移位
oCtx.lineDashOffset = -50;

oCtx.moveTo(50, 50);
oCtx.lineTo(200, 50);
oCtx.stroke();

绘图工具方法及属性总结

beginPath()  // 路径重新开始,清除前面一切样式
moveTo(x, y)  // 起点
lineTo(x, y)  // 绘制点
closePath()  // 闭合路径,终点自动连接起点

lineWidth  // 线条宽度
strokeStyle  // 线条颜色
lineCap  // 线条两端样式
lineJoin  // 线条连接处拐角样式
fillStyle // 填充颜色

// 设置线条样式
setLineDash([虚线每一段的宽度, 每段虚线间的间隙])  
getLineDash()  // 获得虚线的格式
lineDashOffset  // 设置虚线偏移位

stroke(); // 绘制线条
fill();  //填充,注意非零环绕规则

相关文章

  • canvas入门-小时钟

    canvas入门-小时钟

  • canvas入门

    标签插入 获取标签var canvas = document.getElementById('canvas');获...

  • canvas 入门

    绘制倒计时时钟 1 绘制一条线 然后利用刚学的线条绘制个七巧板 2 绘制弧线 canvas 中的方法 圆的起始状态...

  • canvas入门

    一、什么是 canvas? HTML5 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成可以...

  • canvas入门

    日期:2020 年 5 月 8 日 canvas 学习笔记 canvas 简介 canvas 是一个用来绘图的 h...

  • Canvas入门

    是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素.例如,它可以用于绘制图表、制作图片构...

  • Canvas入门

    什么是Canvas? Canvas是H5新增的一个标签,我们可以通过js在这个标签上绘制各种图案Canvas拥有多...

  • canvas入门

    canvas 绘制基本步骤: 第一步:获得上下文 => canvasElem.getContext(‘2d’);第...

  • HTML5 Canvas笔记——打印出Hello Canvas

    参考书目:《HTML5 Canvas核心技术 图形、动画与游戏开发》 HTML5 Canvas简单入门操作,如同每...

  • Canvas(基础)

    标签:canvas 简单示例 入门知识作者: 张耀国 ( IgorZhang )E-mail: igorzhang...

网友评论

      本文标题:Canvas入门

      本文链接:https://www.haomeiwen.com/subject/tlrbthtx.html