SVG 从入门到后悔,怎么不早点学起来(图解版)
点赞 + 关注 + 收藏 = 学会了
作为一只前端,只懂 Vue
、React
感觉已经和大家拉不开距离了。
可视化、机器学习等领域 JS
都有涉及到,而可视化方面已经被很多领域用到,比如大屏项目。
可视化领域相关的技术有 canvas
和 SVG
,而这两个东东是迟早要接触的了。
在我接触
SVG
之前,我觉得这是一个很高深的东西,有点恐惧。我第一次接触SVG
是在 iconfont网站,我没理它是什么东西,反正就跟着教程用。第二次接触就是在 《CSS揭秘(图灵出品)》 这本书,里面会讲到SVG
相关的内容,而我选择了跳过这部分内容。。。
之后是怎么学会的我也忘了。
最近时间比较多,就把我懂的知识用人话整理出来,方便查询。
本文主要把 “可视” 方面的内容整理出来,操作交互方面(动画、交互事件等) 的内容留到下一篇~
什么是SVG
在学习 SVG
之前,首先要了解 位图 和 矢量图 的区别。
简单来说:
位图:放大会失真图像边缘有锯齿;是由像素点组成;前端的
Canvas
就是位图效果。矢量图:放大不会失真;使用
XML
描述图形。
我在 知乎 上找了一个图对说明一下。
左边是位图,右边是矢量图
那么 SVG
是什么呢?它是矢量图的其中一种格式。它是用 XML
来描述图形的。
对于初学 SVG
的前端来说,可以简单的理解为 “SVG
是一套新标签”。
所以可以使用 CSS
来设置样式,也可以使用 JS
对 SVG
进行操作。
SVG的使用方式
使用方法
SVG
的使用方式有很多种,我最推荐直接在 HTML
中直接使用,也就是直接当 HTML
标签使用。
我在 《SVG 在前端的7种使用方法》 里记录了几种使用方法:
在浏览器直接打开
内嵌到
HTML
中(推荐)CSS
背景图(推荐)使用
img
标签引入(推荐)使用
iframe
标签引入(不推荐)使用
embed
标签引入(不推荐)使用
object
标签引入(不推荐)
SVG默认宽高
在 HTML
中使用 SVG
,直接用 <svg>
标签即可。
<svg></svg>复制代码
在不给 <svg>
设置宽高时,它的默认宽度是 300px
,默认高度是 150px
。这点和 <canvas>
是一样的。
基础图形
HTML
的元素大多数默认都是矩形,SVG
在形状上更加丰富。
矩形 rect
矩形使用 <rect>
标签,默认填充色是黑色,当只设置宽高时,渲染出来的矩形就是黑色的矩形。
稍后还会说明如何设置样式(比如边框、填充色等),这里只列出矩形基础属性:
x
: 左上角x轴坐标y
: 左上角y轴坐标width
: 宽度height
: 高度rx
: 圆角,x轴的半径ry
: 圆角,y轴的半径
基础款(只设置宽高)
<svg width="300" height="300" style="border: 1px solid red;">
<rect width="200" height="100"></rect></svg>复制代码
设置矩形位置
通过 x
和 y
可以设置矩形位置
<svg width="300" height="300" style="border: 1px solid red;">
<rect
x="30"
y="20"
width="200"
height="100"
>
</rect></svg>复制代码
圆角矩形
<svg width="300" height="300" style="border: 1px solid red;">
<rect
width="200"
height="100"
rx="20"
ry="40"
>
</rect></svg>复制代码
rx
是设置x轴的半径,ry
设置y轴的半径。
rx
的最大值是矩形宽度的一半,ry
的最大值是矩形高度的一半。
当只设置 rx
或者 ry
其中一个值时,另一个属性也会使用一样的值。
比如
<svg width="300" height="300" style="border: 1px solid red;">
<rect
width="200"
height="100"
rx="30"
>
</rect></svg>复制代码
此时 rx
和 ry
都是 30
。
rect版的圆形
圆角的概念和 CSS
的 border-radius
有点像,所以有没有一种可能,用 <rect>
也可以画圆形呢?
<svg width="300" height="300" style="border: 1px solid red;">
<rect
width="100"
height="100"
rx="50"
>
</rect></svg>复制代码
只要把宽高设成一样,圆角设成宽度的一半就能实现圆形。这是在 HTML
里的实现方式之一。
同理也用 <rect>
实现椭圆,但在 SVG
中是不会这样做的。因为 SVG
里有专门的圆形和椭圆的标签。
圆形 circle
圆形使用 <circle>
标签,基础属性有:
cx
: 圆心在x轴的坐标cy
: 圆心在y轴的坐标r
: 半径
<svg width="300" height="300" style="border: 1px solid red;">
<circle
cx="60"
cy="80"
r="50"
>
</circle></svg>复制代码
椭圆 ellipse
椭圆使用 <ellipse>
标签,基础属性有:
cx
: 圆心在x轴的坐标cy
: 圆心在y轴的坐标rx
: x轴的半径ry
: y轴的半径
<svg width="300" height="300" style="border: 1px solid red;">
<ellipse
cx="100"
cy="40"
rx="80"
ry="30"
>
</ellipse></svg>复制代码
<ellipse>
和 <circle>
差不多,只是将半径拆成x轴和y轴的。
直线 line
直线使用 <line>
标签,基础属性有:
x1
: 起始点x坐标y1
: 起始点y坐标x2
: 结束点x坐标y2
: 结束点y坐标stroke
: 描边颜色
<svg width="300" height="300" style="border: 1px solid red;">
<line
x1="30"
y1="40"
x2="200"
y2="180"
stroke="blue"
>
</line></svg>复制代码
只有 x1
和 x2
,没有 x3
,也没有 y3
。
需要注意的是,<line>
需要使用设置 stroke
属性才会有绘制效果。
折线 polyline
使用 <polyline>
可以绘制折线,基础属性有:
points
: 点集stroke
: 描边颜色fill
: 填充颜色
<svg width="300" height="300" style="border: 1px solid red;">
<polyline
points="10 10, 200 80, 230 230"
stroke="#000"
fill="none"
>
</polyline></svg>复制代码
points
接受的值是一串点集,点集是两两一组表示一个坐标。
其实点集完全不需要用逗号隔开,上面的例子中我使用了逗号隔开,完全是为了让自己阅读代码时比价易懂。一个逗号分隔一个 xy
坐标。
在绘制折线是,我通常是将 fill
设置成 none
,因为 fill
默认值是黑色,如果不设置成 none
会出现以下效果:
<svg width="300" height="300" style="border: 1px solid red;">
<polyline
points="10 10, 200 80, 230 230"
stroke="#000"
>
</polyline></svg>复制代码
将 fill
设置成 none
后,必须设置 stroke
为一个有颜色的值,不然不会有渲染效果。
多边形 polygon
多边形使用 <polygon>
标签,基础属性和 <polyline>
差不多:
points
: 点集stroke
: 描边颜色fill
: 填充颜色
<polygon>
会自动闭合(自动将起始点和结束点链接起来)。
<svg width="300" height="300" style="border: 1px solid red;">
<polygon points="10 10, 200 80, 230 230"></polygon></svg>复制代码
直线路径 path
其实在 SVG
里,所有基本图形都是 <path>
的简写。所有描述轮廓的数据都放在 d
属性里,d
是 data
的简写。
d
属性又包括以下主要的关键字(注意大小写!):
M: 起始点坐标,
moveto
的意思。每个路径都必须以M
开始。M
传入x
和y
坐标,用逗号或者空格隔开。L
: 轮廓坐标,lineto
的意思。L
是跟在M
后面的。它也是可以传入一个或多个坐标。大写的L
是一个绝对位置。l: 这是小写
L
,和L
的作用差不多,但l
是一个相对位置。H
: 和上一个点的Y坐标相等,是horizontal lineto
的意思。它是一个绝对位置。h
: 和H
差不多,但h
使用的是相对定位。V
: 和上一个点的X坐标相等,是vertical lineto
的意思。它是一个绝对位置。v
: 这是一个小写的v
,和大写V
的差不多,但小写v
是一个相对定位。Z
: 关闭当前路径,closepath
的意思。它会绘制一条直线回到当前子路径的起点。
概念说了一堆,还是用写 demo
的方式来展示会更加直观。
基础版
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 L 50 40 L 100 10"
stroke="blue"
fill="none"
>
</path></svg>复制代码
上面的例子里,通过1个 M
和3个 L
描绘了3个点。
使用 stroke
设置描边的颜色,使用 fill="none"
将填充色改成透明。最后就形成上图的效果。
简写
如果全是使用大写 L
来描述每个点的位置,那可以把 L
也去掉,直接写点集。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 50 40 100 10"
stroke="blue"
fill="none"
>
</path></svg>复制代码
上面的 d="M 10 10 50 40 100 10"
等同于 d="M 10 10 L 50 40 L 100 10"
。
闭合路径
在 d
的数据集里,使用 Z
可以闭合路径。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 L 50 40 L 100 10 Z"
stroke="blue"
fill="none"
>
</path></svg>复制代码
轮廓坐标相对位置 l
使用 L
的小写方式 l
可以实现相对位置写法。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 l 50 40 l 100 10 Z"
stroke="blue"
fill="none"
>
</path></svg>复制代码
上面的代码中,d="M 10 10 l 50 40 l 100 10 Z"
等同于 d="M 10 10 L 60 50 L 160 60 Z"
。
l
里的参数会与前一个点的 x
和 y
进行相加,得到一个新的坐标。
H 和 h
H
后面只需传入 X坐标
即可,它的 Y坐标
与前一个点相同。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 H 100"
stroke="blue"
fill="none"
>
</path></svg>复制代码
上面的代码中,d="M 10 10 H 100"
等同于 d="M 10 10 L 100 10"
而 h
和 H
的作用差不多,只不过传入的数据会和前一个点的 X坐标
相加,形成一个新的点,这就是相对位置。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 h 100"
stroke="blue"
fill="none"
>
</path></svg>复制代码
可以讲 H
和 h
的例子产生的图片对照一下。
V 和 v
V
后面只需传入 Y坐标
即可,它的 X坐标
与前一个点相同。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 V 100"
stroke="blue"
fill="none"
>
</path></svg>复制代码
v
和 V
的作用差不多,小写 v
是一个相对位置。
<svg width="300" height="300" style="border: 1px solid red;">
<path
d="M 10 10 v 100"
stroke="blue"
fill="none"
>
</path></svg>复制代码
曲线 - 椭圆弧路径 path
在 SVG
中,画曲线其实有很多种方法。我觉得最简单的是 椭圆弧曲线,其实还有 贝塞尔曲线、三次贝塞尔曲线 等一系列复杂的曲线。但我觉得这对初学者来说可能一下子难以接受,所以我在 《Canvas 从入门到劝朋友放弃(图解版)》 里也没写。之后打算再写一篇贝塞尔曲线相关的文章骗点赞~
什么是椭圆弧?
前面讲到的 直线路径 path
是比较好理解的,它把所有点都用直线连接起来即可。只要确定2个点就可以画出一根线段。
但如果只用两个点,可以产生无数条曲线。所以需要添加更多的参数来确定如何绘制一条曲线。而在种种方法中,我认为 椭圆弧曲线 是最简单的。
椭圆弧曲线,顾名思义就是和椭圆有关的。如果在椭圆上选择两个点,就可以截取2条曲线。
比如这样,红线处就将椭圆截取成2段弧线。
椭圆弧公式
在 SVG
中可以使用 path
配合 A属性
绘制椭圆弧。
A(rx, ry, xr, laf, sf, x, y)复制代码
rx
: 椭圆X轴半径ry
: 椭圆Y轴半径xr
: 椭圆旋转角度laf
: 是否选择弧长较长的那一段。0: 短边(小于180度); 1: 长边(大于等于180度)sf
: 是否顺时针绘制。0: 逆时针; 1: 顺时针x
: 终点X轴坐标y
: 终点Y轴坐标
上面的公式中并没有开始点,开始点是由 M
决定的。
也就是说,确定2个点,再确定椭圆半径,就可画出2个椭圆
通过开始点和结束点裁切,可以得到4条弧线,也就是说2个点可以确定2个相同旋转角度的椭圆的位置,可以切出4条弧线。
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 红 -->
<path
d="M 125 75 A 100 50 0 0 0 225 125"
stroke="red"
fill="none"
/>
<!-- 黄 -->
<path
d="M 125 75 A 100 50 0 0 1 225 125"
stroke="yellow"
fill="none"
/>
<!-- 蓝 -->
<path
d="M 125 75 A 100 50 0 1 0 225 125"
stroke="blue"
fill="none"
/>
<!-- 绿 -->
<path
d="M 125 75 A 100 50 0 1 1 225 125"
stroke="green"
fill="none"
/></svg>复制代码
绘制弧线是比较抽象的,通常我是不会手动绘制的,我会使用 Illustrator 绘制,然后生成 SVG
来使用。
设置样式的方法
设置 SVG
元素样式其实和 CSS
差不多,常见的方法有4种。
属性样式
内联样式
内部样式
外部样式
属性样式
直接在元素属性上设置样式,比如将矩形填充色改成粉红
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
fill="pink"
/></svg>复制代码
内联样式
把所有样式写在 style
属性里
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
style="fill: pink;"
/></svg>复制代码
内部样式
将样式写在 <style>
标签里
<style>
.rect {
fill: pink;
}</style><svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
class="rect"
/></svg>复制代码
外部样式
将样式写在 .css
文件里,然后在页面中引入该 CSS
文件。
常用样式设置
SVG
设置样式的属性和 CSS
稍微有点不同,但初学时不需要了解太深入,我们只需将常用的学会即可。
比如填充色、描边颜色等。
说到颜色,SVG
和 CSS
支持的颜色值其实差不多的,比如:
关键字: red、pink、blue 等
十六进制: 支持3位或6位,
#0f0
、#00ff00
RGB 和 RGBA: 比如
rgb(10, 20, 30)
或rgba(10, 20, 30, 0.4)
HSL 和 HSLA
接下来讲到的所有常规属性,除了在元素属性上设置之外,都支持在 CSS
中设置。
填充 fill
要填充图案颜色,可以设置 fill
属性。这个属性在前面的例子也使用过多次。
fill
默认是 #000000
,也就是黑色。
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
fill="greenyellow"
/></svg>复制代码
也可以使用 none
或者 transparent
将填充色设置成透明。
填充色的不透明度 fill-opacity
如果想让填充色有点 半透明 的感觉,可以设置 fill-opacity
属性,也可以在 fill
属性中使用 RGBA
或者 HSLA
。
本例使用 fill-opacity
设置,它的取值是 0 - 1
,0
代表完全透明,1
代表完全不透明。小于 0
的值会被改为 0
,大于 1
的值会被改为 1
。
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
fill="red"
fill-opacity="0.2"
/></svg>复制代码
fill
属性中使用 RGBA
或者 HSLA
的方式你自己动手试试看~
描边颜色 stroke
可以通过 stroke
属性设置描边的颜色,之前也使用过。如果不设置 stroke
,图形默认是没有描边颜色的。
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
fill="none"
stroke="blue"
/></svg>复制代码
我将填充色设置成透明,方便观察蓝色边框。
描边颜色的不透明度 stroke-opacity
和 fill-opacity
差不多,只不过 stroke-opacity
是设置描边的不透明度
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
fill="none"
stroke="blue"
stroke-opacity="0.3"
/></svg>复制代码
描边宽度 stroke-width
如果需要调整描边的宽度,可以使用 stroke-width
,它接收一个数值
<svg width="400" height="400" style="border: 1px solid red;">
<rect
x="100"
y="100"
width="200"
height="100"
fill="none"
stroke="blue"
stroke-width="10"
/></svg>复制代码
虚线描边 stroke-dasharray
边框的 点线 或者 虚线 样式,可以使用 stroke-dasharray
设置,这和 Canvas
里设置虚线的操作其实是差不多。
stroke-dasharray
接收一串数字,这串数字可以用来代表 线的长度和空隙的长度,数字之间用逗号或者空格分隔。
建议传入偶数个数字。但如果你传入了奇数个数字,SVG
会将这串数字重复一遍,使它的数量变成 偶数个 。
<svg width="400" height="400" style="border: 1px solid red;">
<line
x1="30"
y1="30"
x2="300"
y2="30"
stroke="blue"
/>
<line
x1="30"
y1="70"
x2="300"
y2="70"
stroke="blue"
stroke-dasharray="20 10"
/>
<line
x1="30"
y1="110"
x2="300"
y2="110"
stroke="blue"
stroke-dasharray="20 10 30"
/></svg>复制代码
虚线偏移量 stroke-dashoffset
虚线还可以通过 stroke-dashoffset
属性设置偏移量,它接收一个数值类型的值。
<svg width="400" height="400" style="border: 1px solid red;">
<line
x1="30"
y1="30"
x2="300"
y2="30"
stroke="blue"
stroke-width="10"
stroke-dasharray="20 10 30"
/>
<line
x1="30"
y1="90"
x2="300"
y2="90"
stroke="blue"
stroke-width="10"
stroke-dasharray="20 10 30"
stroke-dashoffset="10"
/></svg>复制代码
我加粗了虚线,方便观察偏移量。
线帽 stroke-linecap
线帽就是线的起始点和结束点的位置,用 stroke-linecap
属性可以设置线帽样式。
线帽有3个值:
butt
: 平头(默认值)round
: 圆头square
: 方头
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 平头 -->
<line
x1="30"
y1="30"
x2="300"
y2="30"
stroke="blue"
stroke-width="10"
stroke-linecap="butt"
/>
<!-- 圆头 -->
<line
x1="30"
y1="70"
x2="300"
y2="70"
stroke="blue"
stroke-width="10"
stroke-linecap="round"
/>
<!-- 方头 -->
<line
x1="30"
y1="110"
x2="300"
y2="110"
stroke="blue"
stroke-width="10"
stroke-linecap="square"
/></svg>复制代码
可以看到 square
比 butt
要稍微长一丢丢。
拐角 stroke-linejoin
拐角就是折线的交接点,可以使用 stroke-linejoin
设置,它接收以下属性:
miter
: 尖角(默认)round
: 圆角bevel
: 平角
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 尖角 -->
<polyline
points="30 60, 60 30, 90 60"
fill="none"
stroke="blue"
stroke-width="20"
stroke-linejoin="miter"
/>
<!-- 圆角 -->
<polyline
points="30 120, 60 90, 90 120"
fill="none"
stroke="blue"
stroke-width="20"
stroke-linejoin="round"
/>
<!-- 平角 -->
<polyline
points="30 180, 60 150, 90 180"
fill="none"
stroke="blue"
stroke-width="20"
stroke-linejoin="bevel"
/></svg>复制代码
消除锯齿 shape-rendering
如果你觉得 SVG
在浏览器显示出来的图像有点模糊,那可能是开启了 反锯齿 功能,可以通过 CSS
属性关闭该功能。
shape-rendering: crispEdges;复制代码
将该属性设置到对应的 svg
元素上,就会关闭反锯齿功能,突显看起来就会清晰很对,但在某些情况关闭了该功能会让图像看起来有点毛躁的感觉。
如果想开启反锯齿功能,可以这样设置:shape-rendering: geometricPrecision;
文本元素 text
SVG
可以使用 <text>
标签渲染文本。文本是有 “基线” 概念的,这个概念和 CSS
的一样。这里推荐 AndyHu 的文章,可以快速搞懂基线。《彻底搞懂vertical-align 底线、基线、中线的含义》
基础版
和 Canvas
一样,SVG
的文本对齐方式是以第一个字基线的左下角为基准。
<svg width="400" height="400" style="border: 1px solid red;">
<text>雷猴啊</text></svg>复制代码
可以看到,文字跑去左上角了。但这并不是我们想要的效果。
SVG
如果没设置字号,它会跟随父元素的字号,一直往上跟跟跟上去。
在本例中,默认字号是跟随了浏览器的,也就是 16px
。
如果我们想看到文本,就需要将文字往下移动 16px
,因为本文的对齐方式是以第一个字的基线的左下角为参考,默认的位置坐标是 (0, 0)
,现在要将y轴坐标改成 16px
才能完整显示文本
<svg width="400" height="400" style="border: 1px solid red;">
<text y="16">雷猴啊</text></svg>复制代码
设置字号 font-size
<svg width="400" height="400" style="border: 1px solid red;">
<text
y="60"
font-size="60"
>
雷猴啊 </text></svg>复制代码
粗体 font-weight
使用 font-weight
可以将文本设置成粗体。
normal
: 默认(非粗体)bold
: 粗体
这和 CSS
是一样的
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 默认 -->
<text
y="60"
font-size="60"
font-weight="normal"
>
雷猴啊 </text>
<!-- 粗体 -->
<text
y="140"
font-size="60"
font-weight="bold"
>
雷猴啊 </text></svg>复制代码
装饰线 text-decoration
和 CSS
一样,可以使用 text-decoration
设置装饰线
none
:默认underline
: 下划线overline
: 上划线line-through
: 删除线
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 默认 -->
<text
y="30"
font-size="30"
text-decoration="none"
>
雷猴啊 </text>
<!-- 上划线 -->
<text
y="100"
font-size="30"
text-decoration="overline"
>
雷猴啊 </text>
<!-- 删除线 -->
<text
y="170"
font-size="30"
text-decoration="line-through"
>
雷猴啊 </text>
<!-- 下划线 -->
<text
y="240"
font-size="30"
text-decoration="underline"
>
雷猴啊 </text></svg>复制代码
水平对齐方式 text-anchor
可以通过 text-anchor
属性设置文本水平对齐方式。
如果本子是从左向右书写,那这几个参数的意思就是:
start
: 左对齐middle
: 居中对齐end
: 右对齐
多行文本
多行文可以使用本 <tspan>
标签辅助实现
<svg width="400" height="400" style="border: 1px solid red;">
<text fill="blue">
<tspan x="10" y="30" fill="red">雷猴</tspan>
<tspan x="10" y="60">鲨鱼辣椒</tspan>
<tspan x="10" y="90">蟑螂恶霸</tspan>
<tspan x="10" y="120">蝎子莱莱</tspan>
</text></svg>复制代码
<tspan>
要放在 <text>
里,而且会继承 <text>
设置的样式。
如果在 <tspan>
里设置的样式和 <text>
的样式有冲突,最后会使用 <tspan>
的样式。
水平对齐方式
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 参考线 -->
<path d="M 200 0 200 400" stroke="red"></path>
<!-- 左对齐 -->
<text
x="200"
y="100"
text-anchor="start"
>
雷猴 </text>
<!-- 居中对齐 -->
<text
x="200"
y="130"
text-anchor="middle"
>
雷猴 </text>
<!-- 右对齐 -->
<text
x="200"
y="160"
text-anchor="end"
>
雷猴 </text></svg>复制代码
垂直对齐方式 dominant-baseline
可以通过 dominant-baseline
属性设置文本垂直对齐方式
auto
: 默认的对齐方式,保持与父元素相同的配置。text-after-edge
: 在基线上方middle
: 居中基线text-before-edge
: 在基线下方
<svg width="400" height="400" style="border: 1px solid red;">
<!-- 参考线 -->
<path d="M 0 200 400 200" stroke="red"></path>
<!-- 默认 -->
<text
x="20"
y="200"
dominant-baseline="auto"
>
雷猴 </text>
<!-- 在基线上方 -->
<text
x="80"
y="200"
dominant-baseline="text-after-edge"
>
雷猴 </text>
<!-- 居中基线 -->
<text
x="160"
y="200"
dominant-baseline="middle"
>
雷猴 </text>
<!-- 在基线下方 -->
<text
x="240"
y="200"
dominant-baseline="text-before-edge"
>
雷猴 </text></svg>复制代码
纵向文字 writing-mode
将 writing-mode
设置成 tb
就可以让文字纵向排列。
需要注意英文和中文的文字角度!
<svg width="400" height="400" style="border: 1px solid red;">
<text x="20" y="20" writing-mode="tb">Hello World!</text>
<text x="100" y="20" writing-mode="tb">鲨鱼辣椒</text></svg>复制代码
有些教程里面会讲 glyph-orientation-vertical
属性可以旋转文字方向,但不推荐这个方法,因为现在的浏览器可能不再支持它了。
可以看看这个文档的说明:《glyph-orientation-vertical》
超链接
和 HTML
一样,超链接可以使用 <a>
标签实现。
在 SVG
里,链接要放在 xlink:href
属性里。
如果希望鼠标放到链接上出现提示信息,可以在 xlink:title
属性里编写提示信息。
如需在新窗口打开链接,可以设置 target="_blank"
。
<svg width="400" height="400" style="border: 1px solid red;">
<a xlink:href="https://juejin.cn/post/7116784455561248775" xlink:title="canvas" target="_blank">
<text x="20" y="20">也学学Canvas吧</text>
</a></svg>复制代码
此时点击图片上的链接就会跳到对应的页面。
<a>
标签里除了可以包裹文本外,还可以包裹各种图形和图片等元素。
图片 image
在 SVG
中可以使用 <image>
标签加载图片,包括位图。
<image>
是使用 xlink:href
属性获取图片的
<svg width="400" height="400" style="border: 1px solid red;">
<image xlink:href="./img.jpg"></image></svg>复制代码
图片标签其实没什么好说的,和 HTML
的 <img>
标签用法差不多。
总结
通过上面这么多例子应该对 SVG
有一个大致的了解了。SVG
在前端编码中,感觉就像一堆新的标签。我们只要当它是 HTML
那样使用就行了。
程序员面试题库分享
1、前端面试题库 (面试必备) 推荐:★★★★★
地址:前端面试题库
2、前端技术导航大全 推荐:★★★★★
地址:前端技术导航大全
3、开发者颜色值转换工具 推荐:★★★★★
地址 :开发者颜色值转换工具
4、前端边框阴影在线工具 推荐:★★★★★
地址:前端边框阴影在线工具
SVG 从入门到后悔,怎么不早点学起来(图解版)的更多相关文章
- 突袭HTML5之SVG 2D入门1 - SVG综述////////////////zzzzzzzz
以二次贝塞尔曲线的公式为例: js函数: //p0.p1.p2三个点,其中p0为起点,p2为终点,p1为控制点 //它们的坐标用数组表示[x,y] //t的范围是0-1 function qBerzi ...
- SVG Sprite 入门(SVG图标解决方案)
关于浏览器图标解决方案,一直就有很多 CSS Sprite,Icon Font,CSS Icon以及SVG.相对而言svg矢量图标以及支持浏览器自身解析的优点,很多团队都已经在使用了.这篇文章主要说明 ...
- VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)
原文地址: VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)-软件开发-鸡啄米 http://www.jizhuomi.com/software/139.html 上一讲中鸡 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
- [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手 http://www.52im.net/thread-1729-1-1.html 1.引言 网络编程中TCP协议的三次握手和 ...
- python从入门到精通之30天快速学python视频教程
点击了解更多Python课程>>> python从入门到精通之30天快速学python视频教程 课程目录: python入门教程-1-Python编程语言历史及特性.mkv pyth ...
- SVG 新手入门
svg 入门新认知 一.第一步创建设置svg <svg width="100%" height="500"> </svg> 设置粗细 5 ...
- SVG 2D入门11 - 动画
交互性 SVG拥有良好的用户交互性,例如:1. SVG能响应大部分的DOM2事件.2. SVG能通过cursor良好的捕捉用户鼠标的移动.3. 用户可以很方便的通过设置svg元素的zoomA ...
- SVG 2D入门13 - svg对决canvas
到目前为止,SVG与Canvas的主要特性均已经总结完毕了.它们都是HTML5中支持的2D图形展示技术,而且均支持向量图形.现在,我们就来比对一下这两种技术,分析一下它们的长处和适用场景.首先分析一下 ...
- SVG 2D入门12 - SVG DOM
使用脚本可以很方便的完成各种复杂的任务,也是完成动画和交互的一种主流方式.由于SVG是html的元素,所以支持普通的DOM操作,又由于SVG本质上是xml文档,所以也有一种特殊的DOM操作,大多称之为 ...
随机推荐
- python进阶之路13 二分法 三元表达式 各种生成式 匿名函数
算法简介及二分法 1.什么是算法 算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法 2.算法应用场景 推荐算法(抖音视频推送 淘宝商品推送) 成像算法(AI相关)...... 几乎涵 ...
- 阿里云Imagine Computing创新技术大赛决赛启幕!
2023年1月,由阿里云与英特尔主办,阿里云天池平台.边缘云.视频云共同承办的"新算力 新体验"Imagine Computing创新技术大赛复赛圆满落幕.经过两个多月的激烈角逐, ...
- YMOI 2019.6.8
题解 YMOI 2019.6.8 前言 第二回考试,承让拿了第一次rank1,(●ˇ∀ˇ●) 题解 这次考试总体发挥比较好,每一道题都尽可能得取得了所能及的所有分.虽然多少还是有失误,不过在所难免.保 ...
- Ubuntu 22.04 BigSur 美化
安装 tweaks sudo apt update && sudo apt upgrade sudo apt install gnome-tweaks gnome-shell-exte ...
- NuxtJS踩坑日记,一步一步爬出我自己挖的坑。
NuxtJS 2 errors and 2 warnings potentially fixable with the `--fix` option. 第二种报错 Error: No build ...
- Ubuntu安装Anaconda并且配置国内镜像教程
前言 我们在学习 Python 的时候需要不同的 Python 版本,关系到电脑环境变量配置换来换去很是麻烦,所以这个时候我们需要一个虚拟的 Python 环境变量,我之前也装过 virtualenv ...
- Docker+nginx部署前后端分离项目
1.下载Docker和Docker-Compose 1.安装Docker 记一次踩坑:误装podman-docker 问题概述:Centos8去下载Docker时,默认装的是podman-docker ...
- 双缓冲技术解决MFC绘制闪烁问题
闪烁的根源:OnEraseBkgnd一擦一写造成了图象颜色的反差导致闪烁 如何避免:首先要做的是屏蔽背景刷新.背景刷新其实是在响应WM_ERASEBKGND消息.我们在视类中添加对这个消息的响应 BO ...
- MongoDB数据库记录
启动 MongoDB 服务 标准 URI 连接语法: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:po ...
- P23_列表渲染
列表渲染 wx:for 通过 wx:for 可以根据指定的数组,循环渲染重复的组件结构,语法示例如下: 默认情况下,当前循环项的索引用 index 表示:当前循环项用 item 表示. 手动指定索引和 ...