1 | <?xml version="1.0" standalone="no"?> |
矩形
rect
元素会在屏幕上绘制一个矩形 。其实只要6个基本属性就可以控制它在屏幕上的位置和形状。
1 | <rect x="60" y="10" rx="10" ry="10" width="30" height="30"/> |
x 矩形左上角的x位置
y 矩形左上角的y位置
width 矩形的宽度
height 矩形的高度
rx 圆角的x方位的半径
ry 圆角的y方位的半径
圆形
circle
元素会在屏幕上绘制一个圆形。它只有3个属性用来设置圆形。
1 | <circle cx="25" cy="75" r="20"/> |
r 圆的半径
cx 圆心的x位置
cy 圆心的y位置
椭圆
Ellipse 是
circle
元素更通用的形式,你可以分别缩放圆的x半径和y半径(通常数学家称之为长轴半径和短轴半径)。
1 | <ellipse cx="75" cy="75" rx="20" ry="5"/> |
rx 椭圆的x半径
ry 椭圆的y半径
cx 椭圆中心的x位置
cy 椭圆中心的y位置
线条
Line 绘制直线。它取两个点的位置作为属性,指定这条线的起点和终点位置。
1 | <line x1="10" x2="50" y1="110" y2="150" stroke="black" stroke-width="5"/> |
x1 起点的x位置
y1 起点的y位置
x2 终点的x位置
y2 终点的y位置
折线
Polyline是一组连接在一起的直线。因为它可以有很多的点,折线的的所有点位置都放在一个points属性中:
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”。路径绘制完后闭合图形,所以最终的直线将从位置(2,2)连接到位置(0,0)。
多边形
polygon
和折线很像,它们都是由连接一组点集的直线构成。不同的是,polygon
的路径在最后一个点处自动回到第一个点。需要注意的是,矩形也是一种多边形,如果需要更多灵活性的话,你也可以用多边形创建一个矩形。
xmlCopy to Clipboard
1 | <polygon points="50, 160 55, 180 70, 180 60, 190 65, 205 50, 195 35, 205 40, 190 30, 180 45, 180"/> |
-
点集数列。每个数字用空白符、逗号、终止命令或者换行符分隔开。每个点必须包含 2 个数字,一个是 x 坐标,一个是 y 坐标。所以点列表 (0,0), (1,1) 和 (2,2) 可以写成这样:“0 0, 1 1, 2 2”。路径绘制完后闭合图形,所以最终的直线将从位置 (2,2) 连接到位置 (0,0)。
路径
path
可能是SVG中最常见的形状。你可以用path元素绘制矩形(直角矩形或者圆角矩形)、圆形、椭圆、折线形、多边形,以及一些其他的形状,例如贝塞尔曲线、2次曲线等曲线。
1 | <path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/> |
一个点集数列以及其它关于如何绘制路径的信息。
每一个命令都有两种表示方式,一种是用大写字母,表示采用绝对定位。另一种是用小写字母,表示采用相对定位
直线命令
M x y m dx dy (M命令是移动画笔位置,但是不画线)
L x y l dx dy (最常用的是“Line to” 命令,L
)
H x h dx (绘制水平线)
V y v dy (绘制垂直线)
Z z (用于闭合路径,不区分大小写)
曲线命令
贝塞尔曲线
1、三次贝塞尔曲线需要定义一个点和两个控制点,
用C命令创建三次贝塞尔曲线,需要设置三组坐标参数:
1 | C x1 y1, x2 y2, x y (or c dx1 dy1, dx2 dy2, dx dy) |
2、三次贝塞尔曲线命令S
你可以将若干个贝塞尔曲线连起来,从而创建出一条很长的平滑曲线。通常情况下,一个点某一侧的控制点是它另一侧的控制点的对称(以保持斜率不变)。这样,你可以使用一个简写的贝塞尔曲线命令S
1 | S x2 y2, x y (or s dx2 dy2, dx dy) |
3、二次贝塞尔曲线Q命令
它比三次贝塞尔曲线简单,只需要一个控制点,用来确定起点和终点的曲线斜率。因此它需要两组参数,控制点和终点坐标。
1 | Q x1 y1, x y (or q dx1 dy1, dx dy) |
4、二次贝塞尔曲线T命令
可以通过更简短的参数,延长二次贝塞尔曲线。T命令前面必须是一个Q命令,或者是另一个T命令,才能达到这种效果。如果T单独使用,那么控制点就会被认为和终点是同一个点,所以画出来的将是一条直线。
1 | T x y (or t dx dy) |
虽然三次贝塞尔曲线拥有更大的自由度,但是两种曲线能达到的效果总是差不多的。具体使用哪种曲线,通常取决于需求,以及对曲线对称性的依赖程度。
弧形命令
弧形命令A
1 | A rx ry x-axis-rotation large-arc-flag sweep-flag x y |
用路径来绘制完整的圆或者椭圆是比较困难的,因为圆上的任意点都可以是起点同时也是终点,无数种方案可以选择,真正的路径无法定义。通过绘制连续的路径段落,也可以达到近似的效果,但使用真正的circle或者ellipse元素会更容易一些。
填充与边框
fill 与 stroke
fill
属性设置对象内部的颜色,stroke
属性设置绘制对象的线条的颜色。
1 | <rect x="10" y="10" width="100" height="100" |
使用css
除了定义对象的属性外,你也可以通过CSS来样式化
填充
和描边
。语法和在html里使用CSS一样,只不过你要把background-color
、border
改成fill
和stroke
。注意,不是所有的属性都能用CSS来设置。上色和填充的部分一般是可以用CSS来设置的,比如fill
,stroke
,stroke-dasharray
等,但是不包括下面会提到的渐变和图案等功能。另外,width
、height
,以及路径的命令等等,都不能用css设置。判断它们能不能用CSS设置还是比较容易的
1 | <rect x="10" height="180" y="10" width="180" style="stroke: black; fill: red;"/> |
渐变
并非只能简单填充颜色和描边,更令人兴奋的是,你还可以创建和并在填充和描边上应用渐变色。
1、线性渐变
1 |
|
2、径向渐变
径向渐变与线性渐变相似,只是它是从一个点开始发散绘制渐变。创建径向渐变需要在文档的
defs
中添加一个``元素
1 | <?xml version="1.0" standalone="no"?> |
图案
跟渐变一样,需要放在SVG文档的
1 | <?xml version="1.0" standalone="no"?> |
Texts
1 | <text x="10" y="10">Hello World!</text> |
基础变形
1 | g元素: |
剪切和遮罩
1 | 1、剪切 |
嵌入光栅图像
很像在HTML中的
img
元素,SVG有一个image
元素,用于同样的目的。你可以利用它嵌入任意光栅(以及矢量)图像。它的规格要求应用至少支持PNG、JPG和SVG格式文件。
1 | //SVG的<image>元素允许在一个SVG对象内部呈现光栅图像。 |
滤镜效果
1 | 滤镜通过 <filter> 元素进行定义,并且置于 <defs> 区块中。 |
SVG字体(SVG字体当前只在Safari和Android浏览器中受支持。)
SVG 转成流
1 | <div class="svg-wrap"> |
实用工具库Snap.svg
Snap.svg可以帮助开发者更轻松地使用SVG,就如同使用JQuery操作DOM一样。
荐直接阅读张鑫旭老师的《Snap.svg中文文档》
● Snap类用于聚合其他各个子类别的方法和属性。
● Element类是在Snap中操作的基本单元,它将普通的SVG元素包装为element实例,其原型方法包括属性设置、动画设置、变形、交互事件绑定、DOM元素选择器及一些工具函数等。
● Paper类聚合了实现SVG原生特性的方法,包括基本形状及自定义路径的绘制、蒙版及滤镜、文字绘制及图形分组管理等。
● Set类聚合了元素分组管理的方法。
● Matrix类聚合了构建变形矩阵的方法。
● mina聚合了动画的缓动函数设定方法。
1 | // 它的构造函数可以接收元素的尺寸数据生成一个空白的SVG,也可以传入单个或一组现有的SVG元素的ID,甚至支持直接传入CSS query selector(查询选择器) |
Snap.svg虽然易用,但它的源代码大小超过200KB,即使压缩后也有81KB,这样说你或许没有什么感觉,当你知道了完整的Vue2.0框架压缩后也不过才90KB后就能明白笔者想要表达的重点了,技术的选型一定是由需求场景决定的。若为了实现一个小效果而大动干戈地引入一个巨型工具包则是不明智的做法
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/06/17/programming/javascript/svg/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!