简介

使用XML描述的矢量文件

位图(BMP.PNG.JPG)

矢量图(SVG,AI)

使用方式

  • 浏览器直接打开
  • 嵌套中<img src="Demo.svg">
  • 使用SVG标签
  • CSS背景

理解viewport 与 viewbox

viewport该属性表示的是SVG可见区域的大小。或者也可以叫画布的大小。就好比我们的电脑屏幕,我们只能看到我们电脑屏幕的可视区里面的内容,但是看不到电脑屏幕之外的内容。

如果我们没有给svg设置宽度和高度的话,它默认的宽度为300px,高度为150px;

image.png

在svg中有一个默认的坐标系统,其中 水平坐标(x坐标)向右递增的,垂直坐标(y坐标)是向下递增的。原点坐标是(0, 0).

viewbox

viewBox=”x, y, w, h”; 该属性的含义是可视区盒子,即画布的可视区。
viewport 和 viewBox 分别有自己的坐标系,默认情况下,该两个坐标系是重合的,即转换关系是 1:1。
x: 指左上角的坐标,y: 左上角的纵坐标,w: 指宽度,h: 指高度

1. 画布(viewport)、可视区(viewBox) 的宽度的高度相等情况





如上代码,svg的画布大小,宽度为400px,高度为200px,然后使用viewBox属性定义画布的可视区的大小宽度也是400px,高度也是200px, 因此该两个坐标系是重合的,因此我们使用 rect 来创建矩形的话,定义宽度和高度分别为100px,x轴和y轴的偏移位置为10px; 效果如下所示:

SVG简介 - 图2

2. 画布不变,可视区的宽度减小的情况

比如如下代码,可视区的宽度减少100px, 如下代码所示:






运行结果如下所示:

SVG简介 - 图3

如上代码,画布大小的宽度是400px,可视区的宽度变成300px; 因此为了使他们的中心点能重合的话,因此需要向右移动的距离 = 400 - 300 / 2 = 50px; 由于 rect 中的x偏移了10px,因此加起来就是偏移了60px了,可以把下面的div作为参照物即可看到。
如下示意图所示解释
SVG简介 - 图4
下面我们继续把可视区的宽度改为200px; 如下代码:
SVG简介 - 图5







SVG简介 - 图6
然后我们运行结果如下所示:
SVG简介 - 图7
可以看到,矩形需要偏移的距离 = 400-200/2 + 10 = 110px; 从下面的div中的margin-left 我们可以看到 偏移110px的时候,才能使 画布(viewport)和可视区(viewBox)的中心点能够重合。我们可以继续看如下示意图所示:
SVG简介 - 图8

3. 画布不变,可视区的高度减小的情况

如下代码:
SVG简介 - 图9




SVG简介 - 图10
运行结果如下所示:
SVG简介 - 图11
如上可以看到,矩形向下偏移的距离 = 200 - 100 / 2 + 10 = 60px; 因此我们可以看到我们的下面的div元素 margin-top:60px; 就可以对齐了。

4. 可视区不变,画布宽度变小

如果可视区不变的话,画布宽度减少的话,那么矩形也要等比例缩小,比如如下代码:
SVG简介 - 图12




SVG简介 - 图13
运行结果如下所示:
SVG简介 - 图14
如上可以看到,矩形本来大小是 100px*100px,现在画布的宽度改成100px了,那么矩形也变成原来的一半了,至于向下移动距离的计算 = 200 - 100 / 2 = 50px;

初始化

  1. <svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  2. <circle cx="100" cy="50" r="40" fill="red">
  3. </svg>

<svg> 可以指定width和height属性,说明它在HTML中所占的宽度和高度。如果不指定默认300x150。

<svg>中有一个viewbox属性这个属性的四个值分别代表左上角的横坐标和纵坐标,视口的宽度与高度

如果不指定width和height只指定viewbox,则相当于只给定 SVG 图像的长宽比。这时,SVG 图像的默认大小将等于所在的 HTML 元素的大小

基本图形

  • rect 矩形
  • circle圆形
  • elipse椭圆
  • line线
  • polyline折线
  • polygon多边形
  • 路径 path

