canvas
可以使用Javascript
来绘制图形。
是一个 HTML
元素。
浏览器支持度也不错。
基本属性
1 | <canvas id=“canvasId” width=“150” height=“150”> |
默认初始值:
width 300px ; height:150pxcss 的设置:
(1)width 属性和 height 属性,比 css 设置更有效果。
(2)margin border background 等属性不会影响 canvas 的实际效果。渲染上下文:
(1) 含义:固定大小的 2D 画布。
(2)API:getContext()
:获取渲染上下文和绘画功能。接受一个参数 - 上下文的类型。
1 | var canvas = document.getElementById(‘canvasId’) |
- 检查 canvas 支持性:
1 | var canvas = document.getElementById('tutorial'); |
常见 API
- 可以绘制的基本形状 : 矩形、三角形、直线、圆弧和曲线。
(1)栅格 :起点为左上角,单位为像素。
(2)绘制矩形和路径:
矩形 API:
x y 指定了在 canvas 画布上绘制的左上角(相对于原点)的坐标。
width heighgt 设置矩形的尺寸。
(1)fillRect (x, y, width, height):绘制一个填空的矩形
(2)storkeRect (x, y, width, height) 绘制一个矩形的边框
(3)clearRect (x, y, width, height) 清除指定矩形区域,让清除部分完全透明
(4)rect (x, y, width, height) 绘制一个左上角坐标为(x,y),宽高为 width以及 height 的矩形。
路径 API:
x y 指定了在 canvas 画布上绘制的左上角(相对于原点)的坐标。
(1)beginPath : 开始绘制一个新的形状路径
(2)moveTo (x , y):将笔触移动到指定的 坐标 x 以及 y
(3)lineTo (x, y):绘制一条从当前位置到指定x 以及 y 的直线
(4)closePath:结束路径。使用 fill 时就不需要调用它,如果是描边 stroke时,则需要用。
(5)stroke:描边。
(6)fill:填充。
圆弧:
API:
arc (x, y, radius, startAngle, endAngle, anticlockwise)
画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。
详细参数介绍:
x,y 为绘制圆弧所在圆上的圆心坐标。radius 为半径。startAngle 以及 endAngle 参数用弧度定义了开始以及结束的弧度。这些都是以 x 轴为基准。参数 anticlockwise 为一个布尔值。为 true 时,是逆时针方向,否则顺时针方向。
二次贝赛尔曲线 和 三次贝赛尔曲线:
用来绘制复杂有规律的曲线。
(1)quadraticCurveTo (cp1x, cp1y, x, y)
绘制二次贝塞尔曲线,cp1x , cp1y 为一个控制点,x,y 为结束点。
(2)bezierCurveTo (cp1x, cp1y, cp2x, cp2y, x, y)
绘制三次贝塞尔曲线,cp1x, cp1y 为控制点一,cp2x, cp2y 为控制点二,x,y 为结束点。
绘画历史记录 path2D
path2D 对象,可用来缓存或记录绘画命令。
1 | new Path2D(); // 空的Path对象 |
API :
path2D.addPath(path)
1 | function draw() { |
使用样式和颜色
- 添加色彩:
fillStyle
和strokeStyle
API:
ctx.fillStyle = color色值
ctx.strokeStyle = color色值
1 | // 这些 fillStyle 的值均为 '橙色' |
- 透明度 Transparentcy、rgba
属性globalAlpha
用法:
ctx.globalAlpha = transparentcyValue (0 - 1)
ctx.fillStyle = rgba(255,255,255, transparentcyValue (0 - 1))
线 style
- lineWidth : 线条宽度(线条粗细)
- lineCap:决定线段 端点 显示的样子(butt round square)butt 默认
- lineJoin:图形中两线段连接处所显示的样子(round bevel miter)miter 默认
- 虚线:
setLineDash
: 用一个数组,指定线段与间隙的交替lineDashOffset
:设置起始偏移量
demo:实现虚线背景选区边框
1 | var ctx = document.getElementById('canvas').getContext('2d'); |
- 剪切
API: ctx.clip() 利用创建的路径,生成可裁剪区域,并把当前工作区域与裁剪区域绑定。1
2
3
4
5
6// 橡皮擦功能
ctx.beginPath()
ctx.save()
ctx.clip()
ctx.clearRect(0, 0, canvas.width, canvas.height)
ctx.restore()
填充或描边的渐变
createLinearGradient
和 createRadialGradient
赋给图形的 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 | // 线性黑白渐变 |
图案样式 Patterns
- createPattern(image, type) : 循环实现图案的效果。
该方法接受两个参数。Image 可以是一个 Image 对象的引用,或者另一个 canvas 对象。Type 必须是下面的字符串值之一:repeat,repeat-x,repeat-y 和 no-repeat。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// onload 确保图案加载好
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
// 创建新 image 对象,用作图案
var img = new Image();
img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png';
img.onload = function() {
// 创建图案
var ptrn = ctx.createPattern(img, 'repeat');
ctx.fillStyle = ptrn;
ctx.fillRect(0, 0, 150, 150);
}
}
阴影 Shadows
- shadowOffsetX = float
shadowOffsetX 和 shadowOffsetY 用来设定阴影在 X 和 Y 轴的延伸距离,它们是不受变换矩阵所影响的。负值表示阴影会往上或左延伸,正值则表示会往下或右延伸,它们默认都为 0。 - shadowOffsetY = float
shadowOffsetX 和 shadowOffsetY 用来设定阴影在 X 和 Y 轴的延伸距离,它们是不受变换矩阵所影响的。负值表示阴影会往上或左延伸,正值则表示会往下或右延伸,它们默认都为 0。 - shadowBlur = float
shadowBlur 用于设定阴影的模糊程度,其数值并不跟像素数量挂钩,也不受变换矩阵的影响,默认为 0。 - shadowColor = color
shadowColor 是标准的 CSS 颜色值,用于设定阴影颜色效果,默认是全透明的黑色。
1 | function draw() { |
绘制文本
- fillText(text, x, y [, maxWidth])
在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. - strokeText(text, x, y [, maxWidth])
在指定的(x,y)位置绘制文本边框,绘制的最大宽度是可选的.
1 | function draw() { |
canvas 改变 文本样式:
font = value
当前我们用来绘制文本的样式. 这个字符串使用和 CSS font 属性相同的语法. 默认的字体是 10px sans-serif。textAlign = value
文本对齐选项. 可选的值包括:start, end, left, right or center. 默认值是 start。textBaseline = value
基线对齐选项. 可选的值包括:top, hanging, middle, alphabetic, ideographic, bottom。默认值是 alphabetic。direction = value
文本方向。可能的值包括:ltr, rtl, inherit。默认值是 inherit。1
2
3ctx.font = "48px serif";
ctx.textBaseline = "hanging";
ctx.strokeText("Hello world", 0, 100);canvas 获取文本的属性对象
1
2
3
4
5function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
var text = ctx.measureText("foo"); // TextMetrics object
text.width; // 16;
}
使用图像
图片源 可使用 PNG、GIF 或者 JPEG ,甚至是 canvas 生成的图片
- HTMLImageElement
这些图片是由Image()函数构造出来的,或者任何的元素1
2
3
4
5
6var img = new Image(); // 创建img元素
img.onload = function(){
// 执行drawImage语句
}
img.src = 'myImage.png'; // 设置图片源地址
// img.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw=='; - HTMLVideoElement
用一个HTML的 - HTMLCanvasElement
可以使用另一个 - ImageBitmap
这是一个高性能的位图,可以低延迟地绘制,它可以从上述的所有源以及其它几种源中生成。 - crossOrigin 属性,可请求加载其他域名的图片,而不会污染 canvas
- drawImage(image, x, y): 其中 image 是 image 或者 canvas 对象,x 和 y 是其在目标 canvas 里的起始坐标。
- 缩放 Scaling
drawImage(image, x, y, width, height)
这个方法多了2个参数:width 和 height,这两个参数用来控制 当向canvas画入时应该缩放的大小1
2
3
4
5
6
7
8
9
10
11
12function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.onload = function(){
for (var i=0;i<4;i++){
for (var j=0;j<3;j++){
ctx.drawImage(img,j*50,i*38,50,38);
}
}
};
img.src = 'https://mdn.mozillademos.org/files/5397/rhino.jpg';
} - 切片: 类似雪碧图
- imageSmoothingEnabled: 制是否在缩放图像时使用平滑算法
过度缩放图像可能会导致图像模糊或像素化。开启可能会让合成的图片更清晰。
保存
- canvas.toDataURL(’image/png‘)
默认设定。创建一个PNG图片。
Default setting. Creates a PNG image. - canvas.toDataURL(’image/jpeg‘, quality)
创建一个JPG图片。你可以有选择地提供从0到1的品质量,1表示最好品质,0基本不被辨析但有比较小的文件大小。 - canvas.toBlob(callback, type, encoderOptions)
这个创建了一个在画布中的代表图片的Blob对像。
- 本文标题:canvas
- 本文作者:Jonnzer
- 创建时间:2022-01-22 00:00:00
- 本文链接:https://jonnzer.github.io/2022/01/22/canvas/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!