SVG基本知识
概念
可缩放矢量图形(Scalable Vector Graphics,SVG)基于 XML 标记语言,用于描述二维的矢量图形。
如何使用
- 直接嵌入到HTML中,当成HTML的元素
- 可以在img中引入(img元素和img样式)
- 可以使用object元素引入
- 通过javascript动态标签创建插入到HTML中
属性和元素
视窗坐标系
以画布为基础,也就是SVG元素在所在位置,左上角为原点,X轴向右和Y轴向下为正。
属性
不填写width,height, viewbox属性时,svg的默认宽高为300x150
- viewbox
SVG可以理解成有两个坐标系:视窗坐标系和用户坐标系。这两个坐标系开始是重叠的。视窗坐标系是svg画布本身,不会被修改。而用户坐标系是会被修改的。就是通过viewbox属性 填写值为minx, miny, widht, height。 这个属性的作用可以这样理解,在画布上裁剪出一个宽高分别为widht,height的区域,然后这个区域水平移动minx个单位,垂直移动miny个单位,但是原坐标不变,最后把画布上的内容填充到这个剪出的区域。 可以看出minx, miny实际是原点的坐标 缩放 当viewbox的宽高小于svg的宽高时,整个svg内容为放大效果。 当viewbox的宽高大于svg的宽高时,整个svg内容呈现为缩小的效果
SVG动画
https://zhuanlan.zhihu.com/p/383245453
https://juejin.cn/post/7083262239569870856#heading-0
SMIL
主要是在svg里添加动画元素 https://developer.mozilla.org/zh-CN/docs/Web/SVG/SVG_animation_with_SMIL
CSS
svg可以作为元素直接嵌入到html中,也就是说css也可以对svg的元素生效,所以css的动画也作用于svg的元素。css的动画主要是通过animation, transition, transform三个属性让元素动起来。
- animation,引用一个keyframes
- transition,某些属性的过度效果 rect { transition: fill 1s linear; fill: red; } rect:hover { fill: green; }
- transform,让元素变形
Transform可以让元素平移、缩放、旋转,值得注意的是对于html和svg元素,transform变换参考的坐标系不一样。svg元素是参考自身的坐标系,即是viewport的左上角。而html的是元素的中心位置。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
rect {
width: 200px;
height: 200px;
fill: red;
transition: fill 2s linear;
transform: rotate(10deg);
}
rect:hover {
fill: green;
}
.box {
border: 1px solid #333;
position: relative;
}
.ibox {
width: 200px;
height: 200px;
background-color: aqua;
transform: rotate(10deg);
position: absolute;
}
</style>
</head>
<body>
<div class="box">
<div class="ibox"></div>
<svg>
<rect />
</svg>
</div>
</body>
</html>
JS
实践
- 描边动画
描边动画主要是使用stroke-dasharray 和 stroke-dashoffset两个属性实现。 stroke-dasharray,的值是一个数值序列,该序列详尽的定义了描边样式中每个实线段与间隙(空白段)的相对长度。
- 单一值,仅有一个数值时,此数值决定了实线段与间隙的长度,两者呈现出等长且规律交替的虚线形态
- 序列值的数值个数为偶数。奇数位置的值对应实线的长度,偶数位置的数值则对应相邻实线之间的间隙(空白段)长度。
- 序列值的数值个数为奇数。浏览器会自动复制当前序列值拼接在原序列之后,确保最终得到一个偶数长度的循环序列,然后按照上述偶数个数值的规则来绘制虚线。
stroke-dashoffset,这属性的值决定了描边起始绘制的位置相对于实际路径的偏移量。随着stroke-dashoffset的值变化,原本固定的虚线仿佛沿着路径缓缓滑动,形成动画效果。
stroke-dasharray,是画虚线的,值是一个序列。虚线是由多组实线和实线后的间隙组成。这个序列值就是描述每组实线和间隙的长度的。当画虚线时,是按这个序列值循环来画的。
<style>
path {
stroke-dasharray: 10;
stroke-dasharray: 10 5;
stroke-dasharray: 10 5 20; // 这里的值最终为 10 5 20 10 5 20
}
</style>
SVG实践遇到的问题
offset-rotate的影响 坐标受g元素的translate影响