暗黑模式
填充(fill),渐变(graidents),图案(patterns)
前端教程SVG
前面的课程中我们使用过 fill 属性填充背景色,但都是简单地设置为 red blue 等基础颜色,本节详细介绍 fill 的各种用法。
fill 基本语法
html
<xx fill="colorKeyword" /> <!-- 颜色关键字 -->
<xx fill="customColor" /> <!-- 自定义颜色 -->
<xx fill="rgb(r,g,b)" /> <!-- 颜色函数 -->
<xx fill="rgba(r,g,b,a)" /> <!-- 颜色函数 -->
<xx fill="hsl(h,s,l)" /> <!-- 颜色函数 -->
<xx fill="hsla(h,s,l,a)" /> <!-- 颜色函数 -->
<xx fill="var(--some-color)" /> <!-- var 颜色变量 -->
<xx fill="url(#gradientId)" /> <!-- 引用渐变色 -->
<xx fill="url(#patternId)" /> <!-- 引用图案 -->
<xx fill="url(#patternId) defaultColor" /> <!-- 回退语法 -->
<xx fill="child(N)"> <!-- 引用第 N 个子元素作为填充色 -->
<linearGradient>
<stop stop-color="green" offset="0"/>
<stop stop-color="lightBlue" offset="1"/>
</linearGradient>
<radialGradient>
<stop stop-color="green" offset="0"/>
<stop stop-color="lightBlue" offset="1"/>
</raGradient>
</xx>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
颜色关键字
已命名颜色(Named Colors)
类似 CSS color 属性,fill 也支持内置的已命名的颜色,如 red blue black white 等。
html
<xx fill="red" />
<xx fill="blue" />1
2
2
currentColor 关键字
currentColor 指的是当前元素的 color property 值,如果 当前元素的 color 没有设置,则使用 inherited 值,一般就是父元素的 color property。
transparent 和 none 关键字
transparent 即透明,none 即不填充背景,两者效果相同,区别在于:
transparent:鼠标可以 hovernone:鼠标无法 hover
自定义颜色和颜色函数
| 名称 | 语法 | 示例 |
|---|---|---|
| 十六进制代码 | #HEX_CODE | #F00 或 #FF0000 #FF000080 备注:大小写不敏感 |
| 整数 RGB 函数 | rgb(r, g, b) rgba(r, g, b, a) | rgb(255, 0, 0) rgb(255, 0, 0, 0.5) |
| 百分比 RGB 函数 | rgb(pr, pg, pb) rgba(pr, pg, pb, pa) | rgb(100%, 0%, 0%) rgb(100%, 0%, 0%, 50%) |
| HSL 函数 | hsl(h, s, l) hsla(h, s, l, a) | hsl(120,100%,50%) hsla(120,100%,50%,0.3) |
var 颜色变量
类似 CSS 中 color: var(--some-color, defaultColor),
SVG fill 也支持这种语法:fill="var(--some-color, currentColor)"
渐变色和图案
关于渐变色和图案,请往下阅读 Paint Servers。
回退语法
当 #patternId 不存在时,则回退使用 defaultColor(可以是自定义颜色、颜色关键字等)。
html
<xx fill="url(#patternId) defaultColor" />1
示例
fill 相关属性
fill-opacity
除了可以在 rgba 函数中设置颜色的透明比例外,SVG 也可以通过 fill-opacity 单独控制透明比例。
html
<xx fill="red" fill-opacity="0.5" ... />
<xx fill="red" fill-opacity="50%" ... />1
2
2
- 整数:取值 0~1,0表示完全透明,1表示完全不透明。
- 或者 百分比:取值 0%~100%,0%表示完全透明,100%表示完全不透明。
Paint Servers
fill=url(#paintServerId) 引用另外一个用来描述如何填充形状背景的元素,这个元素被称为 Paint Server,如渐变颜色、图案等。
Gradients 渐变颜色
<linearGradient> 线性渐变
<linearGradient> 是沿着一条渐变线(the gradient vector)的渐变元素。
基本语法:
html
<svg>
<defs>
<linearGradient id="myGradient" x1="0%" y1="0%" x2="100%" y2="100%" spreadMethod="pad" href="#templateGradient">
<stop stop-opacity="1" stop-color="red" offset="0" />
<stop stop-opacity="1" stop-color="yellow" offset="0.33333" />
<stop stop-opacity="1" stop-color="green" offset="0.66666" />
<stop stop-opacity="1" stop-color="blue" offset="1" />
</linearGradient>
</defs>
</svg>1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
(x1, y1)为渐变线的起点,(x2, y2)为渐变线的终点,可以是数字和百分比spreadMethod="pad|reflect|repeat",定义如何填充超过渐变线起始点的区域,默认pad<stop>控制在渐变线的某个位置使用某个颜色,stop-opacity指透明度,stop-color指颜色,offset指渐变线的位置stop-color="red" offset="0"在起始位置使用红色stop-color="yellow" offset="0.33333"从起始位置(红色)渐变到 33.333%(黄色)stop-color="green" offset="0.33333"从 33.333%(黄色)渐变到 66.666%(绿色)stop-color="blue" offset="1"从 66.666%(绿色)渐变终点(蓝色)
href="#templateGradient"引用另外一个线性渐变作为模板
示例(可拖拽起止点):
<radialGradient> 径向渐变
<radialGradient> 是从一个起始圆形渐变到终止圆形的渐变元素。
基本语法:
html
<radialGradient id="myGradient" spreadMethod="pad" fx="50%" fy="50%" fr="0%" cx="50%" cy="50%" r="50%" href="#templateGradient">
<stop stop-color="red" offset="0" />
<stop stop-color="yellow" offset="50%" />
<stop stop-color="blue" offset="100%" />
</radialGradient>1
2
3
4
5
2
3
4
5
(fx,fy)为起始圆形圆心坐标,fr为其半径;- 默认情况下
fx="50%" fy="50%" fr="0%"
- 默认情况下
(cx,cy)为终止圆形圆心坐标,r为其半径;- 默认情况下
cx="50%" cy="50%" r="50%"
- 默认情况下
spreadMethod<stop>href同线性渐变。
示例(可拖拽圆心):
渐变单位和变换
html
<linearGradient ... gradientUnits="objectBoundingBox | userSpaceOnUse">
...
</linearGradient>
<linearGradient ... gradientTransform="translate(20,20) scale(2) rotate(45)">
...
</linearGradient>1
2
3
4
5
6
2
3
4
5
6
gradientUnits:定义(x1,y1)(x2,y2)所使用的坐标系统userSpaceOnUse:相对于 SVG 用户空间坐标。objectBoundingBox(默认):坐标系统为 1×1 的正方形,映射到引用元素的BoundingBox,此时(x1,y1)(x2,y2)如果是数字的话,取值范围为0~1。
gradientTransform:定义渐变的矩阵变换
<pattern> 图案
<pattern> 元素定义了一个矩形区域的图案,fill 或 stroke 使用它填充图形背景。
<pattern> 元素内部可以是任意的 SVG 图形:纯色背景形状、渐变色背景形状、纯文本、嵌入的图片、甚至是填充了其他 pattern 的图形。
基本语法
html
<svg>
<defs>
<pattern id="myPattern"
patternUnits="objectBoundingBox" patternContentUnits="userSpaceOnUse"
perserveheightWidthRatio="xMidYMid" viewBox="0,0,20,20"
x="0" y="0" width="10%" height="10%"
href="#templatePattern">
......任意 SVG 图形
</pattern>
</defs>
</svg>1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
patternUnits="objectBoundingBox(默认) | userSpaceOnUse":定义xywidthheight的坐标系统patternContentUnits取值同上,是<pattern>内容元素的坐标系统viewBox用户空间,perserveheightWidthRatio宽高比例- 当设置了
viewBox后,patternContentUnits会失效
- 当设置了
x, y:<pattern>元素左上角的偏移量width, height:<pattern>元素的宽和高,可以是百分比、绝对数值、0~1href="#templatePattern"引用其他图案作为模板使用
示例1
示例2
更多 Paint Servers
<solidcolor> <hatch> <meshgradient> 这些元素还没有被普遍支持,其用法此处不做介绍了。
小结
本节讲解了 fill 的各种用法,包括渐变颜色(Gradients)和图案(Patterns),下节我们学习 stroke 的各种用法。






