一、SVG名词解释
- 画布(世界)
世界可以是无限大,你想让它多大就多大,可以在上面绘制很多东西。但是世界上的所有东西都能被页面看到(视野只能看到视野所看到的部分) - 视野
被页面看到的部分是视野。视野是可以移动的(类似于截图模式) - 视窗
在 svg中的宽和高(相当于全屏模式)
二、SVG viewBox
- viewBox属性允许指定一个给定的一组图形伸展以适应特定的容器元素
- viewBox属性的值是一个包含4个参数的列表 min-x, min-y, width and height, 以空格或者逗号分隔开, 在用户空间中指定一个矩形区域映射到给定的元素
例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
svg {
width: 300px;
height: 300px;
border: 1px solid green;
}
</style>
</head>
<body>
<!--
viewbox="0,0,30,30"
0,0 左上角(原点坐标)
30,30 自定义了svg的宽高
svg宽高300*300,被我等比例缩放为30*30
-->
<svg>
<rect x=10 y=10 width=10 height=10 fill='red'></rect>
</svg>
<!--
原图像大小 10 10 原图像位置 10 10
原画布大小300*300 现画布只取100*100,则原位置横坐标扩大三倍,纵坐标扩大三倍
现画布大小 30 30 现图像位置 30 30
-->
<svg viewbox="0,0,100,100">
<rect x=10 y=10 width=10 height=10 fill='red'></rect>
</svg>
<!--
viewbox(视野) 的宽高比视窗的宽高大,图形则缩小
viewbox(视野) 的宽高比视窗的宽高小,图形则放大
-->
<svg viewbox="0,0,600,600">
<rect x=10 y=10 width=100 height=100 fill='green'></rect>
</svg>
<svg>
<rect x=10 y=10 width=100 height=100 fill='green'></rect>
</svg>
<!--
注意:
viewbox(视野),宽高不能为0,为0的话画布上的图形,都是不可见的
-->
<svg viewbox="100,100,100,100">
<rect x=10 y=10 width=100 height=100 fill='pink'></rect>
</svg>
</body>
</html>
三、SVG preserveAspectRatio
属性值 | 说明 |
---|---|
xMin | viewport和viewBox 左边对齐 |
xMid | viewport和viewBox x轴中心对齐 |
xMax | viewport和viewBox 右边对齐 |
YMin | viewport和viewBox 上边对齐 |
YMid | viewport和viewBox y轴中心对齐 |
YMax | viewport和viewBox 下边对齐 |
属性值 | 说明 |
---|---|
meet | 保持纵横比缩放viewBox适应viewport |
slice | 保持纵横比同时比例小的方向放大填满viewport |
none | 扭曲纵横比以充分适应viewport |
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
svg {
width: 300px;
height: 300px;
border: 1px solid green;
}
</style>
</head>
<body>
<!--
viewbox="0,0,30,30"
0,0 坐上角(原点坐标)
30,30 自定义了svg的宽高
svg宽高300*300,被我等比例缩放为30*30
-->
<svg>
<rect x=10 y=10 width=10 height=10 fill='red'></rect>
</svg>
<!-- 注意:
x必须小写,Y 必须大写,组合使用
preserveAspectRatio="xMinYMin"
-->
<!-- 左上 -->
<svg viewbox="0,0,100,30" preserveAspectRatio="xMinYMin">
<rect x=10 y=10 width=10 height=10 fill='red'></rect>
</svg>
<!-- 左下 -->
<svg viewbox="0,0,100,30" preserveAspectRatio="xMinYMax">
<rect x=10 y=10 width=10 height=10 fill='red'></rect>
</svg>
<!-- 居中 -->
<svg viewbox="0,0,100,30" preserveAspectRatio="xMidYMid">
<rect x=10 y=10 width=10 height=10 fill='red'></rect>
</svg>
<!-- 设置视野与视窗的宽高比 -->
<!--
meet 保持纵横比缩放viewBox适应viewport (相当于css中的b-size的属性值contain)
slice 保持纵横比同时比例小的方向放大填满viewport (相当于css中的b-size的属性值cover)
-->
<svg viewbox="0,0,100,30" preserveAspectRatio="xMinYMid none">
<rect x=10 y=10 width=10 height=10 fill='pink'></rect>
</svg>
</body>
</html>
四、SVG 坐标系
- 对于所有元素,SVG使用的坐标系统或者说网格系统,和Canvas用的差不多(所有计算机绘图都差不多)。这种坐标系统是:以页面的左上角为(0,0)坐标点,坐标以像素为单位,x轴正方向是向右,y轴正方向是向下
四个坐标系
- 用户坐标系,世界的坐标系
- 自身坐标系,每个图形元素或分组独立与生俱来的
- 前驱坐标系,父容器的坐标系
- 参考坐标系,使用其他坐标系来参考研究自身的情况使用
用户坐标:
-
SVG的世界是无穷大的,世界里面的坐标系就是用户坐标系
-
用户坐标系是最原始的坐标系,其他的坐标系都是基于用户坐标系产生的。因此,用户坐标系也被称为原始坐标系
自身坐标: -
每个图形或者分组都拥有自己的坐标系,用于定义自己的一些图形属性,例如宽高。
前驱坐标: -
父容器的坐标系,图形进行坐标变换都是基于前驱坐标系;
参考坐标:
- 使用其他坐标系来观察自身元素坐标位置时使用
小锤子案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
svg {
width: 800px;
height: 600px;
border: 1px solid green;
}
</style>
</head>
<body>
<!--
分组标签
g标签 用于分组
分组功能用于:图形、文字、线段进行分组
分组可以对一组svg的元素统一调整样式,坐标
-->
<svg>
<!-- 锤子的头 -->
<!-- <rect x=100 y=50 width=100 height=50 fill="none" transform="translate(0,50)" stroke="green"></rect> -->
<!-- 锤子的把手 -->
<!-- <rect x=140 y=100 width=20 height=120 fill="none" transform="translate(0,50)" stroke="green"></rect> -->
<g fill="none" transform="translate(100,50),rotate(45)" stroke="red">
<!-- 锤子的头 -->
<rect x=100 y=50 width=100 height=50></rect>
<!-- 锤子的把手 -->
<rect x=140 y=100 width=20 height=120></rect>
</g>
<!--
平移:400,50
旋转:45°
缩放:放大0.5
-->
<g fill="none" transform="translate(400,50),rotate(45),scale(1.5,1.5)" stroke="red">
<!-- 锤子的头 -->
<rect x=100 y=50 width=100 height=50></rect>
<!-- 锤子的把手 -->
<rect x=140 y=100 width=20 height=120></rect>
</g>
</svg>
</body>
</html>
五、HSL
- HSL即是代表色相,饱和度,亮度三个通道的颜色,通过对色相(H)、饱和度(S)、亮度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。
六、线性渐变
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
svg {
width: 300px;
height: 300px;
border: 1px solid green;
}
</style>
</head>
<body>
<svg>
<!--
id="line" 渐变定义的唯一名称
定义渐变开始和结束位置
x1='0%' y1='0%' x2='0%' y2='100%'
渐变的颜色范围,可以由两种或两种以上的颜色组成,一个颜色通过一个stop标签来定义
<stop offset='0%' style="stop-color: pink;"></stop>
offset='0%' 设置渐变开始和结束
填充渐变
fill="url(渐变的id名称)" #
fill="url(#line)"
-->
<!-- 创建了渐变 -->
<!-- 垂直渐变 y1与y2不同时-->
<!-- <linearGradient id="line" x1='0%' y1='0%' x2='0%' y2='100%'>
<stop offset='0%' style="stop-color: pink;"></stop>
<stop offset='50%' style="stop-color: bisque;"></stop>
<stop offset='100%' style="stop-color: aqua;"></stop>
</linearGradient>
<rect fill="url(#line)" x=10 y=10 width=200 height=100></rect> -->
<!-- 对角渐变 x1,y1与x2,y2不同时-->
<!-- <linearGradient id="line" x1='0%' y1='0%' x2='100%' y2='100%'>
<stop offset='0%' style="stop-color: pink;"></stop>
<stop offset='50%' style="stop-color: bisque;"></stop>
<stop offset='100%' style="stop-color: aqua;"></stop>
</linearGradient> -->
<!-- 水平渐变 x1与x2不同时-->
<linearGradient id="line" x1='0%' y1='0%' x2='100%' y2='0%'>
<stop offset='0%' style="stop-color: pink;"></stop>
<stop offset='50%' style="stop-color: bisque;"></stop>
<stop offset='100%' style="stop-color: aqua;"></stop>
</linearGradient>
<rect fill="url(#line)" x=10 y=10 width=200 height=100></rect>
</svg>
</body>
</html>
七、径向渐变
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
svg {
width: 300px;
height: 300px;
border: 1px solid green;
}
</style>
</head>
<body>
<svg>
<!--
id="radial" 渐变定义的唯一名称
定义外圈渐变
cx='50%' cy='50%' r='40%'
定义内圈的渐变
fx='50%' fy='50%'
渐变的颜色范围,可以由两种或两种以上的颜色组成,一个颜色通过一个stop标签来定义
<stop offset='0%' style="stop-color: pink;"></stop>
offset='0%' 设置渐变开始和结束
填充渐变
fill="url(渐变的id名称)" #
fill="url(#line)"
通过fill属性引用
-->
<!-- 创建了渐变 -->
<radialGradient id="radial" cx='50%' cy='50%' r='40%' fx='50%' fy='50%'>
<stop offset='0%' style="stop-color: pink;"></stop>
<stop offset='50%' style="stop-color: #990033;"></stop>
<stop offset='100%' style="stop-color: aqua;"></stop>
</radialGradient>
<!-- <rect fill="url(#radial)" x=10 y=10 width=200 height=100></rect> -->
<circle fill="url(#radial)" cx=200 cy=120 r=100></circle>
</svg>
</body>
</html>
八、笔刷
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
svg {
width: 300px;
height: 300px;
border: 1px solid green;
}
</style>
</head>
<body>
<svg>
<!-- 笔刷:相当于一个样式容器,使用我们只要调用这个笔刷,进行样式填充。
绘制一个小圆作为样式
使用width与heiht 来表示该笔刷所占标签比例,横向与纵向平铺笔刷样式
-->
<pattern id="p1" width='0.1' height='0.1'>
<!-- 绘制小圆形 -->
<circle cx=10 cy=10 r=5 fill='red'></circle>
</pattern>
<rect fill="url(#p1)" x=10 y=10 width=200 height=100 stroke='red'></rect>
</svg>
</body>
</html>
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!