![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=1738888092-Er3kaadDOlMmjyZv7BX1JxW0pxmS7ul2-0-970419496a26204ee85071b1587de434)
视频讲解
使用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=1738888092-WRhd9mY2WzTC9uDlpOvCxzSiQ10WDbr6-0-467c8d5d43c6c1af543d5e1ca5c52967)
在嵌套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=1738888092-e2fdVA4ct8cedsvezhMXx1FIvgeRVX62-0-3d68d1e075d3fbe0fe5e2345731f9007)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3913.jpg?sign=1738888092-GsbNOUuaO5AYyJDIgzVOrB9dEe4vQCTv-0-e729ea93bbaf823eef487363cc795b3b)
图4.15 绘制渐变色块
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3914.jpg?sign=1738888092-CImOA7Vws02JYOljEntNsIZfq2Ev9fbx-0-159ed72dc59324a01a9ea48eb82d8a00)
图4.16 绘制渐变圆圈
4.3.2 不透明度
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_3963.jpg?sign=1738888092-G4U6wszCsZ0KmLRRIFCSfMgCLlEmCMo5-0-a8df1df0ccdabf50e1bb8d72dd423406)
视频讲解
使用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=1738888092-wgQoTciqPh2VCMmZa7NcoqzvFDS1JTHs-0-d1b51f67aac776e72e65c84ccca3aab0)
图4.17 用globalAlpha设置不透明度
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P105_78384.jpg?sign=1738888092-6Ts9XyUQaYt4nP3RSbF4SD59ripUOIXb-0-a75ae4898008d28f1db740aa28c5523b)
【示例2】本例与示例1类似,不过不是画圆,而是画矩形。这里还可以看出,rgba()可以分别设置轮廓和填充样式,因而具有更好的可操作性和使用灵活性,效果如图4.18所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4071.jpg?sign=1738888092-4WNx4PY8vlnPfOX1RTwGrRvfahNkF2Vz-0-b05aba441a529db8b11efa93d5bdc8a9)
图4.18 用rgba()方法设置不透明度
具体代码解析请扫码学习。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4147.jpg?sign=1738888092-FSRFyZT8dfFcxrHksDRkJI80yS8OPM3Y-0-253fbcb4da07dfd6406b5e3616deb662)
线上阅读
4.3.3 实线
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_4144.jpg?sign=1738888092-tSjgv7wV553hpGkgvsOJNvCFoXPjmuvI-0-9d6fdd7021a0ac86518d0cf31a41ddd5)
视频讲解
1.线的粗细
使用lineWidth属性可以设置线条的粗细,取值必须为正数,默认为1.0。
【示例1】下面示例使用for循环绘制了12条线宽依次递增的线段,效果如图4.19所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P106_78387.jpg?sign=1738888092-BFGczNgzmGKXF0bY6dDMws5EACFVJhud-0-7572dc670f131b7ed20d3dfa88300788)
2.端点样式
lineCap属性用于设置线段端点的样式,包括三种样式:butt、round和square,默认值为butt。
【示例2】下面示例绘制了三条蓝色的直线段,并依次设置上述三种属性值,两侧有两条红色的参考线,以方便观察,预览效果如图4.20所示。可以看到这三种端点样式从上到下依次为平头、圆头和方头。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_78388.jpg?sign=1738888092-iar14lfEQesaqnnMCpoaUn6PHXYO6Dzs-0-6a358926301938b5392037b87def36b0)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_4303.jpg?sign=1738888092-Tq6ZLFnGVmpYtv01jCaQF3zyRqnvXw9f-0-0163480a3f5b5a64c5c1c15a85f01211)
图4.19 lineWidth示例
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P107_4304.jpg?sign=1738888092-ULhqDL3OJWFICJfgaAJZnQigbE4Voszc-0-286393488c54258d3167559dc8fb1e25)
图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=1738888092-RfJuTEPHiSxgouCyXerYW0R49WLNNE2r-0-6be86b2d7be122fe7582094a7258d682)
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=1738888092-RH5joVIi5pxo3jXDR1J0lJD4PI5pC5v3-0-b19de94d8ed5e96a8a69191ec9f0ecb9)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4492.jpg?sign=1738888092-JhIV7nrrODiXrHfibxk4vtHQDcpPnhPX-0-fd5d3fe5c27d3b0981ccceb7e09e7055)
图4.21 lineJoin示例
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4493.jpg?sign=1738888092-rNYHjyqJYfr2OKulEC9WhoBp5q1Yvrpy-0-875285517481631c00460ff39891f75a)
图4.22 miterLimit示例
4.3.4 虚线
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P108_4498.jpg?sign=1738888092-H4cV7wsOxbrTGYPWYzQpcytb00YE1MHZ-0-30c72c36d131c8513b02a9a602a796b5)
视频讲解
使用setLineDash()方法和lineDashOffset属性可以定义虚线样式。setLineDash()方法接收一个数组来指定线段与间隙的交替,lineDashOffset属性设置起始偏移量。
【示例】下面示例绘制一个矩形虚线框,然后使用定时器设计每隔0.5秒重绘一次,重绘时改变lineDashOffset属性值,从而创建一个行军蚁的效果,效果如图4.23所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_78394.jpg?sign=1738888092-GMc60KPseVZVFnNyM0w2sDg2xq30y7dY-0-e1d8768b10600ba7d201819846a446da)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_4624.jpg?sign=1738888092-Z8cf4vmv5avTWLfxYbzYdLNlEo7mfleC-0-ed1c914927926acf859871034a657f22)
图4.23 设计动态虚线框
注意:在IE浏览器中,从IE 11开始才支持setLineDash()方法和lineDashOffset属性。
4.3.5 线性渐变
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P109_4650.jpg?sign=1738888092-1eSDcEtbDs46FCwcnh147dhqQbIPFwqp-0-24c798f7d4efd463e31fc11eb586155e)
视频讲解
要绘制线性渐变,首先使用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=1738888092-K6qB4LVnz4rBFZKjVuH0ViiEDFgMV1uM-0-55f4b3fe48a3ca5897e3c8a9a843c487)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P110_4758.jpg?sign=1738888092-n6tavZPaIn0gTHud2JB4xKeKgpWBxObK-0-82dc8ae07401eed30d7f8d924e4d49eb)
图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=1738888092-kYuJMmNE6lyS5qZZUdx3trIfYVXecyAP-0-f01967daedd18894d89443a53baee6aa)
视频讲解
要绘制径向渐变,首先需要使用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=1738888092-2AFCeLdxJkXy6w2lBdbiadYP2Wew4jeX-0-6926f232f65a7d9d7ef4beb5fdb9248c)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_4861.jpg?sign=1738888092-7vjcA7mODQa7QLl8KclABEg7xT1KARza-0-d676c3593af8e9b42ba112964de210b7)
图4.25 绘制径向渐变
4.3.7 图案
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P111_4898.jpg?sign=1738888092-Iix0cEIkKRaJe13uOe3P30OisVfPmjQJ-0-965f52d5f99abd28fb34d5313a17b861)
视频讲解
使用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=1738888092-qy71sB5rckpExyL6nXmEYKeZjbunZk6d-0-02f9045bcababc5e6f40efbd77c21650)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_4962.jpg?sign=1738888092-IsFz0ddJNPdj1cRO6a4gQ6ZIMylL8eS4-0-d3e5787a47927ec7a724ac75ae5a38e3)
图4.26 绘制图案
4.3.8 阴影
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_5043.jpg?sign=1738888092-mjSwHmQLXvhxEaTcXxRU4XfnQ4e2TIAZ-0-423c451489a71cddf98d43eb7044f0e1)
视频讲解
创建阴影需要4个属性,简单说明如下:
shadowColor:设置阴影颜色。
shadowBlur:设置阴影的模糊级别。
shadowOffsetX:设置阴影在x轴的偏移距离。
shadowOffsetY:设置阴影在y轴的偏移距离。
【示例】下面示例演示创建文字阴影效果,如图4.27所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_4971.jpg?sign=1738888092-5ZUSLRn6iaShySsx1jZPaDgB93AB738u-0-69b263a68ef045f9c4fd05c435ee267d)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P112_5040.jpg?sign=1738888092-H6A7U8uLlJ6jggOfDCGPF5nTksZ1Foql-0-86dac0421aba6ceb0c15520129e9e278)
图4.27 为文字设置阴影效果
4.3.9 填充规则
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5125.jpg?sign=1738888092-Ddz06J0ZXv0RVwhbO5yg9nZKamCmkmxZ-0-86a9c4493036c26dab4fd0b213b2274e)
视频讲解
前面介绍了使用fill()方法可以填充图形,该方法可以接收两个值,用来定义填充规则。取值说明如下:
"nonzero":非零环绕数规则,为默认值。
"evenodd":奇偶规则。
填充规则根据某处在路径的外面或者里面来决定该处是否被填充,这对于路径相交或者路径被嵌套的时候是有用的。
【示例】下面示例使用evenodd规则填充图形,则效果如图4.28所示,默认填充效果如图4.29所示。
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_78403.jpg?sign=1738888092-pqbyJkQ9TJzdW4EkGsDeeqSZS4mEJekp-0-9026783067edfa1f749dbade1ef5844d)
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5110.jpg?sign=1738888092-Sh6rKJNnthBfIKRDZ2qpR49XHXbp22Xa-0-d069ea6390d572a4eb3e0f43aa86410c)
图4.28 evenodd规则填充
![](https://epubservercos.yuewen.com/1B54E6/13043253503832006/epubprivate/OEBPS/Images/Figure-P113_5111.jpg?sign=1738888092-LkczqI1x2a8XkAxhobmF1mStOgXAFmey-0-52c954589918f5e3c5d2f869188cb962)
图4.29 nonzero规则填充
注意:IE暂不支持evenodd规则填充。