摘自:http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201506132029.html

SVG的<defs>元素用于预定义一个元素使其能够在SVG图像中重复使用。例如你可以将一些图形制作为一个组,并用<defs>元素来定义它,然后你就可以在SVG图像中将它当做简单图形来重复使用。看下面的例子

<svg xmlns="http://www.w3.org/2000/svg"><defs><g><rect x="100" y="100" width="100" height="100" /><circle cx="100" cy="100" r="100" /></g></defs>
</svg>

<defs>元素中定义的图形不会直接显示在SVG图像上。要显示它们需要使用<use>元素来引入它们。如下面的代码所示:

<svg xmlns="http://www.w3.org/2000/svg">  <defs><g id="shape"><rect x="50" y="50" width="50" height="50" /><circle cx="50" cy="50" r="50" /></g></defs>

要引用<g>元素,必须在<g>元素上设置一个ID,通过ID来引用它。<use>元素通过xlink:href属性来引入<g>元素。注意在ID前面要添加一个#

<use>元素中,通过xy属性来指定重用图形的显示位置。注意在<g>元素中的图形的定位点都是0,0,在使用<use>元素来引用它的时候,它的定位点被转换为<use>元素xy属性指定的位置。

下面是上面代码的返回结果:

上面SVG图像中绿色的圆点并不是示例代码的一部分。它们是用来显示2个<use>元素的xy坐标的。

哪些元素可以被定义为defs中的元素呢?

你可以将下面的元素放入到<defs>元素中使用:

  • 任何图形元素,如:rectline
  • g
  • symbol
SVG symbol元素

SVG <symbol>元素用于定义可重复使用的符号。嵌入在<symbol>元素中的图形是不会被直接显示的,除非你使用<use>元素来引用它。

下面是一个使用<symbol>元素的简单例子:

<svg xmlns="http://www.w3.org/2000/svg" width="500" height="100"><symbol id="shape2"><circle cx="25" cy="25" r="25" style="fill:#bf55ec;"/></symbol><use xlink:href="#shape2" x="50" y="25" />
</svg>    

<symbol>元素需要一个ID号,以便以被<use>元素引用。

一个<symbol>元素可以有preserveAspectRatioviewBox属性。而<g>元素不能拥有这些属性。因此相比于在<defs>元素中使用<g>的方式来复用图形,使用<symbol>元素也许是一个更好的选择。

SVG use元素

SVG <use>元素可以在SVG图像中多次重用一个预定义的SVG图形,包括<g>元素和<symbol>元素。被重用的图形可以在定义<defs>的内部(图形将不可见直到使用use来引用它)或外部。

下面是一个使用<use>元素的例子:

<svg><defs><g id="shape"><rect x="50" y="50" width="50" height="50" /><circle cx="50" cy="50" r="50" /></g></defs><use xlink:href="#shape" x="50" y="50" /><use xlink:href="#shape" x="200" y="50" /></svg>     

上面的例子显示的是在<defs>元素中定义的<g>元素。

要引用<g>元素,必须给它一个ID号,通过ID号来引用它。

下面是上面代码的返回结果:

我们也可以引用不在<defs>元素中的图形。<use>元素可以引用SCG图像中的任何元素,只要这个元素有一个唯一的ID号,例如:

<svg width="500" height="110"><g id="shape2"><rect x="0" y="0" width="50" height="50" /></g><use xlink:href="#shape2" x="200" y="50" /></svg>         

这个例子在<g>元素中定义了一个<rect>元素。然后通过<use>元素来引用这个<g>元素。它返回的结果如下面所示:

注意这里原始图形和复用的图形都会被显示。因为原始的图形并没有定义在<defs><symbol>元素中。所以它是可见的。

你可以为引用的图形设置CSS样式。你可以在<use>元素中使用style属性来为复用的图形设置它的样式。例如:

<svg width="500" height="110"><g id="shape3"><rect x="0" y="0" width="50" height="50" /></g><use xlink:href="#shape3" x="100" y="50" style="fill: #00ff00;"/><use xlink:href="#shape3" x="200" y="50" style="stroke: #00ff00; fill: none;"/></svg>                

注意上面的代码中,原始的图形并没有设置样式,它将是默认的样式(黑色)。

返回SVG教程目录

相关阅读:

  • SVG基础 | 绘制SVG连接标记MARKERS
  • SVG基础 | SVG IMAGE 元素
  • MDN SVG defs
  • MDN SVG symbol
  • MDN SVG use

