标签:cto XML 学习 简单 领域 hit 广播 命名 asics
可缩放矢量图形 (SVG) 是基于矢量的图形家族的一部分。它们与基于光栅的图形不同,后者在一个数据数组中存储每个像素的颜色定义。如今,网络上使用的最常见的光栅图形格式包括 JPEG、GIF 和 PNG,每种格式都具有优缺点。
相比任何基于光栅的格式,SVG 具有多项优势:
原始像素数据是针对特定大小进行设计的。当图像不再是该大小时,显示图像的程序会猜测使用何种数据来填充新的像素。矢量图像具有更高的弹性;当图像大小变化时,数据公式可相应地调整。
本文将介绍 SVG 格式的优势,以及它们如何在 HTML5 中的 Web 设计工作中提供帮助。
要创建 SVG 图形,会经历与创建 JPEG、GIF 或 PNG 文件完全不同的流程。JPEG、GIF 和 PNG 文件通常使用图像编辑程序创建,比如 Adobe Photoshop。SVG 图像通常使用基于 XML 的语言创建。有一些 SVG 编辑 GUI 将生成基础的 XML。但是,对于本文,使用的是原始的 XML 语言。
清单 1 给出了一个简单 SVG XML 文件的示例,该文件绘制一个具有 2 像素宽的黑色边框的红色圆形。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <circle cx="100" cy="50" r="40" stroke="black" 3 stroke-width="2" fill="red" /> 4 </svg>
上述代码会得到图 1 中的图形。
对于 SVG 图形,需要使用 XML 标记来创建形状,表 1 给出了这些 XML 元素。
元素 | 描述 |
---|---|
line |
创建一条简单的线。 |
polyline |
定义由多个线定义构成的形状。 |
rect |
创建一个矩形。 |
circle |
创建一个圆形。 |
ellipse |
创建一个椭圆。 |
polygon |
创建一个多边形。 |
path |
支持任意路径的定义。 |
line
元素line
元素是基本的绘图元素。清单 2 展示了如何创建一条水平线。
1 <svg xmlns="http://www.w3.org/2000/svg" version=‘1.1‘ 2 width="100%" height="100%" > 3 <line x1=‘25‘ y1="150" x2=‘300‘ y2=‘150‘ 4 style=‘stroke:red;stroke-width:10‘/> 5 </svg>
清单 2 中的代码会生成图 2 中的图形。
SVG 标记具有宽度和高度属性,用于定义可用于绘制的画布区域。它们的原理类似于其他 HTML 元素的宽度和高度属性。在本例中,画布设置为占据所有可用空间。
该示例还使用了 style
标记。SVG 图形支持使用多种方法设置其内容的样式。本文中的样式可用于使他们变得显眼,也可在必须使用某些属性(比如笔画颜色和宽度)才能渲染图像时使用。
要创建一个线定义,可以定义相对于画布的开始和结束 x 和 y 坐标。x1
和 y1
属性是开始坐标,x2
和 y2
属性是结束坐标。要更改线的方向,只需更改这些坐标。例如,通过修改上一个示例,可以生成一条对角线,如清单 3 所示。
1 <svg xmlns="http://www.w3.org/2000/svg" version=‘1.1‘ 2 width="100%" height="100%" > 3 <line x1="0" y1="0" x2="200" y2="200" 4 style=‘stroke:red;stroke-width:10‘/> 5 </svg>
图 3 给出了清单 3 中的代码的结果。
polyline
元素多直线图形是一个由多个线定义组成的图形。清单 4 中的示例创建了一个类似一组楼梯的图形。
1 <svg xmlns="http://www.w3.org/2000/svg" 2 width="100%" height="100%" version=‘1.1‘> 3 <polyline points="0,40 40,40 40,80 80,80 80,120 120,120 120,160" 4 style="fill:white;stroke:red;stroke-width:4"/> 5 </svg>
清单 4 中的代码会生成图 4 中的图形。
要创建一个多直线图形,可以使用 points
属性并定义由逗号分隔的 x 和 y 坐标对。在本例中,第一个点定义为 0,40
,其中 0
是 x 值,40
是 y 值。但是,单独一组点无法在屏幕上显示任何东西,因为这仅告诉 SVG 渲染器从何处开始。在最低限度上,您需要两组点:一个开始点和一个结束点(例如 points="0,40 40,40”
)。
与简单的线图形一样,这些线不需要完全水平或垂直。如果更改上一个示例中的值,如清单 5 所示,可以生成不规则的线形状。
1 <svg xmlns="http://www.w3.org/2000/svg" 2 width="100%" height="100%" version=‘1.1‘> 3 <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" 4 style="fill:white;stroke:red;stroke-width:3"/> 5 </svg>
清单 5 中的代码会生成图 5 所示的图形。
rect
元素创建一个矩形非常简单,只需定义宽度和高度,如清单 6 所示。
1 <svg xmlns="http://www.w3.org/2000/svg" 2 width="100%" height="100%" version=‘1.1‘> 3 <rect width="300" height="100" 4 style="fill:red"/> 5 </svg>
清单 6 中的代码会生成图 6 中的图形。
也可以使用 rect
标记创建一个正方形,正方形就是高和宽相等的矩形。
circle
元素要创建一个圆,可以定义圆心的 x 和 y 坐标和一个半径,如清单 7 所示。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <circle cx="100" cy="50" r="40" fill="red"/> 3 </svg>
清单 7 中的代码会生成图 7 中的图形。
cx
和 cy
属性定义圆心相对于绘图画布的位置。因为半径是圆宽度的一半,所以在定义半径时,请记住图像的总宽度将是该值的两倍。
ellipse
元素椭圆基本上是一个圆,其中的代码定义了两个半径,如清单 8 所示。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <ellipse cx="300" cy="80" rx="100" ry="50" style="fill:red;"/> 3 </svg>
清单 8 中的代码会生成图 8 中的图形。
再次说明,cx
和 cy
属性定义了相对于画布的中心坐标。但是对于椭圆,需要使用 rx
和 ry
属性为 x 轴定义一个半径,为 y 轴定义一个半径。
polygon
元素多边形这个形状包含至少 3 条边。清单 9 创建了一个简单的三角形。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <polygon points="200,10 250,190 160,210" 3 style="fill:red;stroke:black;stroke-width:1"/> 4 </svg>
清单 9 中的代码会生成图 9 中的图形。
类似于 polyline
元素,可使用 points
属性定义几对 x 和 y 坐标来创建多边形。
可以通过添加 x 和 y 对,创建具有任意多条边的多边形。通过修改上一个示例,可以创建一个四边形,如清单 10 所示。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <polygon points="220,10 300,210 170,250 123,234" 3 style="fill:red;stroke:black;stroke-width:1"/> 4 </svg>
清单 10 中的代码会生成图 10 中的图形。
甚至可以使用 polygon
标记创建复杂的形状。清单 11 创建一个星形。
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <polygon points="100,10 40,180 190,60 10,60 160,180 100,10" style="fill:red;stroke:black;stroke-width:1"/> </svg>
清单 11 中的代码会生成图 11 中的图形。
path
元素使用 path
元素(所有绘图元素中最复杂的),可以使用一组专门的命令创建任意图形。path
元素支持表 2 中的命令。
path
元素支持的命令能以大写或小写形式使用这些命令。当命令为大写时,应用绝对位置。当它为小写时,应用相对位置。提供所有命令示例已超出了本文的范围。但是,以下示例会演示它们的基本使用。
可以使用 path
元素从本文前面的示例创建任何简单的形状。清单 12 使用 path
元素创建了一个基本的三角形。
path
元素创建一个三角形1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <path d="M150 0 L75 200 L225 200 Z" style="fill:red"/> 3 </svg>
清单 12 中的代码会生成图 12 中的图形。
path
元素的三角形
这组命令使用 d
属性定义。在本例中,从 x 坐标 150 和 y 坐标 0 处开始绘制,这在移动到命令 (M150 0
) 中定义。然后再使用 “连线到” 命令绘制一条直线连接到 x 坐标 75 和 y 坐标 200 的位置 (L75 200
)。接下来,使用另一个 “连线到” 命令绘制另一条线 (L225 200
)。最后,使用 “封闭到” 命令封闭图形 (Z
)。Z
命令没有提供任何坐标,因为要关闭您所在的路径,根据定义,要绘制一条从当前位置到图形起点(在本例中为 x = 150 y =0)的线。
这里的意图是展示一个基本示例;如果您想要的只是一个简单的三角形,最好使用 polygon
标记。
path
元素的真正强大之处是创建自定义形状的能力,如清单 13 所示。
path
元素创建一个自定义形状1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <path d="M300,200 h-150 a150,150 0 1,0 150,-150 z" 3 fill="red" stroke="blue" stroke-width="5"/> 4 <path d="M275,175 v-150 a150,150 0 0,0 -150,150 z" 5 fill="yellow" stroke="blue" stroke-width="5"/> 6 <path d="M600,350 l 50,-25 7 a25,25 -30 0,1 50,-25 l 50,-25 8 a25,50 -30 0,1 50,-25 l 50,-25 9 a25,75 -30 0,1 50,-25 l 50,-25 10 a25,100 -30 0,1 50,-25 l 50,-25" 11 fill="none" stroke="red" stroke-width="5"/> 12 </svg>
清单 13 中的代码会生成图 13 中的图形。
path
元素的自定义形状
使用 path
元素,可以创建复杂的图形,比如图表和波浪线。请注意,这个示例使用了多个 path
元素。当创建图形时,根 SVG 标记中可以包含多个绘图元素。
除了目前为止许多示例中的基本 CSS 样式,SVG 图形还支持使用过滤器和渐变。本节将介绍如何向 SVG 图形应用过滤器和渐变。
可以使用过滤器向 SVG 图形应用特殊的效果。SVG 支持以下过滤器。
清单 14 创建了一种应用到矩形上的投影效果。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <defs> 3 <filter id="f1" x="0" y="0" 4 width="200%" height="200%"> 5 <feOffset result="offOut" in="SourceAlpha" 6 dx="20" dy="20"/> 7 <feGaussianBlur result="blurOut" 8 in="offOut" stdDeviation="10"/> 9 <feBlend in="SourceGraphic" 10 in2="blurOut" mode="normal"/> 11 </filter> 12 </defs> 13 <rect width="90" height="90" stroke="green" 14 stroke-width="3" fill="yellow" filter="url(#f1)"/> 15 </svg>
清单 14 中的代码会生成图 14 中的图形。
过滤器在 def
(表示定义)元素中定义。本示例中的过滤器分配了一个 id
"f1"
。filter
标记本身拥有定义过滤器的 x 和 y 坐标及宽度和高度的属性。在 filter
标记中,可以使用想要的过滤器元素并将其属性设置为想要的值。
定义过滤器之后,使用 filter
属性将它与一个特定图形关联,如 rect
元素 中所示。将 url
值设置为您分配给过滤器的 id
属性的值。
渐变 是从一种颜色到另一种颜色逐渐的过渡。渐变具有两种基本形式:线性和径向渐变。所应用的渐变类型由您使用的元素确定。以下示例展示了应用于一个椭圆形的线性和径向渐变。
清单 15 创建了一个具有线性渐变的椭圆。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <defs> 3 <linearGradient id="grad1" x1="0%" y1="0%" 4 x2="100%" y2="0%"> 5 <stop offset="0%" 6 style="stop-color:rgb(255,255,0);stop-opacity:1"/> 7 <stop offset="100%" 8 style="stop-color:rgb(255,0,0);stop-opacity:1"/> 9 </linearGradient> 10 </defs> 11 <ellipse cx="200" cy="70" rx="85" ry="55" 12 fill="url(#grad1)"/> 13 </svg>
清单 15 中的代码会生成图 15 中的图形。
清单 16 创建了一个具有径向渐变的椭圆。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <defs> 3 <radialGradient id="grad1" cx="50%" cy="50%" 4 r="50%" fx="50%" fy="50%"> 5 <stop offset="0%" 6 style="stop-color:rgb(255,255,255);stop-opacity:0"/> 7 <stop offset="100%" 8 style="stop-color:rgb(255,0,0);stop-opacity:1"/> 9 </radialGradient> 10 </defs> 11 <ellipse cx="200" cy="70" rx="85" ry="55" 12 fill="url(#grad1)"/> 13 </svg>
清单 16 中的代码会生成图 16 中的图形。
像过滤器一样,渐变在 def
元素内定义。每个渐变分配有一个 id
。渐变属性(比如颜色)可使用 stop
元素在渐变标记内设置。要将渐变应用于图形,可以将 fill
属性的 url
值设置为想要的渐变的 id
。
除了基本形状,还可以使用 SVG 生成文本,如清单 17 所示。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 2 <text x="0" y="15" fill="red">I love SVG</text> 3 </svg>
清单 17 中的代码会生成图 17 中的图形。
此示例使用了一个 text
元素来创建句子 I love SVG
。当使用 text
元素时,要显示的实际文本在开始和结束 text
元素之间。
您可以沿多个轴,以及甚至沿多条路径显示文本。清单 18 沿一条弧形路径显示文本。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" 2 xmlns:xlink="http://www.w3.org/1999/xlink"> 3 <defs> 4 <path id="path1" d="M75,20 a1,1 0 0,0 100,0"/> 5 </defs> 6 <text x="10" y="100" style="fill:red;"> 7 <textPath xlink:href="#path1">I love SVG I love SVG</textPath> 8 </text> 9 </svg>
清单 18 中的代码会生成图 18 中的图形。
在此示例中,向根 SVG 标记添加了一个额外的 XML 命名空间 xlink
。用户显示文本的弧形路径在 def
元素内创建,所以该路径不会在图形中实际渲染出来。要显示的文本嵌套在一个 textPath
元素内,该元素使用 xlink
命名空间引用想要的路径的 id
。
与其他 SVG 图形一样,也可以向文本应用过滤器和渐变。清单 19 向一些文本应用了一个过滤器和一种渐变。
1 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" 2 xmlns:xlink="http://www.w3.org/1999/xlink"> 3 <defs> 4 <radialGradient id="grad1" cx="50%" cy="50%" 5 r="50%" fx="50%" fy="50%"> 6 <stop offset="0%" 7 style="stop-color:red; stop-opacity:0"/> 8 <stop offset="100%" 9 style="stop-color:rgb(0,0,0);stop-opacity:1"/> 10 </radialGradient> 11 <filter id="f1" x="0" y="0" 12 width="200%" height="200%"> 13 <feOffset result="offOut" 14 in="SourceAlpha" dx="20" dy="20"/> 15 <feGaussianBlur result="blurOut" 16 in="offOut" stdDeviation="10"/> 17 <feBlend in="SourceGraphic" 18 in2="blurOut" mode="normal"/> 19 </filter> 20 </defs> 21 <text x="10" y="100" style="fill:url(#grad1); font-size: 30px;" 22 filter="url(#f1)"> 23 I love SVG I love SVG 24 </text> 25 </svg>
清单 19 中的代码会生成图 19 中的图形。
创建 SVG XML 之后,可采用多种方式将它包含在 HTML 页面中。第一种方法是直接将 SVG XML 嵌入到 HTML 文档中,如清单 20 所示。
1 <html> 2 <head> 3 <title>Embedded SVG</title> 4 </head> 5 <body style="height: 600px;width: 100%; padding: 30px;"> 6 <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 7 <circle cx="100" cy="50" r="40" fill="red"/> 8 </svg> 9 </body> 10 </html>
此方法可能最简单,但它不支持重用。请记住,可以使用 .svg 扩展名保存 SVG XML 文件。当将 SVG 图形保存在 .svg 文件中时,您可以使用 embed
、object
和 iframe
元素来将它包含在网页中。清单 21 显示了使用 embed
元素包含 SVG XML 文件的代码。
embed
元素包含一个 SVG XML 文件<embed src="circle.svg" type="image/svg+xml" />
清单 22 显示了如何使用 object
元素包含一个 SVG XML 文件。
object
元素包含一个 SVG XML 文件<object data="circle.svg" type="image/svg+xml"></object>
清单 23 给出了使用 iframe
元素包含一个 SVG XML 文件的代码。
iframe
元素包含一个 SVG XML 文件<iframe src="circle1.svg"></iframe>
当使用其中一种方法时,可以将同一个 SVG 图形包含在多个页面中,并编辑 .svg 源文件来进行更新。
本文介绍了使用 SVG 格式创建图形的基础知识。学习了如何使用内置的集合元素(比如线、矩形、圆等)创建基本形状;如何通过发出一系列命令(比如移动到、连线到和使用弧线连接到),使用 path
元素创建复杂的图形。本文还探讨了如何对 SVG 图形应用过滤器和渐变,包括文本图形,以及如何在 HTML 页面中包含 SVG 图形。
标签:cto XML 学习 简单 领域 hit 广播 命名 asics
原文地址:http://www.cnblogs.com/miaoxiaojiao/p/7077682.html