内容简介:认识一下 SVG
SVG,即可缩放矢量图形(Scalable Vector Graphics),它能够以 XML 格式的文本表示图形信息。
基本形状
- 线段
<linex1="100"
y1="100"
x2="300"
y2="300"
stroke="green"
stroke-width="2"/>
- 矩形
<!-- 普通矩形 -->
<rectx="100"
y="100"
width="200"
height="100"
fill="red" />
<!-- 圆角矩形 -->
<rectx="100"
y="100"
width="200"
height="100"
rx="50"
ry="50"
fill="red" />
- 圆
<circlecx="100"
cy="100"
r="50"
fill="red" />
- 椭圆
<ellipsecx="100"
cy="100"
rx="80"
ry="40"
fill="red" />
- 多边形
<polygonpoints="15,10 55,44 100,22 100,44 55,55"
fill="red" />
- 折线
<polylinepoints="11,11 333,44 222,9 66,90"
stroke="green"
fill="none" />
其它 SVG 元素
- <g> 元素,常用来组合元素,并且通常会为其分配一个 id 作为唯一名称
<gid="group1">
<!--add some thing-->
</g>
- <use> 元素,常用来复用一个通过 g 元素组合的对象
<usexlink:href="#group1"x="70"y="90"/>
- <defs> 元素的作用是:将那些需要复用的组合对象放到其中,但是不会显示,只是进行定义
<defs>
<gid="group1"></g>
<gid="group2"></g>
<gid="group3"></g>
</defs>
<usexlink:href="#group1"x="99"y="66"/>
<usexlink:href="#group3"x="11"y="6"/>
- <image> 元素,用于引用外部的 svg 文件或栅格图形文件
<imagexlink:href="./test.jpg"
x="100"
y="100"
height="100"
width="200" />
- <text> 元素为 SVG 引入文本
<textx="0"y="15"fill="red">I love SVG</text>
<!-- 为引入的文本添加超链接 -->
<axlink:href="https://www.w3schools.com/graphics/"target="_blank">
<textx="0"y="15"fill="red">I love SVG!</text>
</a>
<!-- 为文本使用文本路径 -->
<defs>
<pathid="myPath"
d="M150 58 C6 40 123 321 130 118" />
</defs>
<textstyle="stroke:red">
<textPathxlink:href="#myPath">
asdsadasdasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</textPath>
</text>
坐标系统
-
svg 的
width、height属性用来声明当前 svg 文档视口的大小
<svgwidth="500"
height="500"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rectx="100"
y="100"
width="200"
height="100" />
</svg>
一旦 svg 的视口大小被声明出来后, 最初的坐标系统
和 用户坐标系统
也会同时被建立。默认情况下,这两个坐标系统是完全一样的,都是基于视口大小建立起来的。但是
在声明了 viewBox 属性
后,用户坐标系统将基于视口进行一定程度的缩放,以达到 viewBox 属性指定的效果。
而且实际上,用户坐标系统才是真正的坐标系统,所有的图形点的坐标都是基于这个用户坐标系统,而不是基于最初的坐标系统。
-
viewBox 属性:
为视口指定用户坐标系统
- 有四个值:最小 x 坐标、最小 y 坐标、宽度、高度。
<svgwidth="500"
height="500"
viewBox="0 0 200 200"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rectx="100"
y="100"
width="100"
height="50" />
</svg>
上面 viewBox 的宽高比正好和视口的宽高比一样,那如果两者的比率不一样呢?如果比率不一样,viewBox 还是会基于视口进行一定程度的缩放,默认情况下它会使自己全部显示在视口中,并且在水平和垂直上都会居中,这是因为 preserveAspectRatio
的默认值就是 xMidYMid meet
。
- preserveAspectRatio 属性: 用来指定被缩放的 viewBox 相对视口的对齐方式,以及是希望它适配边缘还是要裁剪。
preserveAspectRatio="xAlignmentYAlignment [meet | slice]" xAlignment = [xMin | xMid | xMax] yAlignment = [yMin | yMid | yMax]
preserveAspectRatio 还有一个值是 none
,设定了这个值后,viewBox 将不会被保持原来的比率进行缩放,结果是它被横向或纵向拉伸。
<svgwidth="500"
height="500"
viewBox="0 0 400 200"
preserveAspectRatio="none"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rectx="100"
y="100"
width="100"
height="50" />
</svg>
坐标系统变换
当你为一个 svg 元素应用 transform 属性时,这个元素就会拷贝一个当前的坐标系统用来完成自己相应的变换。
-
SVG 中的变换变换的是拷贝后的坐标系统
- translate(x, y): 移动坐标系统
- scale(x, y): 缩放坐标系统
- rotate(angle, centerX, centerY): 旋转坐标系统
- skewX(angle): 倾斜 x 坐标轴
- skewY(angle): 倾斜 y 坐标轴
<gid="rect">
<rectx="100"
y="100"
width="200"
height="100" />
</g>
<usexlink:href="#rect"
x="0"
y="0"
transform="scale(0.5) translate(0,120)" />
路径
path 元素是一个更通用的用来表示图形的 svg 元素,我们前面提到的 所有的基本形状都可以通过 path 元素进行表示 ,但是为了让 svg 结构化以及增强可读性,建议尽可能地使用这些简写形式。
-
所有描述轮廓的信息都放在 path 元素的 d(data 的简写)属性中
- d 属性的值由一系列路径命令组成
- 命令都由一个字母进行表示,并且大写字母后面跟绝对坐标,而小写字母后面跟相对坐标
- 使用逗号或空格来分隔 x 和 y 坐标
### 路径命令 M 移动到给定坐标 L 绘制一条道给定坐标的直线 H 绘制一条到给定 x 坐标的水平直线 V 绘制一条到给定 y 坐标的水平直线 A 绘制一条椭圆弧 Q 绘制一条二次贝赛尔曲线 T 绘制一条光滑的二次贝赛尔曲线 C 绘制一条三次贝赛尔曲线 S 绘制一条光滑的三次贝赛尔曲线 Z 闭合路径,绘制一条终点到起点的直线
-
书写更简洁的路径表示法的两条规则
-
可以在
L或l命令后放多组坐标 - 所有不必要的空白都可以消除(命令字母与数字之间的空白可消除,正数和负数之间的空白也可消除)
-
可以在
<!-- 原始路径 --> <pathd="M 100,100 L 200,200 L 100,300 Z"/> <!-- 简洁的路径 --> <pathd="M100,100L200,200 100,300Z"/>
- 一个简单的动画
See the Pen simple-svg-animation by percy ( @percy507 ) on CodePen .
SVG 的 CSS 属性
line {
stroke: green; /* 笔画颜色 */
stroke-width: 3; /* 笔画宽度 */
stroke-opacity: 0.5; /* 笔画透明度 */
/* 笔画效果,虚线、点线,它的值由一个或多个数字组成 */
stroke-dasharray: 10, 20, 5, 15;
/*
指定线段的头尾形状,butt、round(圆的)、square(平的)
round 和 square 的起止位置都超过了真实位置,默认值 butt 则精确地与起止位置对齐
*/
stroke-linecap: round;
/*
指定线段在图形棱角处交叉时的效果
miter(尖的)、round(圆的)、bevel(平的)
*/
stroke-linejoin: round;
}
rect {
fill: green; /* 填充的颜色 */
fill-opacity: 0.5; /* 填充颜色的透明度 */
}
其它的 CSS 属性用到了会再补充 ~
我上面有关坐标系统和坐标系统的变换讲的不太详细,大家可以看看下面的一系列文章,超级详细,并且配有可视化的图片,理解起来更容易。
以上所述就是小编给大家介绍的《认识一下 SVG》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。