一、颜色 Colors
方法 | 说明 |
---|---|
fillStyle = color | 设置图形的填充颜色。 |
strokeStyle = color | 设置图形轮廓的颜色。 |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Canvas学习笔记</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body onload="draw()">
<canvas id="canvas" width="500" height="500"></canvas>
</body>
<script>
// function draw () {}
</script>
</html>
// fillStyle()
function draw() {
var canvas = document.getElementById('canvas');
var mappings = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f']; // 关于颜色值之间的映射,方便提取值。
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
for (let i = 0; i < mappings.length; i++) {
for (let j = 0; j < mappings.length; j++) {
ctx.fillStyle = `#${mappings[i]}0${mappings[j]}`; // 颜色使用的是16进制的三位数字表示如:#000,可以适当调整参数改变效果。
ctx.fillRect(i * 30, j * 30, 30, 30);
}
}
}
}
// strokeStyle()
function draw() {
var canvas = document.getElementById('canvas');
var mappings = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'];
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
for (let i = 0; i < mappings.length; i++) {
for (let j = 0; j < mappings.length; j++) {
ctx.beginPath();
ctx.strokeStyle = `#${mappings[j]}0${mappings[i]}`;
ctx.arc(i * 30 + 15, j * 30 + 15, 15, 0,Math.PI * 2);
ctx.stroke();
}
}
}
}
二、透明度 Transparency
除了可以绘制实色图形,我们还可以用 canvas 来绘制半透明的图形。通过设置 globalAlpha 属性或者使用一个半透明颜色作为轮廓或填充的样式。
方法 | 描述 |
---|---|
globalAlpha = transparencyValue | 这个属性影响到 canvas 里所有图形的透明度,有效的值范围是 0.0 (完全透明)到 1.0(完全不透明),默认是 1.0。 |
当然,可以也可以使用 rgba() 色值实现透明度。
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
ctx.fillStyle = '#dd5044';
ctx.fillRect(0, 0, 250, 250);
ctx.fillStyle = '#1b9e5f';
ctx.fillRect(250, 0, 250, 250);
ctx.fillStyle = '#4a8af4';
ctx.fillRect(0, 250, 250, 250);
ctx.fillStyle = '#ffcd41';
ctx.fillRect(250, 250, 250, 250);
// 透明方式 一、
ctx.fillStyle = '#fff';
ctx.globalAlpha = 0.05;
// 透明方式 二、
// ctx.fillStyle = '#ffffff0f';
for (let i = 0; i < 15; i++) {
ctx.beginPath();
ctx.arc(250, 250, 20 * i, 0, Math.PI * 2);
ctx.fill();
}
}
}
// 方式二 HEX 色值扩展
function draw() {
var canvas = document.getElementById('canvas');
var mappings = [4, 5, 6, 7, 8, 9, 'a', 'b', 'c'];
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
ctx.fillStyle = '#dd5044';
ctx.fillRect(0, 0, 500, 125);
ctx.fillStyle = '#1b9e5f';
ctx.fillRect(0, 125, 500, 125);
ctx.fillStyle = '#4a8af4';
ctx.fillRect(0, 250, 500, 125);
ctx.fillStyle = '#ffcd41';
ctx.fillRect(0, 375, 500, 125);
// 控制位置
for (let i = 0; i < 4; i++) {
// 控制透明度
for (let j = 0; j < mappings.length; j++) {
ctx.fillStyle = `#fff${mappings[j]}`;
// x , y 所加的值为起始位置的比例,w , h 已经固定
ctx.fillRect(j * 46 + 46, i * 125 + 15, 46, 95);
}
}
}
}
三、线形 Line styles
方法、属性 | 描述 |
---|---|
lineWidth = value | 设置线条宽度。 |
lineCap = type | 设置线条末端样式。 |
lineJoin = type | 设定线条与线条间接合处的样式。 |
miterLimit = value | 限制当两条线相交时交接处最大长度;所谓交接处长度(斜接长度)是指线条交接处内角顶点到外角顶点的长度。 |
lineDashOffset = value | 设置虚线样式的起始偏移量。 |
getLineDash() | 返回一个包含当前虚线样式,长度为非负偶数的数组。 |
setLineDash(segments) | 设置当前虚线样式。 |
1. lineWidth 属性
这个属性设置当前绘线的粗细。属性值必须为正数。默认值是1.0。
线宽是指给定路径的中心到两边的粗细。换句话说就是在路径的两边各绘制线宽的一半。因为画布的坐标并不和像素直接对应,当需要获得精确的水平或垂直线的时候要特别注意。
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
for (let i = 0; i < 10; i++) {
ctx.lineWidth = i;
ctx.beginPath();
ctx.moveTo(i * 42 + 50, 50);
ctx.lineTo(i * 42 + 50, 450);
ctx.stroke();
}
}
}
2. lineCap 属性
属性 lineCap 的值决定了线段端点显示的样子。它可以为下面的三种的其中之一:butt,round 和 square。默认是 butt。
function draw() {
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var lineCap = ['butt', 'round', 'square'];
var ctx = canvas.getContext('2d');
for (let i = 0; i < lineCap.length; i++) {
ctx.beginPath();
ctx.lineWidth = 10;
ctx.lineCap = lineCap[i];
ctx.moveTo(i * 50 + 50, 50);
ctx.lineTo(i * 50 + 50, 150);
ctx.stroke();
}
// 辅助线
ctx.beginPath();
ctx.lineWidth = 1;
ctx.strokeStyle = 'skyblue';
ctx.moveTo(40, 50);
ctx.lineTo(160, 50);
ctx.moveTo(40, 150);
ctx.lineTo(160, 150);
ctx.stroke();
}
}
3. lineJoin 属性
lineJoin 的属性值决定了图形中两线段连接处所显示的样子。它可以是这三种之一:round, bevel 和 miter。默认是 miter。
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
var lineJoin = ['round', 'bevel', 'miter'];
ctx.lineWidth = 10;
for (let i = 0; i < lineJoin.length; i++) {
ctx.lineJoin = lineJoin[i];
ctx.beginPath();
ctx.moveTo(-5, 5 + i * 40);
ctx.lineTo(35, 45 + i * 40);
ctx.lineTo(75, 5 + i * 40);
ctx.lineTo(115, 45 + i * 40);
ctx.lineTo(155, 5 + i * 40);
ctx.stroke();
}
}
4. miterLimit 属性
就如上一个例子所见的应用 miter 的效果,线段的外侧边缘会被延伸交汇于一点上。线段之间夹角比较大时,交点不会太远,但随着夹角变小,交点距离会呈指数级增大。
miterLimit 属性就是用来设定外延交点与连接点的最大距离,如果交点距离大于此值,连接效果会变成了 bevel。注意,最大斜接长度(即交点距离)是当前坐标系测量线宽与此miterLimit属性值(HTML 默认为10.0)的乘积,所以miterLimit可以单独设置,不受显示比例改变或任何仿射变换的影响:它只影响线条边缘的有效绘制形状。
5、虚线
方法、属性 | 说明 |
---|---|
setLineDash() | 接受一个数组,来指定线段与间隙的交替。 |
lineDashOffset | 设置起始偏移量。 |
// 实现蚂蚁线,并让它动起来。
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var offset = 0;
// 绘制蚂蚁线
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.setLineDash([5, 3]);
ctx.lineDashOffset = -offset;
ctx.strokeRect(20, 20, 460, 460);
}
// 通过改变offset值,实现动画
function march() {
offset++;
if (offset > 10) {
offset = 0;
}
draw();
setTimeout(march, 10);
}
march();
四、渐变 Gradients
就好像一般的绘图软件一样,我们可以用线性或者径向的渐变来填充或描边。我们用下面的方法新建一个 canvasGradient 对象,并且赋给图形的 fillStyle 或 strokeStyle 属性。
方法 | 说明 |
---|---|
createLinearGradient(x1, y1, x2, y2) | createLinearGradient 方法接受 4 个参数,表示渐变的起点 (x1,y1) 与终点 (x2,y2)。 |
createRadialGradient(x1, y1, r1, x2, y2, r2) | createRadialGradient 方法接受 6 个参数,前三个定义一个以 (x1,y1) 为原点,半径为 r1 的圆,后三个参数则定义另一个以 (x2,y2) 为原点,半径为 r2 的圆。 |
gradient.addColorStop(position, color) | addColorStop 方法接受 2 个参数,position 参数必须是一个 0.0 与 1.0 之间的数值,表示渐变中颜色所在的相对位置。例如,0.5 表示颜色会出现在正中间。color 参数必须是一个有效的 CSS 颜色值(如 #FFF, rgba(0,0,0,1),等等)。 |
1. 线性渐变
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
// 定义一个颜色容器,设置起始终点的位置。
var lineargradient = ctx.createLinearGradient(250, 0, 250, 500);
lineargradient.addColorStop(0, 'white'); // 按照0-1的区间,设置颜色的比例
lineargradient.addColorStop(1, 'black');
// 将设置好的颜色赋值,绘画出的矩形
ctx.fillStyle = lineargradient;
ctx.fillRect(10, 10, 480, 480)
}
2. 径向渐变
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
var radgrad = ctx.createRadialGradient(180, 300, 20, 180, 380, 150);
radgrad.addColorStop(0,'#a7d30c');
radgrad.addColorStop(.9,'#05a05e');
radgrad.addColorStop(1,'#05a05e00');
var radgrad1 = ctx.createRadialGradient(310,350,10, 350, 400, 100);
radgrad1.addColorStop(0, '#01caff');
radgrad1.addColorStop(.9, '#00b6e3');
radgrad1.addColorStop(1, '#00b6e300');
ctx.fillStyle = radgrad;
ctx.fillRect(0, 0, 500, 500);
ctx.fillStyle = radgrad1;
ctx.fillRect(0, 0, 500, 500);
}
五、图案样式 Patterns
方法 | 描述 |
---|---|
createPattern(image, type) | 该方法接受两个参数。Image 可以是一个 Image 对象的引用,或者另一个 canvas 对象。Type 必须是下面的字符串值之一:repeat,repeat-x,repeat-y 和 no-repeat。 |
图案的应用跟渐变很类似的,创建出一个 pattern 之后,赋给 fillStyle 或 strokeStyle 属性即可。
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png';
// img加载完成执行
img.onload = function () {
// 定义需要填充的图片
var ptrn = ctx.createPattern(img, 'repeat');
ctx.fillStyle = ptrn;
ctx.fillRect(10, 10, 480, 480);
};
}
六、阴影 Shadows
属性 | 描述 |
---|---|
shadowOffsetX = float | shadowOffsetX 和 shadowOffsetY 用来设定阴影在 X 和 Y 轴的延伸距离,它们是不受变换矩阵所影响的。负值表示阴影会往上或左延伸,正值则表示会往下或右延伸,它们默认都为 0。 |
shadowOffsetY = float | shadowOffsetX 和 shadowOffsetY 用来设定阴影在 X 和 Y 轴的延伸距离,它们是不受变换矩阵所影响的。负值表示阴影会往上或左延伸,正值则表示会往下或右延伸,它们默认都为 0。 |
shadowBlur = float | shadowBlur 用于设定阴影的模糊程度,其数值并不跟像素数量挂钩,也不受变换矩阵的影响,默认为 0。 |
shadowColor = color | shadowColor 是标准的 CSS 颜色值,用于设定阴影颜色效果,默认是全透明的黑色。 |
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.shadowBlur = 2;
ctx.shadowColor = '#0008';
// 设置字体大小、字体类型
ctx.font = '80px Times New Roman';
ctx.fillStyle = 'skyblue';
ctx.fillText('Hello Canvas!', 20, 80); // 显示文本内容:文本内容,起始x轴,起始y轴
}
七、Canvas 填充规则
当我们用到 fill(或者 clip和isPointinPath )你可以选择一个填充规则,该填充规则根据某处在路径的外面或者里面来决定该处是否被填充,这对于自己与自己路径相交或者路径被嵌套的时候是有用的。
两个可能的值:
“nonzero”: non-zero winding rule, 默认值.
“evenodd”: even-odd winding rule, 交替填充
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
ctx.beginPath();
ctx.arc(250, 250, 50, 0, Math.PI * 2, true);
ctx.arc(250, 250, 150, 0, Math.PI * 2, true);
ctx.arc(250, 250, 10, 0, Math.PI * 2, true);
ctx.fill('evenodd');
}