JS基础系列之 —— SVG 基础

1. 概念

1.1 定义

可缩放矢量图形 Scalable Vector Graphics,SVG ),是一种用于描述二维的 矢量图形 ,基于 XML 的标记语言。作为一个基于文本的开放网络标准,SVG 能够优雅而简洁地渲染不同大小的图形,并和 CSS DOM JavaScript SMIL 等其他网络标准无缝衔接。本质上,SVG 相对于图像,就好比 HTML 相对于文本。

codepen.io/xjGafi/pen/y

1.2 基本属性

1.2.1 笔画特性

属性
stroke 笔画颜色,默认值为 none
stroke-width 笔画宽度,可用用户坐标或者指定单位的方式指定。笔画的宽度会相对坐标网格 线居中。默认值为 1
stroke-opacity 数字,从 0.0 到 1.0。0.0 是完全透明,1.0 是完全不透明(默认值)
stroke-dasharray 用一系列的数字来指定虚线和间隙的长度。这些数字只能使用用户坐标,默认值为 none
stroke-linecap 线头尾的形状,值为 butt(默认值)、round 或 square
stroke-linejoin 图形的棱角或者一系列连线的形状,取值为 miter(尖的,默认值)、round 或者 bevel(平的)
stroke-miterlimit 相交处显示宽度与线宽的最大比例,默认值为 4

1.2.2 填充特性

属性
fill 填充颜色,默认值为 black
fill-opacity 从 0.0 到 1.0 的数字,0.0 表示完全透明,1.0(默认值)表示完全不透明
fill-rule 属性值为 nonzero(默认值)或 evenodd。该属性决定判断某个点是否在图形内部的方法。只有当边线交叉时或者内部有“洞”时才有效

1.3 重点属性

1.3.1 viewBox 属性

viewBox 属性的值有四个数字,分别是左上角的横坐标和纵坐标、视口的宽度和高度。上面代码中,SVG 图像宽度是 100px , 高度是 100px viewBox 属性指定视口从 (50, 50) 这个点开始。所以,实际看到的是右下角的四分之一圆。

效果: Attention Required! | Cloudflare

注意,视口必须适配所在的空间。上面代码中,视口的大小是 50 x 50,由于 SVG 图像的大小是 100 x 100,所以视口会放大去适配 SVG 图像的大小,即放大了四倍。

如果不指定 width 属性和 height 属性,只指定 viewBox 属性,则相当于只给定 SVG 图像的长宽比。这时,SVG 图像的默认大小将等于所在的 HTML 元素的大小。( width、height 和 viewBox 属性都不指定时,默认宽度是 300px , 高度是 150px

1.4 基本标签

基本标签的图形标签这块相对比较好理解,我们直接一张表总结下。

图形 标签 用法 描述
矩形 < rect > <rect x="60" y="10" rx="10" ry="10" width="30" height="30" /> x:起点横坐标,y:起点纵坐标,rx:倒角x 轴方向半径,ry:倒角x轴方向半径,width:宽度,height:高度
圆形 < circle > <circle cx="100" cy="100" r="50" /> cx:圆心横坐标,cy:圆心纵坐标,r:半径
椭圆 < ellipse > <ellipse cx="75" cy="75" rx="20" ry="5" /> cx:椭圆心横坐标,cy:椭圆心纵坐标,rx:椭圆x轴方向半径,ry:椭圆y轴方向半径
直线 < line > <line x1="10" x2="50" y1="110" y2="150" /> x1,y1:起点,x2,y2:终点
折线 < polyline > <polyline points="60 110, 65 120, 70 115, 75 130, 80 125, 85 140, 90 135, 95 150, 100 145" /> 每两个点以空格配对为一个坐标点,逗号隔开形成坐标集合。连成折线。
多边形 < polygon > <polygon points="50 160, 55 180, 70 180, 60 190, 65 205, 50 195, 35 205, 40 190, 30 180, 45 180" /> 类似折线,不同的是,最后一个点会自动闭合第一个点,形成闭环。
路径 <path> <path d="M 100 100 L 300 100 L 200 300 z" /> 通过指定点以及点和点之间的线来创建任意形状。
图片 <image> <image xlink:href="./logo.png" x="0" y="0" height="100" width="100" /> 将图片嵌入到 SVG 中。
文本 <text> <text x="250" y="150" font-family="Times New Roman" font-size="55"> Hello SVG </text> 一个由文字组成的图形。

1.5 重点标签

1.5.1 path 标签

在 SVG 里,你可以把 path 看成是最基本的绘制元素,正因为它是最基本的,万变不离其宗,他能演化出各种复杂的绘制效果。所以 path 是最基本也是最复杂的绘制元素。

path 标签,最重要的属性是 d 属性,它是一组指令和参数的集合。在 d 属性的值里,我们能看到一堆非常复杂的指令字符串。

<path
    M73.8616812,68.8664775
    L74.5015359,74.5939423
    L68.1746283,71.7969507
    C66.2299599,72.4159872 64.1377269,72.7711218 61.9444643,72.7711218
    C51.9719158,72.7711218 43.8883163,65.7823167 43.8883163,57.1611168
    C43.8883163,48.5399169 51.9719158,41.5511118 61.9444643,41.5511118
    C71.9164005,41.5511118 80,48.5399169 80,57.1611168
    C80,61.8286883 77.6181486,66.006419 73.8616812,68.8664775