SVG I Know
暖暖 / 2021-02-23 18:43:42
第一章:SVG入门篇
SVG简介
SVG即Scalable Vector Graphics可缩放矢量图形,使用XML格式定义图形。
优点:
- SVG与其他图片格式相比:主要优势在于可缩放的同时不会影响图片的质量。
- 与flash相比 :SVG 最大的优势是与其他标准(比如 XSL 和 DOM)相兼容。而 Flash 则是未开源的私有技术。
SVG in HTML常用方法
使用<img>元素来嵌入SVG图像
1 | <img src="http://www.w3school.com.cn/svg/rect1.svg" width="300" /> |
将SVG图像作为背景图像嵌入
1 | background: url('http://www.w3school.com.cn/svg/rect1.svg') no-repeat; |
使用svg元素,通过代码将SVG图像嵌入到HTML代码中
1 | <body> |
svg sprites
svg sprites类似于css sprites,将各个svg合并在一起。
最主要的优点就是能减少页面的加载时间,优化开发流程,以及保持页面中图片元素的一致性。
实践中我们可以把整块的svg放在head头部, 因此可以在一处地方更新svg即可,而不是让svg的代码块散落在文档的各个地方。
1 | <head> |
在这里https://icomoon.io/app/#/select可以设置sprites,可以自己导入svg。
symbol+use
在head头部的svg中使用symbol元素,并使用id属性。其中symbol类似flash中的元件,可多次使用。
1 | <svg id="icon-truck" width="32" height="32" viewBox="0 0 32 32" x="0" y="126"> |
然后在需要用到这个元件的地方使用use元素引用元件。其中xlink:href=”#truck”相当于元件的链接,通过引用元件的id来实现。
1 | <use xlink:href="#truck" x="0" y="0" /> |
兼容性
兼容性详细情况请点击 此处
总结思考
一般在html中使用SVG有三种方法:使用<img>元素来嵌入SVG图像;将SVG图像作为背景图像嵌入;使用<svg>元素,通过代码将SVG图像嵌入到HTML代码中。
使用过程中,可通过svg sprites提高性能,通过symbol以及use元素提高文档的可维护性等。
第二章:SVG形状
矩形 <rect>
1 | <rect x="20" y="20" rx="20" ry="20" width="250" height="100" style="fill:red;stroke:black; stroke-width:5;opacity:0.5"/> |
解释:x为x坐标,y为y坐标;width 和 height 分别为形状的高度和宽度;rx 和 ry 属性可使矩形产生圆角。
另外,下面三个属性是文章后面会用到的,之后不会过多讲述:
- fill 属性定义形状的填充颜色
- stroke 属性定义图形边框的颜色
- stroke-width 属性定义形状边框的宽度
圆形 <circle>
1 | <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> |
解释:cx 和 cy分别为圆点的 x 和 y 坐标;r为半径。
椭圆<ellipse>
1 | <ellipse cx="300" cy="150" rx="200" ry="80" style="fill:rgb(200,100,50); stroke:rgb(0,0,100);stroke-width:2"/> |
解释:cx 圆点的 x 坐标,cy 圆点的 y 坐标;rx 水平半径,ry 垂直半径。
线<line>
1 | <line x1="0" y1="0" x2="300" y2="300" style="stroke:rgb(99,99,99);stroke-width:2"/> |
解释:(x1,y1)为线条的开始坐标;(x2,y2)为线条的结束坐标。
折线<polyline>
1 | <polyline points="0,0 0,20 20,20 20,40 40,40 40,60" style="fill:white;stroke:red;stroke-width:2"/> |
解释:points 属性定义多边形每个角的 x 和 y 坐标。为了可读性,建议x与y坐标用逗号分开,每个角之间的坐标用空格分开。
多边形<polygon>
1 | <polygon points="220,100 300,210 170,250" style="fill:#cccccc; stroke:#000000;stroke-width:1"/> |
解释:points 属性定义多边形每个角的 x 和 y 坐标。
路径<path>
直线指令:
M = moveto
L = lineto
H = horizontal lineto
V = vertical lineto
Z = closepath
注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
1 | <svg> |
解释:该路径开始于位置 250 150,到达位置 150 350,然后从那里开始到 350 350,最后在 250 150 关闭路径。
由于绘制路径的复杂性,建议使用 SVG 编辑器来创建复杂的图形。
svg的贝塞尔曲线
贝塞尔曲线指令:
C = curveto
S = smooth curveto
Q = quadratic Belzier curve
T = smooth quadratic Belzier curveto
贝塞尔曲线控制小工具http://dayu.pw/svgcontrol/,操控多次可加深对贝塞尔曲线的理解。
CSQT比较难记,联想记忆法“厕所切图(CSQT)”就比较容易记住了。
厕所是3D空间,所以CS是三次曲线噢,切图是平面图,所以是二次曲线,很好记。
C三次贝塞尔曲线
1 | C x1 y1, x2 y2, x y (or c dx1 dy1, dx2 dy2, dx dy) |
最后一个坐标(x,y)表示的是曲线的终点,另外两个坐标是控制点,(x1,y1)是起点的控制点,(x2,y2)是终点的控制点。小写指令c表示相对坐标。
S光滑三次贝塞尔曲线
1 | S x2 y2, x y (or s dx2 dy2, dx dy) |
之所以S命令没有x1 y1,是因为S命令跟在C命令后,x1 y1默认是C命令的第二个控制点的对称点,如下图蓝色线条所示。
如果前面没有C命令,即S命令单独使用时,S命令画出来的是二次贝塞尔曲线,因为x1 y1和x2 y2默认是同一个控制点了。
Q二次贝塞尔曲线
1 | Q x1 y1, x y (or q dx1 dy1, dx dy) |
T光滑二次贝塞尔曲线
1 | T x y (or t dx dy) |
T命令的控制点默认是前面C命令的控制点的对称点。
如果T命令前面没有C命令,即T命令单独使用时,T命令画出来的是直线。
总结思考
路径比基本形状更强大、更灵活。使用路径绘制复杂图形比较麻烦,但是使用它们来绘制图形的效果大多数时候很赞,一般其他基本图形是做不来的。
第三章:SVG动画
svg路径动画
DEMO:
g元素是用于把相关元素进行组合的容器元素。animateMotion使元素沿着动作路径移动,且该路径不可见,path定义的是可见的路径。rotate=”auto”使元素移动得更加自然,会随着路径旋转一定的角度。
1 | <svg width="1500" height="150" class="truck"> |
svg路径描边动画
DEMO:
在path等元素上必须使用stoke属性,否则动画不执行。stroke 表示描边颜色;stroke-width 表示描边的粗细;
1 | <svg> |
使用CSS3 animation实现,因为内联的svg本身就是Html元素,可以通过CSS3来控制颜色等属性。
stroke-dasharray 表示虚线描边;stroke-dashoffset 表示虚线的起始偏移。
1 | .device { position: absolute;top: 43%;left: 50%;margin: -200px 0 0 -200px;stroke-dasharray: 4000;stroke-dashoffset: 4000;-webkit-animation: dash 2s infinite;animation: dash 2s infinite; } |
css中的clip-path
clip-path按照路径内部的尺寸进行裁剪。只有路径内的内容可见。使用方法如下:
1 | .element { |
1 | <!-- 其他图形函数语法 --> |
DEMO1:
利用伪元素:before和:after实现相同大小相同位置的文字,使用clip-path分别裁剪文字:
1 | .txt { display: inline-block;position: relative;font-size: 70px;text-transform: uppercase;color: transparent; } |
DEMO2:
如果结合clip-path和keyframes动画,可实现相关元素按照我们的路径逐步出现的效果。clip-path可通过此工具http://www.bennettfeely.com/clippy/实现复杂的路径。
1 | .line { position: absolute;left: 0;top: 0;width: 28px;height: 34px;background: url(line.png) 0 0 no-repeat;-webkit-animation: moveLine .8s ease infinite;animation: moveLine .8s ease infinite; } |
总结思考
本章主要介绍svg路径动画,svg路径描边动画以及css中的clip-path,从中我们也发现了路径的强大之处,如若能在项目中灵活使用,无非给动画添加更生动的效果。