SVG基本使用

309 阅读3分钟

SVG基本介绍

可缩放矢量图形Scalable Vector Graphics,SVG),是一种用于描述二维的矢量图形,基于 XML 的标记语言。

  1. “矢量图形”格式,要显示的形状存储为矢量或类似矢量的结构。换句话说,作为数字。不以像素为单位。

  2. “可缩放”意味着观看者可以在不损失质量的情况下上下缩放SVG图像。这是可能的,因为图形被定义为数字而不是像素。向上或向下缩放SVG图像仅意味着将定义SVG形状的数字相乘或相除。

SVG 的常见元素

  • svg: 所有SVG图像的根元素都是 svg元素,svg元素可以相互包裹。
<svg xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">

  <svg x="10">
    <rect x="10" y="10" height="100" width="100"
        style="stroke:#ff0000; fill: #0000ff"/>
  </svg>
  <svg x="200">
    <rect x="10" y="10" height="100" width="100"
        style="stroke:#009900; fill: #00cc00"/>
  </svg>
</svg>

image.png

  • line: 用来创建一条连接两个点的线。这两个点由 4 个属性构成 (x1 y1 x2 y2
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
        <line x1="0"  y1="10" x2="0"   y2="100" style="stroke:#006600;"></line>
        <line x1="10" y1="10" x2="100" y2="100" style="stroke:#006600;"></line>
        <line x1="20" y1="10" x2="100" y2="50"  style="stroke:#006600;"></line>
        <line x1="30" y1="10" x2="110" y2="10"  style="stroke:#006600;"></line>
</svg>

image.png

  • rect: 用来创建矩形,基于一个角位置以及它的宽和高(x y height width)。它还可以用来创建圆角矩形(rx ry)。
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

    <rect x="10" y="10" height="50" width="50"
          rx="0" ry="0"
          style="stroke:#006600; fill: #00cc00"/>
    <rect x="70" y="10" height="50" width="50"
          rx="10" ry="10"
          style="stroke:#006600; fill: #00cc00"/>
    <rect x="130" y="10" height="50" width="50"
          rx="25" ry="25"
          style="stroke:#006600; fill: #00cc00"/>
</svg>

image.png

  • ellipse : 用于绘制椭圆。椭圆是高度和宽度不相等的圆。换句话说,它在x和y方向上的半径是不同的,由4个属性构成(cx cy rx ry)。
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

    <ellipse cx="40" cy="40" rx="30" ry="15"
           style="stroke:#006600; fill:#00cc00"/>
    <ellipse cx="110" cy="40" rx="30" ry="30"
	   style="stroke:#006600; fill:#00cc00"/>

</svg>

image.png

  • circle: 用来创建圆,基于一个圆心和一个半径( cy cx r)
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    <circle cx="40" cy="40" r="24" style="stroke:#006600; fill:#00cc00"/>

</svg>
  • polyline: 用来创建一系列直线连接多个点,典型的一个polyline是用来创建一个开放的形状,最后一点不与第一点相连,默认的fill是黑色。
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

    <polyline points="10,2  60,2  35,52"
        style="stroke:#006600; stroke-width: 2;
               fill: #33cc33;"/>
</svg>

image.png

  • polygon: 一个由一组首尾相连的直线线段构成的闭合多边形形状,最后一点连接到第一点。 polygon元素通常用于绘制具有多个(3个或更多)侧面/边缘的形状。
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

  <polygon points="10,0  60,0  35,50"
         style="stroke:green; fill:#cc3333;"/>
</svg>

image.png

  • defs:用于嵌入可在SVG映像内重用的定义。例如,您可以将SVG形状分组在一起,然后将其作为单个形状重复使用。在其的内容不会显示在SVG图像中。在显示它们之前,它们必须被use元素引用。
<svg width="500" height="100">
    <defs>
        <g id="shape">
            <rect x="0" y="0" width="50" height="50" ></rect>
            <circle cx="0" cy="0" r="50" ></circle>
        </g>
    </defs>

    <use xlink:href="#shape" x="50" y="50" ></use>
    <use xlink:href="#shape" x="200" y="50" ></use>

    <circle cx="50"cy="50" r="5" style="fill:#0000ff;"></circle>
    <circle cx="200"cy="50" r="5" style="fill:#0000ff;"></circle>

</svg>

image.png

  • g: 可以把需要组合在一起的元素编成一个分组。

  • symbol: 可重复使用的符号, 必须被 use元素引用,否则不会显示symbol内的形状。

<svg width="500" height="100">
    <symbol id="shape2">
        <circle cx="25" cy="25" r="25" />
    </symbol>

    <use xlink:href="#shape2" x="50" y="25" />
</svg>

image.png

symbol元素可以具有prepareAspectRatioviewBox属性。g不能具有这两个属性。 因此,与在defs元素内使用g元素相比,symbol元素可能是重用形状的更好方法。

SVG常见的属性

  • viewportviewbox
<svg width="500" height="200">

    <rect x="20" y="10" width="10" height="5"
          style="stroke: #000000; fill:none;"/>

</svg>

此时 viewport的宽度和高度分别是 500px200px

image.png

当加上viewbox时,viewport的大小不改变,但rect的宽高发生了变化,变成了100px50px

<svg width="500" height="200" viewBox="0 0 50 20" >

    <rect x="20" y="10" width="10" height="5"
          style="stroke: #000000; fill:none;"/>

</svg>

image.png

viewBox的前两个值(0 0)确定了左上角的点,后两个值(50 20)确定了右下角的点。此时viewportwidth:500就被分成了50份,所以rectwidth 变成了100,height也是如此。

  • stroke 属性
  1. stroke-width: 笔触的宽度,就是笔尖的大小。
  2. stroke-linecap: 笔尖的形状。值(序列= butt,square,round)

image.png

3.stroke-linejoin: 两条线相交处如何渲染。值(序列 = miter,round,bevel)

image.png

4.stroke-dasharray + stroke-dashoffset :以虚线呈现的SVG形状的笔触.之所以称为“破折号数组”,是因为您提供了一个数字数组作为值。这些值定义破折号和空格的长度。因此,您应该提供偶数个数字,如果只写一个表示虚线的长度和虚线的间隔是相同的值。

<svg width="500" height="120">
<line x1="20" y1="20" x2="120" y2="20"
      style="stroke: #000000; fill:none;
      stroke-width: 6px;
      stroke-dasharray: 10 5 5 5"  ></line>

<line x1="20" y1="40" x2="120" y2="40"
      style="stroke: #000000; fill:none;
      stroke-width: 6px;
      stroke-dasharray: 10 5 5 10"  ></line>
</svg>

第一行以10的虚线宽度开始,然后是5像素的间距,然后是5像素的虚线,然后是5像素的另一间距。然后重复该模式。

第二行以虚线宽度10开始,然后是5像素的间距,然后是5像素的虚线,最后是10像素的间距。

image.png

stroke-dashoffset用于设置多远虚线模式启动模式。这样,您可以从中途开始划线,例如从图案中途开始,然后从那里重复图案

<svg width="500" height="120">
<line x1="20" y1="20" x2="170" y2="20"
      style="stroke: #000000; fill:none;
      stroke-width: 6px;
      stroke-dasharray: 10 5;      stroke-dashoffset: 5;
      "  />
</svg>

image.png