Canvas 线条样式设置
一、基本样式
1、线条宽度
通过 lineWidth
设置线条宽度。
示例:
ctx.moveTo(40, 75)
ctx.lineTo(160, 75)
ctx.lineWidth = 10
ctx.stroke()
效果如下:
2、线帽样式
通过 lineCap
设置线帽样式,可选值:
butt(默认)
:无线帽round
:圆形线帽square
:正方形线帽
示例:
ctx.beginPath();
ctx.moveTo(40, 55)
ctx.lineTo(160, 55)
ctx.lineWidth = 10
ctx.stroke()
ctx.beginPath();
ctx.moveTo(40, 75)
ctx.lineTo(160, 75)
ctx.lineWidth = 10
ctx.lineCap = 'round'
ctx.stroke()
ctx.beginPath();
ctx.moveTo(40, 95)
ctx.lineTo(160, 95)
ctx.lineWidth = 10
ctx.lineCap = 'square'
ctx.stroke()
效果如下:
其中,round
和 square
线帽会略长一些,多出的长度计算如下:
round
,多出的半圆的直径为线宽长度;square
,多出的长方形的长度为线宽的一半,高度保持为线宽长度。
3、线条交接处样式
通过 lineJoin
设置两个线条交接处的样式,可选值:
miter
(默认):尖角round
:圆角bevel
:斜角
示例:
ctx.beginPath();
ctx.moveTo(40, 40)
ctx.lineTo(160, 40)
ctx.lineTo(160, 110)
ctx.lineWidth = 10
ctx.lineJoin = 'round'
ctx.stroke()
ctx.beginPath();
ctx.moveTo(45, 60)
ctx.lineTo(45, 105)
ctx.lineTo(140, 105)
ctx.lineWidth = 10
ctx.lineJoin = 'bevel'
ctx.stroke()
效果如下:
二、虚线样式
1、设置虚线
setLineDash()
用于设置线条的虚线样式:
context.setLineDash(array)
参数 array
是一个数组组合,常见的数组组合有 [10, 5]
,[5, 5]
,[10, 5, 5, 5]
,[2, 2]
等。
数组 [10, 5]
表示 “10px 实线” 和 “5px 空白” 重复拼凑而成的线型,[10, 5, 5, 5]
表示 “10px 实线、5px 空白、5px 实线、5px 空白” 重复拼凑而成的线型。
示例:
ctx.setLineDash([10, 5])
ctx.strokeRect(50, 50, 80, 80)
效果如下:
2、设置虚线偏移量
lineDashOffset
可以设置虚线的偏移量,默认值为 0.0
。
利用这个偏移量,可以让虚线“动起来”,俗称“蚂蚁线”:
let offset = 0;
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.setLineDash([4, 4, 12, 4]);
ctx.lineDashOffset = offset;
ctx.strokeRect(20, 20, 150, 150);
}
function march() {
offset++;
if (offset > 24) {
offset = 0;
}
draw();
setTimeout(march, 20);
}
march();
效果如下:
3、获取当前线段样式
getLineDash()
用于获取当前线段样式,返回一个描述线段和间隔的数组。
如果数组元素的数量是奇数,则数组元素会被复制并重复。
ctx.setLineDash([5, 15]);
console.log(ctx.getLineDash()); // [5, 15]
ctx.setLineDash([5, 15, 5]); // 数组元素的数量是奇数
console.log(ctx.getLineDash()); // [5, 15, 5, 5, 15, 5]