首页 > 代码库 > SVG Use(转)
SVG Use(转)
转自:http://www.zhangxinxu.com/wordpress/2014/07/introduce-svg-sprite-technology/
未来必热:SVG Sprite技术介绍
一、Sprite技术
这里所说的Sprite技术,没错,类似于CSS中的Sprite技术。图标图形整合在一起,实际呈现的时候准确显示特定图标。
二、SVG Sprite与symbol元素
目前,SVG Sprite最佳实践是使用symbol
元素。symbol
元素是什么呢?单纯翻译的话,是“符号”的意思。然,这个释义并不符合这里的场景。不知大家有没有用过Flash,symbol
实际上就类似于Flash中的“影片剪辑”、或者“元件”。
因此,我个人觉得,symbol
应该解释为“元件”最为恰当!
那,symbol
和SVG Sprite又有什么关系呢?
我们可以把SVG元素看成一个舞台,而symbol
则是舞台上一个一个组装好的元件,这这些一个一个的元件就是我们即将使用的一个一个SVG图标。
于是,对于一个集合了三个SVG图标的SVG元素的代码结构会是这样:
<svg> <symbol> <!-- 第1个图标路径形状之类代码 --> </symbol> <symbol> <!-- 第2个图标路径形状之类代码 --> </symbol> <symbol> <!-- 第3个图标路径形状之类代码 --> </symbol> </svg>
每一个symbol
就是一个图标元件,但是,只有上面的代码,是无法呈现类似下面的效果的:
为何?
因为,舞台上只是放置了图标,如果你不使用(use),是看不见的。就好比你女朋友买了几箱的衣服放家里,如果不穿出去,谁知道她这么土豪呢?
因此,还差一个“使用”,也就是SVG中的<use>
元素。
三、SVG中的use元素
use元素是SVG中非常强大,非常重要的一个元素,尤其在Web开发中,为何?
两点:
- 可重复调用;
- 跨SVG调用;
1. 可重复调用
你好不容易,用了几十个坐标值,好不容易绘制了一个图形,如果你想再弄一个同样造型,但位置不同的图形出来,你会怎么办?——再复制一遍代码?别说笑了,(如果真那样)SVG文件的尺寸赶得上二师兄的腰围了。
<svg> <defs> <g id="shape"> <rect x="0" y="0" width="50" height="50" /> <circle cx="0" cy="0" r="50" /> </g> </defs> <use xlink:href=http://www.mamicode.com/"#shape" x="50" y="50" /> <use xlink:href=http://www.mamicode.com/"#shape" x="200" y="50" /> </svg>
结果是(IE9+浏览器可见):
首先,注意到没有,use
元素是通过xlink:href
属性,寻找要使用的元素的。#shape
对应的就是id
为shape
的元素。use
元素可以有自己的坐标,以及支持transform
变换,甚至可以use其他use
元素。
这里,两个use
元素使用的是同一个g
元素(组合),从而实现了图形的重复调用功能。
2. 跨SVG调用
SVG中的use
元素可以调用其他SVG文件的元素,只要在一个文档中。
<svg width="500" height="110"><use xlink:href=http://www.mamicode.com/"#shape" x="50" y="50" /></svg>
结果仍是那个图形:
而这个跨SVG调用就是“SVG Sprite技术”的核心所在。
试想下,我们只要在页面某处载入一个充满Sprite(symbol
)的SVG文件(或直接include
SVG代码),于是,在页面的任何角落,只要想使用这个图标,只要简单这一点代码就可以了:
<svg class="size"><use xlink:href=http://www.mamicode.com/"#target" /></svg>
图标尺寸CSS控制,里面只有一个仅有xlink:href
属性的use
元素,Done! 完成!
也即是说,在HTML层面,图标使用的代码成本,跟传统的CSS Sprite或者流行的font-face
几乎无异,代码简洁,而且很好维护。所有的SVG图标都在一个SVG源上。retina良好,尺寸可任意拉伸,且颜色可控,真乃Web图标的未来之星。
SVG Use(转)