# svg

SVG 是一种文本格式。每个 SVG 图形都是使用与 HTML 类似的标记定义的,而且SVG 代码可以直接包含在 HTML 文档中,或者动态插入到 DOM 中。除IE8及之前版本之外,所有浏览器都支持 SVG。SVG 也是一种 XML 语言,所以那些不包含结束标签的元素,一定要 自关闭

<svg width="50" height="50">
	<circle cx="25" cy="25" r="22" fill="blue" stroke="gray" stroke-width="2"/>
</svg>
<svg width="500" height="50"></svg>

在 svg 标签中可以嵌入很多可见的元素,包括 rect 、 circle 、 ellipse 、 line 、text 和 path 。

基于像素的坐标系统的原点(即 0,0 点)位于画布的左上角。增大 x 的值,图形会向右移动;增大 y 值,图形会向下移动

<rect x="0" y="0" width="500" height="50"/>

rect 用于绘制矩形。 x 和 y 用于指定矩形左上角的坐标

(rx:对于圆角矩形,指定椭圆在x方向的半径) (ry:对于圆角矩形,指定椭圆在y方向的半径)

<svg >
		<circle cx="250" cy="25" r="25"/>
</svg>

circle 用于绘制圆形。 cx 和 cy 用于指定圆心坐标,而 r 用于指定半径 cx (center-x,即圆心 x 坐标)

<svg width="100%">
		<ellipse cx="250" cy="25" rx="100" ry="25"/>
</svg>

ellipse 与 circle 类似,只不过每个轴要分别指定半径。因此,半径属性不再是r ,而是 rx 和 ry

<svg width="100%">
		<line x1="0" y1="0" x2="500" y2="50" stroke="black"/>
</svg>

line 用于绘制直线。 x1 和 y1 用于指定起点坐标, x2 和 y2 用于指定终点坐标。另外,必须用 stroke 指定直线的颜色才能看得见。

# 文本

<svg width="100%">
		<text x="250" y="25">Easy-peasy</text>
</svg>
  • x x坐标
  • y y坐标
  • dx 相对于当前位置x方向上平移的距离
  • dy 相对于当前位置y方向上平移的距离
  • textLength 文字显示长度(不做拉长 足则压缩)
  • rotate 旋转角度 text 用于绘制文本。如果某些还有其他样式可在text里加tspan

# 为svg元素添加样式

  • fill 颜色值 与使用 CSS 一样
  • stroke 颜色值
  • stroke-width 带单位的数值 stroke的宽度
  • opacity
<svg width="100%">
		<rect x="0" y="0" width="30" height="30" fill="purple"/>
		<rect x="20" y="5" width="30" height="30" fill="blue"/>
		<rect x="40" y="10" width="30" height="30" fill="green"/>
		<rect x="60" y="15" width="30" height="30" fill="yellow"/>
		<rect x="80" y="20" width="30" height="30" fill="red"/>
</svg>
<svg width="100%">
		<circle cx="25" cy="25" r="20" fill="rgba(128, 0, 128, 0.75)"
		stroke="rgba(0, 255, 0, 0.25)" stroke-width="10"/>
		<circle cx="75" cy="25" r="20" fill="rgba(0, 255, 0, 0.75)"
		stroke="rgba(0, 0, 255, 0.25)" stroke-width="10"/>
		<circle cx="125" cy="25" r="20" fill="rgba(255, 255, 0, 0.75)"
		stroke="rgba(255, 0, 0, 0.25)" stroke-width="10"/>
</svg>

# 多边形和折线 polygon polyline

<svg width="100%" height="300">
	<polygon points="100,20 20,90 60,160" style="fill:orange;stroke:black;"/>
	<polyline points="100,20 20,90 60,160" style="fill:white;stroke:black;" transform="translate(200,0)"/>
</svg>

# 路径path

属性d实际上是一个字符串,包含了一系列路径描述。这些路径由下面这些指令组成:

  • M=moveto 指定坐标
  • L=lineto 画直线到指定坐标
  • H=horizontal lineto 画水平折线到指定坐标
  • V=vertical lineto 画垂直直线到指定坐标
<svg width="100%" height="300">
	<path d="M30,100 L270,300
			 M30,100 H300
			 M30,100 V300"
		style="stroke:black;stroke-width: 1;" 
			/>
</svg>
  • C=curveto 画三次贝塞尔曲线经 两个 指定控制点到达终点坐标
  • S=shorthand/smooth curveto 与前一条三次贝塞尔曲线相连,第一个控制点为前一条曲线第二个控制点的对称点,只需要输入第二个控制点和终点,即可绘制一个三次贝塞尔曲线

这些属性大小写皆可,大写绝对定位,小写相对定位