基本属性

  • fill 填充颜色
  • stroke
  • stroke-width
  • transform
  1. //矩形
  2. <svg viewBox="0 0 600 400">
  3. <rect width="300" height="100"
  4. style="fill:red;stroke-width:1;stroke:rgb(0,0,0)"/>
  5. </svg>
  • width|height宽度与高度
  • style CSS属性
  • fill填充颜色
  • stroke-width边框宽度
  • stroke边框颜色
  • x距离左边的位置
  • y距离顶部的位置
  • fill-opacity 颜色透明度
  • stroke-opacity边框透明度
  • rx|ry圆角属性
  1. <!-- 圆形 -->
  2. <circle cx="0" cy="0" r="40" fill="red" />
  • cx横坐标
  • cy纵坐标
  • r半径
  1. <!-- 椭圆 -->
  2. <ellipse cx="300" cy="80" rx="100" ry="50"
  3. style="fill:yellow;stroke:purple;stroke-width:2"/>
  • cx横偏移
  • cy纵偏移
  • rx水平半径
  • ry垂直半径
  1. <!-- 直线 -->
  2. <line x1="0" y1="0" x2="200" y2="200" fill="red" stroke="red"/>
  • x1
  • y1 确定开始位置
  • x2
  • y2 结束位置

折线,指定每个端点的坐标,横坐标与纵坐标用逗号分开,点与点用空格分开

  1. <!-- 折线 -->
  2. <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" style="fill:none;stroke:black;stroke-width:3" />
  • points路径点
  1. <!-- 多边形 -->
  2. <polygon points="200,10 250,190 160,210"
  3. style="fill:lime;stroke:purple;stroke-width:1"/>
  • pointsxy组成一个点 然后空格分隔 最后连线

Path

区分大小写。大写绝对位置,小写为相对位置

命令 参数

  • M移动画笔
  • L绘制直线到指定位置
  • H绘制水平线到指定的X位置
  • V绘制竖直的的指定的Y位置
  1. <!-- 直线Demo -->
  2. <path d="M0 0 L 200 300 M 0 0 L 100 100 H 400" stroke="red" stroke-width="2" fill="none"/>

曲线

A六个参数

前两个参数绘制椭圆形 第三个参数确定旋转角度 第四个第五个参数确认需要的弧度值为[0,1] 第六七参数结束坐标

文本

标签

  • <text>
  • <tspan>

属性

  • x|y
  • dx|dy
  • style

路径文本

  • <textPath>
  1. <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
  2. <defs>
  3. <path id="path1" d="M75,20 a1,1 0 0,0 100,0" />
  4. </defs>
  5. <text x="10" y="100" style="fill:red;">
  6. <textPath xlink:href="#path1">I love SVG I love SVG</textPath>
  7. </text>
  8. </svg>

超链接

  • xlink:href 地址
  • xlink:title 链接提示
  • target 打开方式

Color

  • Rgb
  • HSL
    • 颜色
    • 饱和度
    • 亮度
  • 透明度
    • rgba
    • opacity属性[0,1]

渐变

  • 线性渐变
  • 径向渐变
  1. <defs>
  2. <linearGradient id="grad1" gradientUnits="userSpaceOnUse"
  3. x1="0" y1="100" x2="200" y2="50"
  4. >
  5. <stop offset="0" stop-color="#fcd307"></stop>
  6. <stop offset="0" stop-color="#1c1259"></stop>
  7. </linearGradient>
  8. </defs>
  9. <rect width="200" height="200" fill="url(#grad1)"/>

其他

use标签

标签用于复制一个形状

g标签

用于将多个形状组成一个组(group),方便复用

defs标签

用于自定义形状,它内部的代码不会显示,仅供引用

  1. <svg width="300" height="100">
  2. <defs>
  3. <g id="myCircle">
  4. <text x="25" y="20">圆形</text>
  5. <circle cx="50" cy="50" r="20"/>
  6. </g>
  7. </defs>
  8. <use href="#myCircle" x="0" y="0" fill="red"/>
  9. <use href="#myCircle" x="100" y="0" fill="blue" />
  10. <use href="#myCircle" x="200" y="0" fill="white" stroke="blue" />
  11. </svg>

JavaScript操作

创建图形

  1. document.createElementNS(ns, tagName);

添加形状

  1. element.appendChild(childElement)

设置|获取属性

  1. element.setAttribute(name, value);
  2. element.getAttribute(name);

工具

image.png
https://jakearchibald.github.io/svgomg/