常用形状
矩形
1 | <rect x="60" y="10" rx="10" ry="10" width="30" height="30"/> |
参数名 | 描述 |
---|---|
x | 矩形左上角的x位置 |
y | 矩形左上角的y位置 |
width | 矩形的宽度 |
height | 矩形的高度 |
rx | 圆角的x方位的半径 |
ry | 圆角的y方位的半径 |
圆形
1 | <circle cx="25" cy="75" r="20"/> |
参数名 | 描述 |
---|---|
r | 圆的半径 |
cx | 圆心的x位置 |
cy | 圆心的y位置 |
椭圆
1 | <ellipse cx="75" cy="75" rx="20" ry="5"/> |
参数名 | 描述 |
---|---|
rx | 椭圆的x半径 |
ry | 椭圆的y半径 |
cx | 椭圆中心的x位置 |
cy | 椭圆中心的y位置 |
线条
1 | <line x1="10" x2="50" y1="110" y2="150"/> |
参数名 | 描述 |
---|---|
x1 | 起点的x位置 |
y1 | 起点的y位置 |
x2 | 终点的x位置 |
y2 | 终点的y位置 |
折线
1 | <polyline points="60 110, 65 120, 70 115, 75 130, 80 125, 85 140, 90 135, 95 150, 100 145"/> |
points
点集数列。每个数字用空白、逗号、终止命令符或者换行符分隔开。每个点必须包含2个数字,一个是x坐标,一个是y坐标。所以点列表 (0,0), (1,1) 和(2,2)可以写成这样:“0 0, 1 1, 2 2”。
多边形
1 | <polygon points="50 160, 55 180, 70 180, 60 190, 65 205, 50 195, 35 205, 40 190, 30 180, 45 180"/> |
points
点集数列。每个数字用空白符、逗号、终止命令或者换行符分隔开。每个点必须包含2个数字,一个是x坐标,一个是y坐标。所以点列表 (0,0), (1,1) 和(2,2)可以写成这样:“0 0, 1 1, 2 2”。路径绘制完后闭合图形,所以最终的直线将从位置(2,2)连接到位置(0,0)。
路径
1 | <path d="M150 0 L75 200 L225 200 Z" /> |
参数含义:
- M = moveto
- L = lineto
- H = horizontal lineto
- V = vertical lineto
- C = curveto
- S = smooth curveto
- Q = quadratic Bézier curve
- T = smooth quadratic Bézier curveto
- A = elliptical Arc
- Z = closepath
以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
贝塞尔曲线
三次贝塞尔曲线
1
2
3
4
5// 语法
C x1 y1, x2 y2, x y (or c dx1 dy1, dx2 dy2, dx dy)
// 举例
<path d="M70 10 C 70 20, 120 20, 120 10" stroke="black" fill="transparent"/>最后一个坐标(x,y)表示的是曲线的终点,另外两个坐标是控制点,(x1,y1)是起点的控制点,(x2,y2)是终点的控制点
三次贝塞尔曲线简化
一般情况下,三次贝塞尔曲线的两个控制点对称,因此可以简化只写一个控制点。语法如下:
1 | S x2 y2, x y (or s dx2 dy2, dx dy) |
当S命令之前是C或者S命令的时候,这里的第一个控制点将是前面曲线的第二个控制点的中心对称点。
1 | <path d="M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80" stroke="black" fill="transparent"/> |
- 二次贝塞尔曲线
二次贝塞尔曲线仅需要一个控制点,来确认起点和终点的曲线斜率
1 | // 语法 |
- 二次贝塞尔曲线简化
当此前已有Q命令的时候,可以省去控制点,自动推算出一个新的控制点。如果此前无Q命令,则推算的控制点为终点,画出来的为直线。
1 | // 语法 |
弧形
1 | // 语法 |
参数的含义:rx、ry
表示椭圆的x轴和y轴的半径x-axis-rotation
表示x轴旋转角度,0则表示弧形所在的椭圆是正置的large-arc-flag
决定弧线是大于还是小于180度,0表示小角度弧,1表示大角度弧sweep-flag
表示弧线的方向,0表示从起点到终点沿逆时针画弧,1表示从起点到终点沿顺时针画弧
填充与边框
常用参数列举:
参数名 | 描述 |
---|---|
fill | 填充色 |
stroke | 描边色 |
fill-opacity | 填充色的不透明度 |
stroke-opacity | 描边色的不透明度 |
stroke-width | 描边宽度 |
stroke-linecap | 边框终点的形状: |
butt 直边结束线段,它是常规做法,线段边界90度垂直于描边的方向、贯穿它的终点 |
|
square 的效果差不多,但是会稍微超出实际路径的范围,超出的大小由stroke-width控制 |
|
round 表示边框的终点是圆角,圆角的半径也是由stroke-width控制的 |
|
stroke-linejoin | miter 是默认值,表示用方形画笔在连接处形成尖角,round 表示用圆角连接,实现平滑效果。bevel ,连接处会形成一个斜接 |
stroke-dasharray | 定义描边虚线类型,由一组用逗号分隔的数字组成。交替表示填色单位长度、空白单位长度。 |
举例
1 | <svg width="200" height="150" xmlns="http://www.w3.org/2000/svg" version="1.1"> |
渐变
定义在<defs>
标签内,指定id,其他元素通过id引用。可以用于fill
、stroke
线性渐变
1 | <svg width="120" height="240" version="1.1" xmlns="http://www.w3.org/2000/svg"> |
x1、x2、y1、y2指定了渐变的方向
径向渐变
1 |
|
cx、cy、r 指定了镜像渐变的范围,fx、fy 指定了焦点,即渐变的中心点
文字
x、y指定文本在视口中显示的位置。属性text-anchor
指定文本流的方向,可选sstart、middle、end、inherit
1 | <text x="10" y="10">Hello World!</text> |
可使用的属性:font-family、font-style、font-weight、font-variant、font-stretch、font-size、font-size-adjust、kerning、letter-spacing、word-spacing和text-decoration
其他用法:
1 | // tspan指定子元素 |
基础变形
元素
1 | <g fill="red"> |
平移translate
1 | <rect x="0" y="0" width="10" height="10" transform="translate(30,40)" /> |
旋转rotate
1 | <rect x="20" y="20" width="20" height="20" transform="rotate(45)" /> |
其他变换
skewX()
x轴斜切skewY()
y轴斜切scale()
缩放
剪切和遮罩
剪切
在剪切范围内的元素才会显示,如下代码仅显示上半部的圆形
1 | <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> |
遮罩
以下代码使用渐变遮罩,水平方向不透明度从0到1,则红色的矩形从左到右逐渐显示,叠加后产生渐变效果。
1 | <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> |
滤镜
滤镜元素可参考mdn文档:https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element#%E6%BB%A4%E9%95%9C%E5%85%83%E7%B4%A0
以下列举一个阴影效果的代码:
1 | <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> |
feOffset
使用Alpha通道残影偏移,接着feGaussianBlur
使用偏移的结果进行高斯模糊,最后feBlend
将原图像和上一步模糊后的阴影结合生成最后的效果。
图片
1 | <svg width="5cm" height="4cm" version="1.1" |
- 如果你没有设置x属性或y属性,它们自动被设置为0。
- 如果你没有设置height属性或width属性,它们自动被设置为0。
- 如果width属性或height等于0,将不会呈现这个图像。
SVG.js的使用
以上了解了svg基本的语法,但是自己绘制svg还是比较麻烦,这里记录下SVG.js
库的使用,可以简化绘制流程。
快速使用
可以cdn引入和npm安装,这里以Vue为例
1 | npm install @svgdotjs/svg.js |
1 | <template> |
常用绘图
绘图方法名称和svg形状名称基本一致,然后通过attr可设置属性,同时也可以通过属性名直接设置。使用方式和jQuery类似,支持链式调用。
1 | // 绘制矩形,设置矩形圆角 |
位置
通过attr
1
2
3
4// 矩形根据左上角移动
rect.attr({ x: 20, y: 60 })
// 圆形根据中心点移动
circle.attr({ cx: 50, cy: 40 })通过x、y坐标设置
1
2
3// 通过坐标轴移动方法时,均可以使用左上角和中心点,仅支持无单位坐标
rect.cx(20).cy(60)
circle.x(50).y(40)通过move方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14// 通过move方法指定坐标,左上角基准
rect.move(200, 350)
// 等价于
rect.x(200).y(350)
// 中心点移动
rect.center(150, 150)
// 等价于
rect.cx(200).cy(350)
// 相对坐标移动
rect.dmove(10, 30)
// 等价于
rect.dx(10).dy(30)动画
动画使用
animate
方法,再调用attr
、move
等方法之前使用。以下为使用的举例:默认
默认情况下duration
将设置为400
,delay
将设置为0
并when
设置为after
。
1 | rect.animate().move(150, 150) |
- 常用参数
第一个是duration
,第二个delay
和第三个when
。when
参数的取值:
- now:在此调用执行后立即播放动画
- absolute或start:将动画安排到时间线上的绝对时间
- relative:安排动画相对于其旧开始时间播放(对 animate() 调用无用)
- last或after:在时间轴上最后一个动画之后播放动画。如果没有,则立即播放动画(请参阅now)
1
rect.animate(2000, 1000, 'now').attr({ fill: '#f03' })
对象形式多参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17rect.animate({
duration: 2000,
delay: 1000,
when: 'now',
swing: true,
times: 5,
wait: 200
}).attr({ fill: '#f03' })
// 多个动画链接在一起
rect.animate().attr({ fill: '#f03' }).animate().dmove(50,50)
// 动画之间添加延迟
rect.animate().attr({ fill: '#f03' }).delay(200).animate().dmove(50,50)
// 直接在动画里面加延迟
rect.animate().attr({ fill: '#f03' }).animate({delay: 200}).dmove(50,50)缓动设置
缓动类型包括:
<>
: ease in and out>
: ease out<
: ease in-
: linear- 函数
beziere(x1, y1, x2, y2)
step(steps, stepPosition)
1
draw.circle(100).radius(50).fill("#ccB1B6").animate({ duration: 2000 }).ease('<').dmove(100);
事件
支持常见事件的绑定,例如:click、dblclick、mousedown、mouseup、mousemove、mouseout、mousemove、touchstart、touchmove、touchleave、touchend、touchcancel等单事件绑定
可直接通过事件名绑定:1
2
3
4
5
6element.click(function() {
this.fill({ color: '#f06' })
})
// 解绑事件
element.click(null)on绑定
可通过on绑定单个或多个事件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 单个事件绑定
var click = function() {
this.fill({ color: '#f06' })
}
element.on('click', click)
// 多个事件绑定
element.on(['click', 'mouseover'], handler)
element.on('click mouseover', handler)
// 指定上下文
element.on('click', click, window)
// 解绑事件
element.off('click', click)
element.off('click')
element.off(['click', 'mouseover'])
element.off('click mouseover')
element.off()自定义事件
自定义事件的绑定:事件和自定义事件可以通过1
2
3element.on('myevent', function() {
alert('ta-da!')
})fire
、dispatch
触发,区别在于fire
返回element、而dispatch
返回事件对象。1
2
3
4
5
6
7// 触发事件
element.fire('myevent')
// 携带参数
element.fire('myevent', {some:'data'})
// dispatch的使用
var event = element.dispatch(event)结语
除了SVG.js外还有其他的库可以方便操作svg,也可以自己封装一些常用的操作。这里再推荐一个草绘风格的绘图库,Rough.js