<svg width="100%" height="300">
	<path d="M30,100 C100,20 190,20 270,100 
		S400,180 450,100"
		style="fill:white;stroke:black"
		/>
</svg>
  • Q 画二次贝塞尔曲线
  • T 与S类似,只不过是和二次贝塞尔曲线一起使用
<svg width="100%" height="300">
	<path d="M30,100 Q190,20 270,100 
		T450,100"
		style="fill:white;stroke:black"
		/>
</svg>
  • A 弧线 Z闭合 A(rx,ry ,x-axis-rotation,large-arc-flag,sweep-flag,x,y)
  • rx 椭圆x方向半轴大小
  • ry 椭圆y方向半轴大小
  • x-axis-rotation 椭圆x轴与水平轴顺时针方向夹角
  • large-arc-flag 有两个值(1 大角度弧线 0 小角度弧线)
  • sweep-flag(1 顺时针到终点 0逆时针到终点)
  • x 终点x坐标
  • y 终点y坐标
<svg width="100%" height="400">
	<path d="M100,200 a200 150 0 1 0 150 -150 Z"
		style="fill:orange;stroke:black"
		/>
</svg>

小写的a代表相对坐标,起始位置(100,200) 终点位置(100+150,200-150)==>(250,50);它包含弧线的椭圆的x和y方向半径分别为200和150,椭圆x轴和水平方向夹角0度,采用大角度,逆时针方向走向终点,Z表示闭合回路

# 标记

标记,最典型的是给线段添加箭头,标记<marker>写在<defs></defs>中,defs用于定义可重复利用的图形元素

  • viewBox 坐标系的区域

  • refX refY 在vuewbox内的基准点,绘制是此点在直线断点上

  • markerUnits 标记大小的基准有markerWidth markerHeight两个值

  • orient 绘制方向,可为auto或角度值

  • id 标识

  • marker-start 路径起点处

  • marker-mid 路径中间点

  • marker-end 结束点

<svg width="100%" height="400">
	<defs>
		<marker id="arrow" 
			markerUnits="strokeWidth"
			markerWidth="40"
			markerHeight="12"
			viewBox="0 0 12 12"
			refX="6"
			refY="6"
			orient="auto"
		>
		<path d="M2,2 L10,6 L2,10 L6,6 L2,2" style="fill:#000000"/>
		</marker>
	</defs>
	
	<line x1="0" y1="0" x2="200" y2="50" 
		stroke="red" 
		stroke-width="2" 
		marker-end="url(#arrow)"
	>
	</line>
	<path d="M20,70 T80,100 T160,80 T200,90" 
		fill="white" stroke="green" stroke-width="2"
		marker-start="url(#arrow)"
		marker-mid="url(#arrow)"
		marker-end="url(#arrow)"
	/>
</svg>

# svg转换

VG转换支持移动,缩放,旋转和倾斜

  • 移动
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
	  <style>
		  .ass{
			  transform: translate(60px,30px);
		  }
		  
		  #s1{
			  width:300px;
			  height:300px;
			  background:palegreen
		  }
	  </style>
   </head>
	
   <body>
      <svg width = "300" height = "300">
         <rect x = "20" 
            y = "20"
            width = "60"
            height = "60"
            fill = "green"
			class="ass"
			transform="translate(90 30)"
            >
         </rect>
      </svg>
	  <div id="s1" >
	  	2233
	  </div>
   </body>
</html>

transform="translate(90 30)和 transform: translate(60px,30px);

svg和htmltransform的差别

SVG元素和HTML元素工作方式的差异,主要是由元素 坐标系 的不同造成的。无论是HTML元素还是SVG元素,都有一个自己的坐标系。对于HTML元素,初始的坐标原点在元素的中心。对于SVG元素,其坐标系原点是在SVG画板的(0,0)处(假设在SVG标签内祖先元素和自身都不存在任何变换)。如果SVG元素的中心点不在画板的(0,0)点,像rotate,scale或者skew这些变换的结果,都会与HTML元素上应用的结果大不一样。

svg 中的<g>元素用来组织svg元素。如果一组svg元素被g元素包裹了,你可以通过对g元素进行变换(transform),被g元素包裹的元素也将被变换,就好这些被svg包裹的元素是一个元素一样,和<svg>相比这是一个很好的优势,嵌套的svg中元素是不会被变换影响的。

<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <svg width = "300" height = "300">
         <g transform = "translate(60,60) rotate(30)">
            <rect x = "20" 
               y = "20" 
               width = "60" 
               height = "30" 
               fill = "green">
            </rect>
            <circle cx = "0" 
               cy = "0" 
               r = "30" 
               fill = "red"/>
         </g>
      </svg>
   </body>
</html>

除了手动操作svg,也可以借助js操作,或者第三方js库如d3js等.

最后更新: 2/19/2021, 9:16:32 AM