最近在学习一个前端数据可视化D3.js,它的图表绘制是基于SVG的,作为一个小菜鸡,我并不知道什么是SVG,于是我决定把D3.js放一放,先学一下SVG。
那么什么是SVG呢?百度百科上是这么介绍的:“SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。”
看完之后不明觉厉,就像小时候听到函数、方程这种词一样,因为名词太过不接地气,导致还没学就先怂了。不要被不了解的名词吓到,就我自学的感受来说,SVG其实很简单,虽然它是基于XML,但是不了解XML也没关系,毕竟HTML也是标记语言,只要用过HTML绝对能看懂下面的内容。
一、在HTML中使用SVG
(一)可以直接在HTML中嵌入SVG代码
<body>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" style="height: 300px; width: 500px">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
</svg>
</body>
xmlns是命名空间,不了解XML的可能不知道是什么意思,无所谓,这个参数是固定的,照着写就行了。
通过上面的代码就能在页面中绘制一个圆形
(二)单独建一个SVG文件,并在HTML中引入
建一个example1.svg文件,内容如下:
<svg version="1.1" baseProfile="full" width="300" height="200" xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" stroke="black" stroke-width="4" fill="grey" />
<text x="150" y="115" font-size="20" text-anchor="middle" fill="red">SVG NB</text>
</svg>
然后在HTML通过标签引入:
<iframe src="example1.svg" style="width: 350px; height: 250px"></iframe>
<embed src="example2.svg" type="image/svg+xml" />
<object data="example3.svg" type="image/svg+xml"></object>
这三种标签都适用于HTML5标准,并且目前大部分浏览器都是支持的。
效果为:
当然也可以用“<a>”标签做一个链接,连到SVG文件
<a href="example1.svg">SVG文件</a>
二、基础形状标签
SVG提供了一些标签来帮助我们快速绘制常用形状。
(一)矩形
<rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/>
样式的设置也非常简单,和CSS的行内样式表一样,属性名也都基本和在HTML中使用CSS时相同,如上。目前我所用到的唯一不同的是矩形圆角用rx和ry这两个属性进行设置。
把style=“”去掉,全部写成属性=值的形式也是可以的,如下:
<rect width="300" height="100" fill=rgb(0,0,255) stroke-width=1 stroke=rgb(0,0,0)/>
(二)圆形
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
cx和cy定义圆心的位置,不设置的话就是(0,0),r是半径。
(三)椭圆
<ellipse cx="240" cy="50" rx="220" ry="30" style="fill:yellow"/>
椭圆跟圆的区别是椭圆有长轴和短轴,所以有两个属性rx和ry分别表示水平轴和垂直轴的长度
(四)直线
<line x1="0" y1="0" x2="200" y2="200"/>
直线也很简单,用两组(x,y)坐标分别设置起点和终点即可。
(五)折线
<polyline points="0,40 40,40 40,80 80,80 80,120 120,120 120,160"/>
折线其实也不复杂,就比直线多定义几个点而已,注意每组点之间用空格隔开而不是分号。
(六)多边形
多边形稍微复杂一点点,它跟折线很像,也是定义一些点,只不过最后一个点会和第一个点连起来,形成一个封闭图形。
关键在于fill-rule属性,该属性用来如何判断画布上的某区域是否属于该图形“内部”(内部区域将被填充),当然,对三角形或矩形这种路径没有交叉的简单图形,不需要使用该属性,下面的例子是一个五角星。
<polygon points="100,10 40,198 190,78 10,78 160,198" style="fill:lime;stroke:purple;stroke-width:5;fill-rule:nonzero;" />
1.fill-rule默认是nonzero,它的规则就是要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点情况。从0开始计数,路径从左向右穿过射线则计数加1,从右向左穿过射线则计数减1。得出计数结果后,如果结果是0,则认为点在图形外部,否则认为在内部。
比如上图中的P点和从P点做的射线,经过了两条图形的路径BC和EA,两条路径均是从右向左穿过射线,所以计数为2,认为该点在内部。
2.fill-rule的另一个值是evenodd,也是做射线,但是做完之后数和图形路径的交点个数,奇数就认为是在内部,偶数就认为在外部。所以将上面代码中的fill-rule改成evenodd后就变成了下面的效果。
(七)路径
路径和折线的区别在于折线是用直线把点连起来,而路径可以通过参数绘制出光滑的曲线。路径可以实现折线的效果,但折线却并不能替代路径。
路径算是这些标签里面最复杂的一个,参数非常多,而且使用不同参数时,后面所跟的点的个数也不相同,我想在自己尝试了所有不同的路径参数之后,单独写一篇文章对路径做一个详细介绍,下面只是做个入门。路径的详细讲解文章已经发布,链接为:
<path d="M 0 350 q 150 -300 300 0" stroke="blue" stroke-width="5" fill="none" />
参数如下:可以用小写字母,但是含义不一样,大写表示绝对绝对定位,而小写表示相对定位。
- 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 闭合(从最后一个点连直线到起始点)
所以上面代码的意思就是从(0, 350)出发,使用二次贝塞尔曲线分别由(150,-300)控制点控制最终到达(300, 0)结束点,不闭合。(注意用的是小写的q,所以这里的(150, -300)和(300, 0)是相对于起点而言的,和起点的(0, 350)不是同一个坐标系)。这里只是粗略介绍一下,路径所有命令的详细解析会在下一篇文章中。
三、文本标签
基本用法很简单,和HTML一样在开始和结束标签中间写文本就行。
(一)子文本
每个<tspan>和和<text>一样,单独占一行,而且可以有自己的样式。但是必须包在<text>标签内,不能单独用。
<text x="10" y="20" style="fill:rgb(0, 174, 255);">峰兄兄:
<tspan x="10" y="45">菜鸡程序员</tspan>
<tspan x="10" y="70">正在努力中</tspan>
</text>
(二)旋转文字
<text x="10" y="45" transform="rotate(90 20,40)">正在努力中</text>
rotate中的三个参数分别是顺时针旋转的度数、垂直、水平平移的距离(正值表示向上、向右)
(三)文字沿路径
定义一条路径,然后通过textPath标签进行设置即可
<defs>
<path id="path1" d="M 0 100 q 100 80 200 0" stroke="blue" stroke-width="5" fill="none" />
</defs>
<text x="10" y="100" style="fill:red;">
<textPath xlink:href="#path1">祝你天天开心,都有好心情</textPath>
</text>
以上就是SVG入门的内容,后面还有关于路径path和渐变色的详细总结。
写在最后
这是我在稀土掘金发过的文章,稀土掘金的个人主页为峰兄兄 的个人主页 - 动态 - 掘金,两边都会更新,那边一般会早个几天。欢迎大家关注~文章来源:https://www.toymoban.com/news/detail-602958.html
文章中的所有图都是我运行自己练习时的代码截的图,原理图也是在截图的基础上,在画图工具中编辑的,希望能得到更多人的认可,也希望能尊重我的劳动成果,未经许可不要转载哦~ 文章来源地址https://www.toymoban.com/news/detail-602958.html
到了这里,关于什么是SVG?——SVG快速入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!