SVG(可缩放矢量图形)是一种基于可扩展标记语言(XML)的图形矢量格式。它允许你创建可缩放的图形,这些图形可以在网页上显示,并且可以与用户进行交互。掌握SVG对于前端开发人员来说非常重要,因为它可以用于创建动画、图表和其他复杂的图形界面元素。
目录
- SVG 基础
- SVG 标签
- SVG 绘图与样式
- SVG 动画
- SVG 交互
- 实战案例
- 总结
1. SVG 基础
SVG 文档通常以 XML 格式存储,可以在任何支持 SVG 的浏览器中查看。SVG 文档以 <svg> 标签开始,以 </svg> 标签结束。以下是一个简单的 SVG 示例:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" stroke="black" stroke-width="3" fill="red" />
</svg>
这个例子创建了一个红色的圆形,圆心在 (100, 100),半径为 50。
2. SVG 标签
SVG 定义了一系列用于创建图形的标签。以下是一些常用的 SVG 标签:
<circle>:创建圆形。<rect>:创建矩形。<line>:创建直线。<polyline>:创建多边形。<polygon>:创建闭合多边形。<ellipse>:创建椭圆。<path>:创建自定义路径。
3. SVG 绘图与样式
SVG 允许你通过属性来设置图形的样式。以下是一些常用的 SVG 样式属性:
fill:设置图形的填充颜色。stroke:设置图形的边框颜色。stroke-width:设置边框的宽度。stroke-dasharray:设置边框的虚线样式。transform:应用变换,如缩放、旋转和平移。
以下是一个使用样式的 SVG 示例:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" stroke="black" stroke-width="3" fill="red" />
<circle cx="150" cy="150" r="50" stroke="blue" stroke-width="3" fill="none" />
</svg>
在这个例子中,第一个圆形是填充的,而第二个圆形只有边框。
4. SVG 动画
SVG 支持多种动画效果,包括填充、边框、路径和变换。以下是一个简单的 SVG 动画示例:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" stroke="black" stroke-width="3" fill="red" />
<animate attributeName="r" from="50" to="100" dur="2s" fill="freeze" />
</svg>
在这个例子中,圆形的半径将在 2 秒内从 50 增加到 100。
5. SVG 交互
SVG 支持与用户的交互,例如点击事件和键盘事件。以下是一个简单的 SVG 交互示例:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" stroke="black" stroke-width="3" fill="red" />
<script type="text/ecmascript">
<![CDATA[
// JavaScript 代码来处理交互
function clickHandler(event) {
alert('Circle clicked!');
}
]]>
</script>
</svg>
在这个例子中,当用户点击圆形时,会弹出一个警告框。
6. 实战案例
以下是一个使用 SVG 创建饼图的实战案例:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" stroke="black" stroke-width="3" fill="none" />
<script type="text/ecmascript">
<![CDATA[
// JavaScript 代码来计算饼图切片
var data = [30, 70, 50];
var total = data.reduce(function(a, b) { return a + b; }, 0);
var angle = 0;
data.forEach(function(value) {
var endAngle = angle + (value / total) * 360;
var largeArcFlag = endAngle - angle > 180 ? 1 : 0;
var largeArc = largeArcFlag ? '1' : '0';
var sweepFlag = largeArcFlag ? '0' : '1';
var d = 'M100,100 L100,' + (100 - (value / total) * 100) +
' A' + 50 + ',' + 50 + ' 0 ' + sweepFlag + ',' + largeArcFlag + ' ' + 100 + ',' + 100;
var path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
path.setAttribute('d', d);
path.setAttribute('fill', 'hsl(' + ((angle / 360) * 360) + ', 100%, 50%)');
document.querySelector('svg').appendChild(path);
angle = endAngle;
});
]]>
</script>
</svg>
在这个例子中,我们使用 JavaScript 来计算饼图的每个切片,并创建相应的 SVG <path> 元素。
7. 总结
掌握 W3C SVG 对于前端开发人员来说非常重要。SVG 允许你创建可缩放的矢量图形,这些图形可以与用户进行交互,并支持动画效果。通过本文的指导,你可以开始使用 SVG 创建自己的图形和动画。
