SVG在html页面中有两种引用方式:

1. 内联。就是直接将SVG图形写在html的svg标签中,比如:

<html>
<head></head>
<body>
<svg ...> >
... > 内联式
</svg> >
</body>
</html>

2. 外部引用。就是以img标签,embed标签,object标签或iframe标签引用外部的svg文件,比如:

<html>
<head></head>
<body>
<img src="sample.svg"> >
<embed src="sample.svg"></embed> > 外部引用式
<iframe src="sample.svg"></iframe> >
<object data="sample.svg"></object> >
</body>
</html>

对于以img标签形式的外部引用,将不支持脚本访问内部元素,仿佛真的就变成“img”了,因此仅适用于静态使用场景,应用范围比较有限。而其他几种方式都支持脚本访问。

那么问题来了,有这么多种引用方式,究竟哪种比较好呢?

经过这几天对SVG的折腾,我发现:对于静态使用场景,无所谓。对于动态使用场景,推荐内联方式,外部引用方式有不少坑。

内联方式可以满足你的任何需求:

1. 可以直接使用Javascript进行DOM操作(注意,Jquery也可以哦,但有些方法没有效果,因为SVG和HTML的DOM不同)

2. 可以直接使用CSS修饰

换句话说,用内联方式引用的SVG就跟普通HTML标签没什么区别!

唯一的不爽嘛,就是SVG的代码必须硬编码进HTML页面中,看着不爽,灵活性也差。

外部引用就比较悲剧了:

1. 无法直接使用Javascript进行DOM操作。

直接调用getElement系列方法得到的是引用的那个标签而不是SVG内容,比如:

<object id="svg-sample" src="sample.svg"></object>

你用document.getElementById("svg-sample")得到的只是object那个标签,而sample.svg的内容是没有的。为了得到svg的内容,必须还得通过contentDocument属性或getSVGDocument()方法。像这样:

document.getElementById("svg-sample").contentDocument

或是

document.getElementById("svg-sample").getSVGDocument()

(getSVGDocument是个被废弃的方法,不推荐使用)

但是要注意,上面这个方法只对XHTML类型的页面有效,Content-Type得是application/xhtml+xml,否则对于text+html类型的页面还是取不到SVG的内容。因此,在本地调试的时候,还要对服务器进行特殊配置,使其返回正确类型的页面。好蛋疼。只有取到SVG的内容,才能够继续使用Javascript操纵内部元素。

可以参考StackOverflow上这个问题

2. 无法直接用CSS修饰

这个好解决,在SVG内部引入外部CSS即可。但我最开始被这个问题困扰了很久。。一直不知道原因。

SVG成为标准都10多年了,没想到直到今天用起来还这么蛋疼。。

蛋疼的SVG外部引用方式的更多相关文章

  1. svg复用方式<g>, <defs>, <symbol>, <use>

    svg复用元素的方式主要有 <g>, <defs>, <symbol>, <use> 1. <g> group, 分组,定义一组元素,初始不 ...

  2. SVG简介

    最近遇到SVG这个名词,于是查阅资料,做个笔记. 前言 图片的数字化.将图片存储为数据有两种方案. 位图.也被称为光栅图.即是以自然的光学的眼光将图片看成在平面上密集排布的点的集合.每个点发出的光有独 ...

  3. o'Reill的SVG精髓(第二版)学习笔记——第五章

    第五章 文档结构 5.1 结构与表现 XML的目标之一便是提供一种能将结构从视觉表示中独立出来的方法. 但是不幸的是,关于XML的很多讨论都强调结构而非表现. 我们将通过详细讨论如何在SVG中指定表现 ...

  4. 【转】【翻译】对响应式SVG的再思考

    来源: http://www.w3ctech.com/topic/1555 原文地址:http://www.smashingmagazine.com/2014/03/rethinking-respon ...

  5. svg滤镜学习

    SVG滤镜绝对称得上是他最强大的功能之一,在不影响任何文档结构的前提下,允许你给你的矢量图形添加各种专业视觉效果,我个人给他的定义就是,把PS装到了网页上. 一.  SVG滤镜的原理 基本原理描述太多 ...

  6. HTML 引用Css样式的四种方式

    不才,只知道HTML引用CSS样式有四种方式,内部引用和外部引用各两种,因为老是忘记细节,记下了随时翻阅亦可方便如我般的初学者 内部引用方式1: 直接在标签内用 style 引用,如: <div ...

  7. svg学习之旅(1)

    Canvas 与 SVG 的比较 下表列出了 canvas 与 SVG 之间的一些不同之处. Canvas 依赖分辨率 不支持事件处理器 弱的文本渲染能力 能够以 .png 或 .jpg 格式保存结果 ...

  8. 通过SVG与CSS3实现向上图标

    需求 H5活动页需要用的图标很少,暂时没有使用iconfont的必要性,而通过图片的话额外增加UI的工作量以及增加请求数,前端也有很多实现简单图标的方法,所以就尝试自己去解决,写一个"返回顶 ...

  9. SVG初尝试(一)

    SVG简介 SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics).其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它 ...

随机推荐

  1. uvm_comps.svh

    UVM的文件组织方式很有意思,比如,在src/comps/ 下的所有文件都通过uvm_comps.svh 包含进去. `include "comps/uvm_pair.svh" ` ...

  2. SQLServer 错误: 15404,无法获取有关 Windows NT 组/ 用户 'WIN-8IVSNAQS8T7\Administrator' 的信息,错误代码 0x534。

    在自动清理日志的作业中,执行过程出现如下问题:“SQLServer 错误: 15404,无法获取有关 Windows NT 组/ 用户 'WIN-8IVSNAQS8T7\Administrator' ...

  3. winform中显示标题,点击打开链接

    效果:显示的是标题,但是点击打开的是链接 思路:定义一个类,将类实例化,向类中写入数据,再将类放到listbox中,设置listbox的显示分类为文本 前台:放入一个listbox控件 后台: pub ...

  4. LR中下载文件的脚本

    #include "web_api.h" Action(){ int iflen; //文件大小 long lfbody; //响应数据内容大小 web_url("xxx ...

  5. 生成随机ID且唯一

    var T = [ {P:11,G:2}, {P:101,G:7}, {P:1009,G:26}, {P:10007,G:59}, {P:100003,G:242}, {P:1000003,G:568 ...

  6. java运行环境jdk的安装和环境变量的配置教程

    jdk的下载与安装 一.官网下载jdk 1.百度搜索jdk,进入官网,如下图所示: 官网下载jdk图1 2.在官网网站中找到合适的版本下载(以最新版本为例),如下图所示: 官网下载jdk图2 官网下载 ...

  7. java script DOM BOM

    onclick        当用户点击某个对象时调用的事件句柄.ondblclick     当用户双击某个对象时调用的事件句柄. onfocus        元素获得焦点.            ...

  8. prototype中的ajax异步加载

    jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...

  9. WYS APP

    UI图:http://modao.io/app/H8eZCQdV1pskjQ7z8bLh 四个tab:我要赛.赛事.运动吧.个人中心 赛事页面 1.主要是个NavigationController 2 ...

  10. 【数位dp】bzoj3209: 花神的数论题

    Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了. ...