![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=1738864142-tYORABcJUJ0FaaA6M9jZDgmFHYn9xWQG-0-f304ea85ee3baed6e2f241b61cc6f199)
视频讲解
使用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=1738864142-ZLEVfvRpMNv0tGvt2lJedhkWmC19WorK-0-bb6b492067bbbf471ac3a772a94cf53f)
在嵌套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=1738864142-3XVLPdAw6FuAh5MK0gM8UxpCtuO3avNW-0-51045ad662c56456bc36a730552c66af)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3913.jpg?sign=1738864142-UACwBAHBs1TlMq8LoG7PVN0KpeEBQzhG-0-90edae4ae7589fc0bdcb4fc087fa0f0e)
图4.15 绘制渐变色块
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3914.jpg?sign=1738864142-Nhp4g7PKGG5QVHTyV6o4Q3qdUhfNHMNb-0-37c08c3851849b96b6d2d03ac9dcb76f)
图4.16 绘制渐变圆圈
4.3.2 不透明度
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3963.jpg?sign=1738864142-rqikdevd9uIASO83jBA00zFBD4IuipZK-0-89a2ba3fba4b4540225b9bb87d60985e)
视频讲解
使用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=1738864142-3u9y5aL5gdZ3csbG01r39uNzFepERTy7-0-4872aa20849e328fd101c3843d859bdb)
图4.17 用globalAlpha设置不透明度
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_78384.jpg?sign=1738864142-nFbpTXa85DJe9WWBB57FqIWJsy9OCu12-0-9d6156abac8423b7a7e88f14bf3c4360)
【示例2】本例与示例1类似,不过不是画圆,而是画矩形。这里还可以看出,rgba()可以分别设置轮廓和填充样式,因而具有更好的可操作性和使用灵活性,效果如图4.18所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4071.jpg?sign=1738864142-KHaCI9tkoMUKL0fJ4MHevWsaly9biTSZ-0-ae90ad769363b1a3d483de5392860e86)
图4.18 用rgba()方法设置不透明度
具体代码解析请扫码学习。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4147.jpg?sign=1738864142-dR78eOlmOYl1NXM0Xg1jFIyE70yQT1gD-0-858997d4e1764c3fde260f2e7da62eb5)
线上阅读
4.3.3 实线
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4144.jpg?sign=1738864142-c0SvNnXmQL06asVY7kdecHtwgHQgygFL-0-8fafe718ff9bcced8144e12a0a3a2636)
视频讲解
1.线的粗细
使用lineWidth属性可以设置线条的粗细,取值必须为正数,默认为1.0。
【示例1】下面示例使用for循环绘制了12条线宽依次递增的线段,效果如图4.19所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_78387.jpg?sign=1738864142-MigQYkLEjMCB6EvEWT40jjbBCxz6vprJ-0-11edac3e686a0a79f083351543474563)
2.端点样式
lineCap属性用于设置线段端点的样式,包括三种样式:butt、round和square,默认值为butt。
【示例2】下面示例绘制了三条蓝色的直线段,并依次设置上述三种属性值,两侧有两条红色的参考线,以方便观察,预览效果如图4.20所示。可以看到这三种端点样式从上到下依次为平头、圆头和方头。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_78388.jpg?sign=1738864142-lRIqcQ4p3amXeccW5rzR9lTHBLSbK04i-0-054b0774ce82187c29e6d147e43bae52)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_4303.jpg?sign=1738864142-DGiDyD3Q9iwRzNPTYWNz3vKLvk0r1fJy-0-5b8ca52e3e42cecc01f85b05f5a60f71)
图4.19 lineWidth示例
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_4304.jpg?sign=1738864142-aQHDn7cSCn3cu8qNlbOH6jQpaDs220Mb-0-39976fa0463679f167c1d55685585224)
图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=1738864142-i8dFIdSJ4n2kEmnGl8THNlkivqZqjyFh-0-553265dfedf6b204ab8393df38d03072)
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=1738864142-0S53UDyZP2D3wwzp87vzf9dlloVrmRF6-0-282cc3d8f0ef3d26b48dfd94823f99be)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4492.jpg?sign=1738864142-VRIFyyJDxT5xUbxmWw5uBA1P7GeSWtVA-0-c4f54e96f32854614245cfc06b911f5b)
图4.21 lineJoin示例
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4493.jpg?sign=1738864142-UwZ7dOVxYA8uLlNmM0qxq8ToDCAhOJFR-0-9373e98969b7837bffc2018a4d965b96)
图4.22 miterLimit示例
4.3.4 虚线
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4498.jpg?sign=1738864142-MghtGnUiMGOQ6VxbxVGGwfqvjcEDeAhS-0-829cbceb425ace697826c9e2af32e359)
视频讲解
使用setLineDash()方法和lineDashOffset属性可以定义虚线样式。setLineDash()方法接收一个数组来指定线段与间隙的交替,lineDashOffset属性设置起始偏移量。
【示例】下面示例绘制一个矩形虚线框,然后使用定时器设计每隔0.5秒重绘一次,重绘时改变lineDashOffset属性值,从而创建一个行军蚁的效果,效果如图4.23所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_78394.jpg?sign=1738864142-8PdFxvbU1TpGhLI8ry0n9kKVTvGSyPxX-0-3819dbaf16c7d93ace7e7fd29152fdf2)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_4624.jpg?sign=1738864142-xUZhxltMSyqzdI5rsVsEhaXHWfZvaVV6-0-db8a5c3ea2d78ca7f8fee2ab8b7e3793)
图4.23 设计动态虚线框
注意:在IE浏览器中,从IE 11开始才支持setLineDash()方法和lineDashOffset属性。
4.3.5 线性渐变
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_4650.jpg?sign=1738864142-6a4JTwRR5I64IHW6lVhVjHAosz0TgrUj-0-15607ce379b089b4b4b623e417439d10)
视频讲解
要绘制线性渐变,首先使用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=1738864142-pyid3WQlncWAeaROsJHB7dAFL4SObmoH-0-1720b5d6537147e9eeeaddf44d8da375)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P110_4758.jpg?sign=1738864142-u1UzHjzpvxPBGvz68qEkspJILcOyqe5W-0-783adbd6d1548eb2f76b5fffd3d58a24)
图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=1738864142-Ui1ZcLlMEauKWXhc41FRLUvQMzMdSjGx-0-c01f3f9270f890271b57e785f7744834)
视频讲解
要绘制径向渐变,首先需要使用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=1738864142-a1p72XSu9wAGpITsF5sr6vzkLcgWWHmO-0-f971acf355c829925ce85c3e810ce695)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_4861.jpg?sign=1738864142-Oy9OioL9IANC1qjHKdcmrYHQ0gJxMpzV-0-2998f82250228cabc256814e696cddf9)
图4.25 绘制径向渐变
4.3.7 图案
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_4898.jpg?sign=1738864142-mOrRhwwuNjsrwL5ZjTyZMcjk5A0x2d3F-0-42b18d53d6461be785791d33541cc152)
视频讲解
使用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=1738864142-tQi2YzxoVv7HfZQ1xhGAKJWKk2PjNUS1-0-3dd9445f6b4575a0ffdcd06f9d40c427)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_4962.jpg?sign=1738864142-kE8VgxcWgrJ4aI7SctGnaSUc5jz8z5gq-0-179937ff0b7741e7d0bbf1b340b6b9b5)
图4.26 绘制图案
4.3.8 阴影
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_5043.jpg?sign=1738864142-t1eaHQm9eYq8N9KdGhLxN1965kjaVctk-0-0d5d0770e0a5d9bbd4a14252a99a1698)
视频讲解
创建阴影需要4个属性,简单说明如下:
shadowColor:设置阴影颜色。
shadowBlur:设置阴影的模糊级别。
shadowOffsetX:设置阴影在x轴的偏移距离。
shadowOffsetY:设置阴影在y轴的偏移距离。
【示例】下面示例演示创建文字阴影效果,如图4.27所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_4971.jpg?sign=1738864142-VEjlenwms8jJ1BC9JItq2lQTB0amUdRz-0-a98bd0de25edad67c93aa6ea2489dce2)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_5040.jpg?sign=1738864142-FCQ30D63HcNdLkG77oPkA09CY5NCr8B8-0-139d360e5ee9a09e21d0f9fb4b775eea)
图4.27 为文字设置阴影效果
4.3.9 填充规则
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5125.jpg?sign=1738864142-jzuBoLG7051RHTrLTDmjkEHYjxoTnu27-0-681e4b244a5d208317c3e82325443eb1)
视频讲解
前面介绍了使用fill()方法可以填充图形,该方法可以接收两个值,用来定义填充规则。取值说明如下:
"nonzero":非零环绕数规则,为默认值。
"evenodd":奇偶规则。
填充规则根据某处在路径的外面或者里面来决定该处是否被填充,这对于路径相交或者路径被嵌套的时候是有用的。
【示例】下面示例使用evenodd规则填充图形,则效果如图4.28所示,默认填充效果如图4.29所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_78403.jpg?sign=1738864142-cMSKUFMeCBUus0RoGdJc42W1i9BCocLD-0-549d0d7c52a29d985fa20be9fbc0c420)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5110.jpg?sign=1738864142-4didf6E2QzEipo0zWufN4SYo4Ob1MypX-0-4002f8f77a792f566f40f7bc9755fd0c)
图4.28 evenodd规则填充
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5111.jpg?sign=1738864142-Y7XyK7w9Fp2Yn26eTVqsvPGgZdMgeXFy-0-f74b523374b7fb1932134aa360459d5f)
图4.29 nonzero规则填充
注意:IE暂不支持evenodd规则填充。