# 常用
在线编辑器 (opens new window)
在线调试 (opens new window)
外部调用时需要添加
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
使用 < embed > 标签
<embed src="circle1.svg" type="image/svg+xml" />
使用 < object > 标签
<object data="circle1.svg" type="image/svg+xml"></object>
使用 < iframe > 标签
<iframe src="circle1.svg"></iframe>
在HTML嵌入SVG代码
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" />
</svg>
链接到 SVG 文件
<a href="circle1.svg">查看 SVG 文件</a>
# 矩形
创建一个圆角矩形
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<rect x="50" y="20" rx="20" ry="20" width="150" height="150"
fill="red" stroke="black" stroke-width="5" opacity="0.5"/>
</svg>
# 圆形
创建一个圆
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" cy="50" r="40" stroke="black"
stroke-width="2" fill="red"/>
</svg>
# 椭圆
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<ellipse cx="300" cy="80" rx="100" ry="50" fill="yellow"
stroke="purple" stroke-width="2" />
</svg>
# 直线
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<line x1="0" y1="0" x2="200" y2="200"
stroke="purple" stroke-width="2" />
</svg>
# 多段线
<svg height="210" width="500">
<polyline points="100,10 40,198 190,78 10,78 160,198"
stroke="purple" stroke-width="5" fill="rgba(2,44,83,0.8)"/>
</svg>
# 多边形
fill-rule:图形填充规则(nonzero|evenodd)。
<svg height="210" width="500">
<polygon points="100,10 40,198 190,78 10,78 160,198"
fill="lime" stroke="purple" stroke-width="5" fill-rule="nonzero" />
</svg>
# 路径
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<path d="M150 0 L75 200 L225 200 Z" fill="yellow"
stroke="purple" stroke-width="2" />
</svg>
M表示“Move to”(移动到)命令,A表示“Arc”(弧形)命令,L表示“Line”(直线)命令,Z表示闭合路径。
注意
以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
# 文本
旋转的文字
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<text x="0" y="15" fill="red" transform="rotate(30 20,40)">I love SVG</text>
</svg>
路径上的文字
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="path1" d="M75,20 a1,1 0 0,0 100,0" />
</defs>
<text x="10" y="100" fill="red">
<textPath xlink:href="#path1">I love SVG I love SVG</textPath>
</text>
</svg>
作为链接文本
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink">
<a xlink:href="http://www.w3schools.com/svg/" target="_blank">
<text x="0" y="15" fill="red">I love SVG</text>
</a>
</svg>
# 滤镜
SVG滤镜定义在< defs >元素中。
< filter >标签用来定义SVG滤镜。< filter >标签使用必需的id属性来定义向图形应用哪个滤镜。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<filter id="f1" x="0" y="0">
//创建模糊滤镜
<feGaussianBlur in="SourceGraphic" stdDeviation="15" />
</filter>
</defs>
<rect width="90" height="90" stroke="green" stroke-width="3"
fill="yellow" filter="url(#f1)" />
</svg>
# 阴影
一个黑色的阴影
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<filter id="f1" x="0" y="0" width="200%" height="200%">
<feOffset result="offOut" in="SourceAlpha" dx="20" dy="20" />
<feGaussianBlur result="blurOut" in="offOut" stdDeviation="10" />
<feBlend in="SourceGraphic" in2="blurOut" mode="normal" />
</filter>
</defs>
<rect width="90" height="90" stroke="green" stroke-width="3"
fill="yellow" filter="url(#f1)" />
</svg>
# 渐变
线性渐变
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="rgb(255,255,0)" stop-opacity="1" />
<stop offset="100%" stop-color="rgb(255,255,0)" stop-opacity="1" />
</linearGradient>
</defs>
<ellipse cx="200" cy="70" rx="85" ry="55" fill="url(#grad1)" />
</svg>
放射性渐变
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
<stop offset="0%" stop-color="rgb(255,255,0)" stop-opacity="0" />
<stop offset="100%" stop-color="rgb(255,255,0)" stop-opacity="1" />
</radialGradient>
</defs>
<ellipse cx="200" cy="70" rx="85" ry="55" fill="url(#grad1)" />
</svg>
# 动画
# set
在经过特定时间后,将属性设置为特定值。因此,不会连续进行动画处理,而只是更改属性值一次。
attributeType:XML表示SVG元素的属性。CSS表示设置形状的CSS属性的动画。
如果不提供attributeType属性,则浏览器将尝试猜测要制作动画的属性是XML属性还是CSS属性。
<svg width="500" height="100">
<circle cx="30" cy="30" r="25" style="stroke: none; fill: #0000ff;">
<set attributeName="r" attributeType="XML" to="100" begin="0s" />
</circle>
</svg>
# animate
用于为SVG形状的属性设置动画。您可以将animate元素嵌套在要应用的形状内。
fill:remove 动画完成后,动画属性将设置回其原始值。freeze 动画完成后,动画属性保持当前值。
repeatCount:表示动画执行次数,可以是合法数值或者“indefinite”(无限循环)。
repeatDur:定义重复动画的总时间。可以是普通时间值或者“indefinite”(无限循环)。
<svg width="500" height="100">
<circle cx="55" cy="15" r="5" fill="#07faf6" class="logo-svg-circle">
<animate attributeName="fill" begin="0.2s" dur="1.2s"
repeatCount="indefinite" keyTimes="0;0.5;1"
values="rgba(7,250,246,1);rgba(7,250,246,0);rgba(7,250,246,1)"
fill="freeze"></animate>
<animate attributeName="r" begin="0.2s" dur="1.2s"
repeatCount="indefinite" keyTimes="0;0.5;1"
values="5;2;5" fill="freeze"></animate>
</circle>
</svg>
# animateTransform
为形状的Transform属性设置动画。
type属性设置为rotate(旋转变换功能),表示动画变换将是旋转。
在from和to属性设定的参数进行动画,并传递给rotate函数。
//绕点100,100从0度旋转到360度
<svg width="500" height="100">
<rect x="20" y="20" width="100" height="40" stroke="#ff00ff" fill="none" >
<animateTransform attributeName="transform"
type="rotate"
from="0 100 100" to="360 100 100"
begin="0s" dur="10s"
repeatCount="indefinite"/>
</rect>
</svg>
//使正方形的比例动画化的示例
<svg width="500" height="200">
<rect x="20" y="20" width="40" height="40" stroke="#ff00ff" fill="none" >
<animateTransform attributeName="transform"
type="scale"
from="1 1" to="2 3"
begin="0s" dur="10s"
repeatCount="indefinite"/>
</rect>
</svg>
# animateMotion
可以沿路径动画的形状的运动。
为了旋转正方形以使其与路径的斜率对齐,请将 animateMotion 元素的 rotate属性设置为auto。
<svg width="500" height="150">
<path d="M10,50 q60,50 100,0 q60,-50 100,0" stroke="#000000" fill="none"></path>
<rect x="0" y="0" width="30" height="15" stroke="#ff0000" fill="none">
<animateMotion
path="M10,50 q60,50 100,0 q60,-50 100,0"
begin="0s" dur="10s" repeatCount="indefinite" rotate="auto"
></animateMotion>
</rect>
</svg>
# 蒙版
<svg width="500" height="120">
<defs>
<mask id="mask1" x="0" y="0" width="100" height="100" >
<rect x="0" y="0" width="100" height="50"
stroke="none" fill="#ffffff"/>
</mask>
</defs>
<rect x="1" y="1" width="100" height="100"
stroke="none" fill="#0000ff" mask="url(#mask1)"/>
</svg>
# 标记
<svg width="500" height="100">
<defs>
<marker id="markerCircle" markerwidth="8" markerheight="8" refx="5" refy="5">
<circle cx="5" cy="5" r="3" stroke="none" fill="#000000"></circle>
</marker>
<marker id="markerArrow" markerwidth="13" markerheight="13" refx="2" refy="6" orient="auto">
<path d="M2,2 L2,11 L10,6 L2,2" fill="#000000"></path>
</marker>
</defs>
<path d="M100,10 L150,10 L150,60" style="stroke: #6666ff; stroke-width: 1px; fill: none;
marker-start: url(#markerCircle);
marker-end: url(#markerArrow);
"></path>
</svg>
# 图像
用于将位图图像嵌入SVG图像内。
<svg width="500" height="160" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="10" y="10" height="130" width="500" fill="#000000"></rect>
<image x="20" y="20" width="300" height="80" xlink:href="/static/images/logo.png"></image>
</svg>
<svg>
<image x="20" y="20" xlink:href="/static/images/logo.png"></image>
<line x1="25" y1="80" x2="350" y2="80"></line>
</svg>
# 填充图案
<svg width="500" height="150">
<defs>
<pattern id="pattern1" x="10" y="10" width="20" height="20" patternunits="userSpaceOnUse">
<circle cx="10" cy="10" r="10" stroke="none" fill="#0000ff"></circle>
</pattern>
</defs>
<rect x="10" y="10" width="100" height="100" stroke="#000000" fill="url(#pattern1)"></rect>
</svg>
# 其他属性
strokedasharray:属性用于创建虚线。值是一组数组,没数量上限,每个数字交替表示划线与间隔的宽度。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<g fill="none" stroke="black" stroke-width="4">
<path stroke-dasharray="5,5" d="M5 20 l215 0" />
<path stroke-dasharray="10,10" d="M5 40 l215 0" />
<path stroke-dasharray="20,10,5,5,5,10" d="M5 60 l215 0" />
</g>
</svg>
stroke-dashoffset:则是划线与间隔的偏移量。
stroke-opacity:用于定义SVG形状轮廓的不透明度。
# 通过JS创建
//创建SVG
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("width", "800");
svg.setAttribute("height", "500");
svg.addEventListener("load", function() {
alert("loaded");
});
document.body.appendChild(svg);
//创建形状
var r = document.createElementNS("http://www.w3.org/2000/svg", "rect");
r.setAttribute("fill", "#120045");
r.setAttribute("x", "1");
r.setAttribute("y", "1");
r.setAttribute("width", "50%");
r.setAttribute("height", "50%");
r.addEventListener("click", function() {
alert("clicked");
});
svg.appendChild(r);
//更改SVG矩形的尺寸
document.getElementById("rect1").setAttribute("width", "100");
# 水平翻转/垂直翻转/事件穿透
可以通过调整CSS样式的方式。
transform: rotateY(180deg);//水平镜像翻转。
transform: rotateX(180deg);//垂直镜像翻转。
pointer-events: none;//事件穿透