SVG defs元素相关推荐

  1. SVG常用元素标签列表

    第一次系统化学习svg,整理了一些常用的SVG元素标签(没有整理滤镜相关)仅供参考学习. defs:用于定义所有可能再次引用的图形元素.在defs元素中定义的图形元素不会直接呈现.你可以在你的视口的任 ...

  2. svg defs 进行定义 引用

    svg defs 进行定义 引用: <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  3. svg 内部元素scale 缩放不在原位置解决办法

    svg 内部元素放大或者缩小默认是通过svg画布 x0 , y0 进行缩放的,即元素的x,y 会变大或者变小,导致元素不在缩放之前的位置 解决办法就是,在缩放之前先设置元素的坐标为x0,y0 然后进行 ...

  4. svg常用元素和属性

    1. 介绍 SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics).其可以直接被插入到网页 DOM 中,甚至作为CSS背景属性等,且无论放大 ...

  5. java svg image xlink_SVG基础 | SVG image 元素

    SVG 元素用于在SVG图像中嵌入位图.通过使用元素你可以将一张位图绘制在SVG图像上面. 下面是一个简单的例子: xlink:href="http://img.htmleaf.com/15 ...

  6. svg中元素的层级关系

    svg,许多css属性并不适用与svg,其中就包含z-index: svg中的元素只会按照生成顺序层叠,后来者居上.可以使用回调强加顺序,来实现对于顺序的控制. 第二段代码在第一段之后执行,直接按照顺 ...

  7. svg标签元素的XPATH定位

    项目中会遇到svg标签的元素,这时如果想要用XPATH定位元素,用一般元素的XPATH写法是定位不到的. 尝试了诸如://svg[@id='iconadd-people'].//use[@xlink: ...

  8. 编写 SVG 的指南

    简介 Scalable Vector Graphics (SVG)是在XML中描述二维图形的语言.这些图形由路径,图片和(或)文本组成,并能够在不失真的情况下任意变换尺寸. 本书主要介绍了内联SVG, ...

  9. 【27前端】base标签带有href属性会让chrome里的svg元素url失效

    一个chrome的问题,但具体原因不明. 触发条件:chrome浏览器base标签里href属性有值的时候 触发问题:svg里面的元素如果有用url的滤镜和模糊,则会失效,在firefox里和IE10 ...

  10. 前端切图之svg图标的复用基于defs和use 亲测有用

    切图网长期致力于web前端开发外包服务,而我们也关注到现在图标很多时候采用svg更多一点,然后图标字体文件已经提供了很多种类的图标,不过采用svg图标可以自行选择更符合.更好看的图标,相比于字体图标更 ...

最新文章

  1. python缩进在程序中长度统一且强制使用_Python习题纠错1
  2. java单元测试覆盖率统计eclemma
  3. python读取nc文件并转换成csv_python3使用类型转换读取csv文件
  4. FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
  5. 如何替换SAP Spartacus启动Component -app-root
  6. rpm oracle 离线,在CentOS中离线安装Oracle之安装准备
  7. 【今天下午活动】从 HelloWorld 到 AntDesign,Blazor 将 .NET 带到现代前端圈
  8. 最详细win7下手动搭建PHP环境:apache2.4.23+php7.0.11
  9. CStdioFile UNICODE编译 读取中文汉字乱码 .
  10. C语言实现字符串转数字(包括负数)
  11. TS助手 v3.52 视频网站下载工具,网页视频下载神器
  12. php表单美化,使用css美化html表单控件详细示例(表单美化)_HTML/Xhtml_网页制作
  13. Xcode Message from debugger: Terminated due to memory issue
  14. 配置分离式LANP源代码编译实例
  15. 双十一,美团为何静悄悄?
  16. 最终分化的SH-SY5Y细胞为研究多巴胺激动剂的神经保护作用提供了一个模型系统
  17. flink常用参数说明
  18. 春考天津计算机知识点资料,2016年天津春季高考计算机基础考试大纲
  19. [附源码]计算机毕业设计Python+uniapp学生选课APP3cnsl(程序+lw+APP+远程部署)
  20. 艾美捷RPMI-1640培养基L-谷氨酰胺的参数和配方

热门文章

  1. 离散时间傅里叶变换(DTFT)与离散傅里叶级数(DFS)
  2. raw格式转换jpg软件 V5.2
  3. 不再害怕打字慢(python信息轰炸)
  4. C++之个人银行账户管理程序
  5. Jcrop实现图片裁剪
  6. CST软件基本操作 —2
  7. 20210726:FLAC刻录音乐CD教程05-总结
  8. 美团:团购突围后走向何方?
  9. ERP实用技巧:物料清单编制------(转)
  10. Java集成快递100的订阅服务和根据物流单号查询物流详情的接口