![HTML5+CSS3从入门到精通(微课精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/24172697/b_24172697.jpg)
4.3 定义样式和颜色
canvas支持很多颜色和样式选项,如线型、渐变、图案、透明度和阴影。本节将介绍样式的设置方法。
4.3.1 颜色
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P104_3822.jpg?sign=1739285563-Rr12VebdG5D2MLaFZL3ThVRK1iJ1krik-0-d06950268029c26c51baa535e6862e08)
视频讲解
使用fillStyle和strokeStyle属性可以给图形上色。其中,fillStyle设置图形的填充颜色,strokeStyle设置图形轮廓的颜色。
颜色值可以是表示CSS颜色值的字符串,也可以是渐变对象或者图案对象(参考下面小节介绍)。默认情况下,线条和填充颜色都是黑色,CSS颜色值为#000000。
一旦设置了strokeStyle或fillStyle的值,那么这个新值就会成为新绘制的图形的默认值。如果要给每个图形定义不同的颜色,就需要重新设置fillStyle或strokeStyle的值。
【示例1】本例使用嵌套for循环绘制方格阵列,每个方格填充不同色,效果如图4.15所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P104_78378.jpg?sign=1739285563-EKadM41Moq14m7rACuJATn3Xdv1f2kaQ-0-529ae55ed788308a03f9164082c18a9b)
在嵌套for结构中,使用变量i和j为每个方格产生唯一的RGB色彩值,其中仅修改红色和绿色通道的值,而保持蓝色通道的值不变。可以通过修改这些颜色通道的值来产生各种各样的色板。通过增加渐变的频率,可以绘制出类似Photoshop调色板的效果。
【示例2】下面示例与示例1有点类似,但使用strokeStyle属性,画的不是方格,而是用arc()方法画圆,效果如图4.16所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_78379.jpg?sign=1739285563-jwbDzFFbb2Y4IukBYX4pcMHeaCc0n3uI-0-a0adfe347d712b95cf7eb4039f03d259)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3913.jpg?sign=1739285563-vvZ7OtgiwXiHFjvudUMRjQmh3Nsw2bdh-0-6977fad55a5394b23fff5e9559df6b7d)
图4.15 绘制渐变色块
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3914.jpg?sign=1739285563-zvw3DZpgZTqC4L3wW8hPXBGLp4vYLjOq-0-e342a8b239f714d522e81f0d8657a0cd)
图4.16 绘制渐变圆圈
4.3.2 不透明度
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3963.jpg?sign=1739285563-msp4edNA1brT6f88B65av6ZA2W36bFrV-0-4d672ae456b05c87c2ac0b3e012777d7)
视频讲解
使用globalAlpha全局属性可以设置绘制图形的不透明度,另外也可以通过色彩的不透明度参数来为图形设置不透明度,这种方法相对于使用globalAlpha属性来说,会更灵活些。
使用rgba()方法可以设置具有不透明度的颜色,用法如下。
rgba(R,G,B,A)
其中R、G、B将颜色的红色、绿色和蓝色成分指定为0~255的十进制整数,A把alpha(不透明)成分指定为0.0和1.0之间的一个浮点数值,0.0为完全透明,1.0为完全不透明。例如,可以用"rgba(255,0,0,0.5)"表示半透明的完全红色。
【示例1】下面示例使用四色格作为背景,设置globalAlpha为0.2后,在上面画一系列半径递增的半透明圆,最终结果是一个径向渐变效果,如图4.17所示。圆叠加得越多,原先所画的圆的透明度会越低。通过增加循环次数,画更多的圆,背景图的中心部分会完全消失。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4070.jpg?sign=1739285563-LLJYSpGIPfb5uyeGZWtmefQyjF7NhCHs-0-08ebce1b5d093a4cdfbba0fd75761796)
图4.17 用globalAlpha设置不透明度
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_78384.jpg?sign=1739285563-1qOGBJVWlZ6dbCezQwQTKYR68sKbTM2t-0-3f560e80bf88cf7aef4ac70ce4cd2c0b)
【示例2】本例与示例1类似,不过不是画圆,而是画矩形。这里还可以看出,rgba()可以分别设置轮廓和填充样式,因而具有更好的可操作性和使用灵活性,效果如图4.18所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4071.jpg?sign=1739285563-Hd38xwrBJ0M7ZQCq7m2o1mfx7KCKi50y-0-9480286e4457f3d7d5dad22519e5eb49)
图4.18 用rgba()方法设置不透明度
具体代码解析请扫码学习。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4147.jpg?sign=1739285563-pVjpI8tjpXAsjYrcZ3MFgC6qkRLR6y5d-0-fce3095144a71ff893217400302d26af)
线上阅读
4.3.3 实线
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4144.jpg?sign=1739285563-tfaMx70FMLhlaZhNZJwIXXFZARQFOLHu-0-90955a5d40cfa44cfd365162dc953930)
视频讲解
1.线的粗细
使用lineWidth属性可以设置线条的粗细,取值必须为正数,默认为1.0。
【示例1】下面示例使用for循环绘制了12条线宽依次递增的线段,效果如图4.19所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_78387.jpg?sign=1739285563-Mxd1y3B8Pm9m8g6qJGPHSs83w57g01HO-0-5db0da6783e107243266e78627936d53)
2.端点样式
lineCap属性用于设置线段端点的样式,包括三种样式:butt、round和square,默认值为butt。
【示例2】下面示例绘制了三条蓝色的直线段,并依次设置上述三种属性值,两侧有两条红色的参考线,以方便观察,预览效果如图4.20所示。可以看到这三种端点样式从上到下依次为平头、圆头和方头。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_78388.jpg?sign=1739285563-xhWN41ZtJ8RHHJUocntCfwdoGVsxUKi8-0-90b99d4cb68c66bc7013fcd49a2a17a6)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_4303.jpg?sign=1739285563-DckQ0zGTs47wJYl5Iopg6mJuoGQxF4yI-0-271ce710cf031f3af5c24bad9f04df33)
图4.19 lineWidth示例
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_4304.jpg?sign=1739285563-BGhEYF3jrBlwwLCpFGi9MTtwAxs3eps0-0-f95baf630888f4e08725b0735184e773)
图4.20 lineCap示例
3.连接样式
lineJoin属性用于设置两条线段连接处的样式,包括三种样式:round、bevel和miter,默认值为miter。
【示例3】下面示例绘制了三条蓝色的折线,并依次设置上述三种属性值,观察拐角处(即直线段连接处)样式的区别。在浏览器中的预览效果如图4.21所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_78390.jpg?sign=1739285563-apDNC1CLemmUo3YxcDbPRFmLHuVZtPYH-0-15a69cfe7b43aa7532a1273349c75bde)
4.交点方式
miterLimit属性用于设置两条线段连接处交点的绘制方式,其作用是为斜面的长度设置一个上限,默认为10,即规定斜面的长度不能超过线条宽度的10倍。当斜面的长度达到线条宽度的10倍时,就会变为斜角。如果lineJoin属性值为round或bevel时,miterLimit属性无效。
【示例4】通过下面示例可以观察当角度和miterLimit属性值发生变化时斜面长度的变化。在运行代码之前,也可以将miterLimit属性值改为固定值,以观察不同的值产生的结果,效果如图4.22所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_78392.jpg?sign=1739285563-j3VIbbtQ1HWjlIStpTz5bVlZiSGMKXzq-0-9dec04440177f9997e9af26250c8b1d4)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4492.jpg?sign=1739285563-splaTgzmiO1foZeRJK2ZGidQzIPzKfqQ-0-2a88f0fc059028c26572836ef6218e05)
图4.21 lineJoin示例
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4493.jpg?sign=1739285563-FILKxIaJtjq43WKZgkk5bslBCoWb8bZd-0-95bff85997eb25e80426cfb345fec058)
图4.22 miterLimit示例
4.3.4 虚线
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4498.jpg?sign=1739285563-b2SJzU5GHUEiA2XIggGqg4RGzHO1pHeH-0-cd12a4beb0463898fde5d14e23fdd759)
视频讲解
使用setLineDash()方法和lineDashOffset属性可以定义虚线样式。setLineDash()方法接收一个数组来指定线段与间隙的交替,lineDashOffset属性设置起始偏移量。
【示例】下面示例绘制一个矩形虚线框,然后使用定时器设计每隔0.5秒重绘一次,重绘时改变lineDashOffset属性值,从而创建一个行军蚁的效果,效果如图4.23所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_78394.jpg?sign=1739285563-u13SY79kdU0yG3Ov7PN7t9vAD7XyywiY-0-10493f56ba20fed9705a6fe856cceab9)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_4624.jpg?sign=1739285563-W7nG6y9GiV3kuOUm7ow2xMBig08W0GMe-0-d0c410777fdcd223ae8becc84f3665af)
图4.23 设计动态虚线框
注意:在IE浏览器中,从IE 11开始才支持setLineDash()方法和lineDashOffset属性。
4.3.5 线性渐变
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_4650.jpg?sign=1739285563-0NsGpiIuzsbjHENQDjAmTJgpK1EHHN6r-0-dfe22ee7b7b9ad7516121770c411a206)
视频讲解
要绘制线性渐变,首先使用createLinearGradient()方法创建canvasGradient对象,然后使用addColorStop()方法进行上色。
createLinearGradient()方法的用法如下所示:
context.createLinearGradient(x0,y0,x1,y1);
参数说明如下:
x0:渐变开始点的x坐标。
y0:渐变开始点的y坐标。
x1:渐变结束点的x坐标。
y1:渐变结束点的y坐标。
addColorStop()方法的用法如下所示:
gradient.addColorStop(stop,color);
参数说明如下:
stop:介于0.0与1.0的值,表示渐变中开始与结束之间的相对位置。渐变起点的偏移值为0,终点的偏移值为1。如果position值为0.5,则表示色标会出现在渐变的正中间。
color:在结束位置显示的CSS颜色值。
【示例】下面示例演示如何绘制线性渐变。在本例中共添加了8个色标,分别为红、橙、黄、绿、青、蓝、紫、红,预览效果如图4.24所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P110_78395.jpg?sign=1739285563-aj0liKiM54yhGF4GqxqRZ7I1Zdy1nJIq-0-449dbcb9cc34f38b0d8dc8bb18219b71)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P110_4758.jpg?sign=1739285563-sZlPrrflXqzK94jt7Ij97qMDG8Com5cI-0-55b480dea37e1858352a64e7f9e7a5cb)
图4.24 绘制线性渐变
使用addColorStop()方法可以添加多个色标,色标可以在0~1任意位置添加,例如,从0.3处开始设置一个蓝色色标,再在0.5处设置一个红色色标,则0~0.3都会填充为蓝色。0.3~0.5为蓝色到红色的渐变,0.5~1则填充为红色。
4.3.6 径向渐变
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P110_4771.jpg?sign=1739285563-29syPoBVweTJTDRgBuUzVcoLRHIDah49-0-4d310bb08854f5be3092b187be5e850e)
视频讲解
要绘制径向渐变,首先需要使用createRadialGradient()方法创建canvasGradient对象,然后使用addColorStop()方法进行上色。
createRadialGradient()方法的用法如下。
context.createRadialGradient(x0,y0,r0,x1,y1,r1);
参数说明如下:
x0:渐变的开始圆的x坐标。
y0:渐变的开始圆的y坐标。
r0:开始圆的半径。
x1:渐变的结束圆的x坐标。
y1:渐变的结束圆的y坐标。
r1:结束圆的半径。
【示例】下面示例使用径向渐变在画布中央绘制一个圆球形状,预览效果如图4.25所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_78397.jpg?sign=1739285563-y59oFiVNipazBmA3ZzOcPIbBhV4PrQvp-0-642829caec15c0a076594a8d98a49342)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_4861.jpg?sign=1739285563-7rg82vyqwAGj1XY6rAF9vZAqLcgPJ5bL-0-4aaa496c05ba4bba64e58bb8cc71e8a9)
图4.25 绘制径向渐变
4.3.7 图案
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_4898.jpg?sign=1739285563-P7Xu0W9a4KIenXe5aLnA6S51jAH9OQhj-0-4a78ac3aab71852d9133a11d9ba09213)
视频讲解
使用createPattern()方法可以绘制图案效果,用法如下所示。
context.createPattern(image,"repeat|repeat-x|repeat-y|no-repeat");
参数说明如下:
image:规定要使用的图片、画布或视频元素。
repeat:默认值。该模式在水平和垂直方向重复。
repeat-x:该模式只在水平方向重复。
repeat-y:该模式只在垂直方向重复。
no-repeat:该模式只显示一次(不重复)。
创建图案的步骤与创建渐变有些类似,需要先创建出一个pattern对象,然后将其赋予fillStyle属性或strokeStyle属性。
【示例】下面示例以一幅png格式的图像作为image对象用于创建图案,以平铺方式同时沿x轴与y轴方向平铺。在浏览器中的预览效果如图4.26所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_78398.jpg?sign=1739285563-o0Da6sawz3k05tt2g0XNZ7NL7ImBXgIZ-0-4d7ec5d349b0fa4f85938483c7c8bd42)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_4962.jpg?sign=1739285563-SPXhTPynKWFGsM9PwwaYaPnA7DBNtwY3-0-ec3444d0524a146e78a97d0b904d7a1e)
图4.26 绘制图案
4.3.8 阴影
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_5043.jpg?sign=1739285563-0qMfwnnxN9t6zIdfIFKVXwLuBlqRMyPU-0-932b42949d74f6e7ef5fa8cbfb78f6b8)
视频讲解
创建阴影需要4个属性,简单说明如下:
shadowColor:设置阴影颜色。
shadowBlur:设置阴影的模糊级别。
shadowOffsetX:设置阴影在x轴的偏移距离。
shadowOffsetY:设置阴影在y轴的偏移距离。
【示例】下面示例演示创建文字阴影效果,如图4.27所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_4971.jpg?sign=1739285563-zzTRogWdbY5ufanOQqbafEcfKPsBYuA4-0-bb7b5e97730228a2a6e44c0d0496ca58)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_5040.jpg?sign=1739285563-vkS7UJDTIi6hQl49gHoLa3Mg13sEZ80C-0-bd104474ea3d0c650b9a9084f7fb49ef)
图4.27 为文字设置阴影效果
4.3.9 填充规则
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5125.jpg?sign=1739285563-eoX6JtUU9VTRqrEOQ6kX4tCTIehwg9DO-0-2a5513bbe12d90e21a47cdad214b4359)
视频讲解
前面介绍了使用fill()方法可以填充图形,该方法可以接收两个值,用来定义填充规则。取值说明如下:
"nonzero":非零环绕数规则,为默认值。
"evenodd":奇偶规则。
填充规则根据某处在路径的外面或者里面来决定该处是否被填充,这对于路径相交或者路径被嵌套的时候是有用的。
【示例】下面示例使用evenodd规则填充图形,则效果如图4.28所示,默认填充效果如图4.29所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_78403.jpg?sign=1739285563-tmeBhOlJVrAQgyqykTtB7bGuS4DNpaAb-0-1a74ec707641913b772f2203e25fea14)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5110.jpg?sign=1739285563-D8IdDMmqJ8Cabj6cm95X7UoLUyX90Yaz-0-22b47cb4c9c79300e6342e0ce4f3d666)
图4.28 evenodd规则填充
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5111.jpg?sign=1739285563-BBdgc2jmqUiNN7Z1enGzXRLqw3uCV6WQ-0-6d6e59df1671f1bad2491e9950c72a41)
图4.29 nonzero规则填充
注意:IE暂不支持evenodd规则填充。