d3可视化实战01:理解SVG元素特性

一. SVG简介

—————————————————————————————————————————————————————————————————

SVG是一种和图像分辨率无关的矢量图形格式,它使用严格的XML语法描述图形内容。关于它,主机位于麻省理工学院的W3c官网有着全面的介绍(http://www.w3.org/Graphics/SVG/)。

上面这张图片展示了位图和矢量图的区别。位图是由点构成的,矢量图则是由一些形状元素构成。该图中显示放大位图可以看到点,而放大矢量图看到的仍然是形状。SVG属于矢量图,因此能够无级缩放,而不会导致马赛克。

我个人认为想要了解一门语言,不论它是计算机语言还是自然语言,它的产生发展的历史都是非常好的切入点。

SVG最早于1999年由一系列加入W3C的公司提出,并且SVG很早就因为它的易读、可编辑、易于进行脚本控制和易于制作网页上的交互图形等优点而为人们所瞩目,但在2011年才最终被收录为W3C标准。IE系列长期不能支持SVG,直到IE9。造成这种结果是有着深刻的历史原因。

SVG格式绝非第一种矢量图形格式。在它被提出的前一年,还有adobe联合IBM、netscape、SUN提出的PGML格式(Precision Graphics Markup Language)和微软提出的VML格式(Vector Markup Language)被提交给了W3C。正在二者因为激烈的商业竞争相持不下的时候,W3C启动了一个SVG工作小组,花了6个月时间在PGML和VML的基础之上开发出了SVG标准,希望弥合两大阵营的分歧——但结果是SVG成了第三个竞争者。不过由于SVG的种种优势和与PGML的许多相似性,PGML阵营的公司很多都加入了SVG阵营。但是微软依旧我行我素。因为当时微软已经是独霸天下,在浏览器之争中靠着捆绑策略把netscape打得爬不起来。虽然微软提出的VML被W3C拒绝,但它依旧只挺自家的娃,因而在之后微软推出的IE5.0+和microsoft office 2000+只能用VML,直到2008年VML实在是没人用而被微软放弃为止。除此以外,adobe公司的flash也一直霸占着矢量图形程序的很大一块市场份额,与通用的矢量图形格式SVG互相竞争。以上问题导致直到诞生12年后的2011年,SVG才被列为W3C标准。我只能说,有人的地方,就有江湖,技术标准的制定离不开江湖规则的干涉。好在现在市场份额第一的浏览器已经是谷歌的chrome,而不是IE了。特别值得一提的是,在移动端领域,由于微软的边缘化,所以SVG的支持率非常高。尽情地用SVG制作交互图形吧!

二.SVG的基本元素

—————————————————————————————————————————————————————————————————

SVG标签有很多,详见:w3cSchool。为了简单起见,可以把其元素分为三大类:矢量图形、文字、引用位图。其中常用的如下:

  • 矢量图形:svg(定义svg文档片段), rect(定义矩形), circle(定义圆形),ellipse(定义椭圆),path(路径),line(线),ploygon(多边形),title(标题), desc(描述), g(群组), defs(参考元素)。
  • 文字:text(文字), 锚点(a)
  • 引用位图: image(图片元素)

这些元素本身很简单,光看文档就可以了解,但是其中我个人觉得值得一提的有如下几点:

  1. SVG的路径功能很强大,可以实现几乎任何图形。再加上svg无损缩放的特性,其他前端技术无出其右。
  2. 控制SVG对象通常需要使用控制其特有属性,例如填充颜色是fill, 填充边框是stroke,变形是transform, 这些与html对象是不同的。
  3. SVG图形的滤镜效果和渐变效果,需要使用svg的滤镜标签或者渐变标签作为色彩填充的引用对象。(在raphael类库中对此有封装,但是d3没有。d3不太在乎这些样式问题,d3的重点在于数据转换)
  4. SVG的位移、旋转、缩放、变形功能都可以通过transform属性来实现。配合SVG的动画标签,不依赖JS、CSS即可创造出各种动画效果。
  5. SVG中亦可包含超链接锚点标签<a>,文字标签<text>, 图片标签<image>等,故而可以纯用svg做一个网页,还是包含动画效果的。
  6. 实际应用中,复杂图形的代码是难读的。尤其是涉及多层群组、复杂路径、各种滤镜的情况下。因此做图形设计的时候几乎必须用到SVG编辑器,例如大型软件adobe illustrator, visio, CorelDRAW,在线工具svg-edit,开源软件ScribusKarbon14Inkscape以及Sodipodi等。
  7. 实际上,SVG技术本身的动态部分(包括时序控制和动画)就是基于SMIL标准。SVG文件还可嵌入JavaScript(严格地说,应该是ECMAScript)脚本来控制SVG对象。所以可以使用原生JS或者像d3.js这样封装过的js类库来控制SVG,效率很高。
  8. 特别说明:对SVG的dom元素使用jquery进行直接的增删改操作是不行的,毕竟jquery的设计初衷就不像d3那样为了操作SVG而生。如果一定要用jquery,下载这个jquery SVG控制插件即可。

三.SVG与html的共同使用

—————————————————————————————————————————————————————————————————

在现代浏览器中,SVG与html是并行不悖的。通常我们是在一个html页面中,嵌入一组svg元素来表现矢量内容。但是,考虑到有些交互操作的复杂性,我们有可能需要在SVG元素中再显示一些div之类的html标签。但是遗憾的是,直接这样做的结果是这些嵌入的html标签不会显示。这是使用SVG制作交互图表时经常遇到的问题。有两个解决办法:

1.将div使用SVG元素foreignObject包裹。详见:http://ajaxian.com/archives/foreignobject-hey-youve-got-html-in-my-svg。但是IE的任何版本都不支持foreignObject!包括新出的IE11!微软你还要祸害到什么时候!

2.将div定义为浮动层,然后使用left, top等属性计算位置,浮动显示在SVG图形之上。这是较为常用的方法,因为d3也可以同时控制html元素,而动画效果可以通过css3来解决,不会有什么兼容性问题。详见我之前的文章:SVG文字交互区域的制作注意:html object in SVG

四.CSS与SVG

—————————————————————————————————————————————————————————————————

这里我有必要对兼容性还有疑虑的童鞋说一句,既然已经喝了毒药,那么就把盘子舔干净吧!既然已经用了SVG,那么就可以放心地用CSS3了。因为但凡支持SVG都是现代浏览器,现代浏览器又基本支持CSS3,所以为什么不用呢?让那些CSS3动画效果,阴影效果,圆角什么的来得更猛烈些吧!

必须指出的是,CSS3的标准指定,大幅度地参考了SVG。尤其是CSS3的变形和动画效果,咱们可以对比一下CSS3的写法SVG的写法,简直是一模一样啊!所以在使用SVG制作图表时,可以大胆地使用css3动画效果去处理html元素。当然,由于一些css3效果在不同浏览器里支持情况不同,所以对于一些支持情况不太好的效果,比如变形,还是得同一个属性一口气写5个带前缀的语句,来保证兼容性,就像下面这样(这个程序里我们用d3来进行div的放大缩小,实际上用的是操纵CSS3来处理):

1

2

3

4

5

6

7

d3.select("div").style({

"transform":         "scale(" + config.scale + ")",

"-webkit-transform": "scale(" + config.scale + ")",

"-moz-transform":    "scale(" + config.scale + ")",

"-o-transform":      "scale(" + config.scale + ")",

"-ms-transform":     "scale(" + config.scale + ")"

})

还有一点要指出的是,SVG元素当然也可以用css来指定样式。例如做SVG元素节点的点击效果,你也可以写d3.select(“.path”).class(“active”, true),给path赋予一个名为active的css类,然后把样式写css里。当然,css里得写SVG的那些属性,例如填充是fill,边框是stroke。

使用svg编辑软件画的妹子,还等什么快来使用svg吧!(摘自wikipedia)

时间: 2024-10-21 15:12:51

d3可视化实战01:理解SVG元素特性的相关文章

d3可视化实战03:神奇的superformula

需求驱动实现 前文讲过了D3的数据驱动机制,中间所举的例子都很简单.例如那个demo里面,绑定的数据是一个简单的数组,实现的图元也仅仅是一堆用SVG画的circle.但是现实世界中我们往往会遇到复杂的需求,例如我就遇到了这样一个需求:数据是一个复杂的对象数组,而与之绑定的图元是一个可变图形.该图形可以根据与他绑定的数据中的具体参数,在圆形.方块.三角之间切换,并且要求过渡自然. 面对这个需求,最直接的做法是把圆形.方块.三角用SVG的<circle>圆形标签,<rect>矩形标签以

d3可视化实战02:理解d3数据驱动的真正含义

前文中已经提到,SVG从诞生之初起就可以非常方便地使用javascript脚本语言来进行其DOM对象的控制.当然,控制的方法有很多,有直接控制SVG对象的方法,例如使用原生js:有帮你封装一下图形接口再进行直接控制的js类库,如 Raphaël.但是正如我在第一篇文章中所说,d3作为一个中间型类库还能脱颖而出的重要原因,在于它突破了其他类库的那种直接控制表现层的机制,而采用了对于web图形处理领域较为新颖的数据驱动机制(2011),并获得了极大的成功. 数据驱动的历史 数据驱动编程并不是一个新鲜

d3可视化实战00:d3的使用心得和学习资料汇总

最近以来,我使用d3进行我的可视化工具的开发已经3个月了,同时也兼用其他一些图表类库,自我感觉稍微有点心得.之前我也写过相关文章,我涉及的数据可视化的实现技术和工具,但是那篇文章对于项目开发而言太浅了.于是想写关于d3进行项目实战的系列文章,就像我之前的angularjs实战系列文章一样把整个开发过程中遇到的各种问题及解决办法梳理成章,以为留存.作为开篇,我还是想先把这段时间来我一直参考的资料做一个整理,并谈一些宏观的体会. 一.前方有坑,注意! ————————————————————————

d3可视化实战04:事件绑定机制

首先说明,d3支持所有的JS事件——甚至其他代码的自定义事件.这里有一个列表,The MDN Event Reference, 包含了几乎所有浏览器创建的事件类型.大家有需要可以去查看. D3的事件绑定的语法,与jquery等其他类库用起来区别不大,都是object.on( event, listener )的形式.但是在具体实践中,我们经常会遇到给同一个对象绑定多个事件监听器的问题.这里就原生js.jquery和d3分别进行讨论. 一.原生JS的事件绑定 在探讨这个问题之前,我们首先需要看一下

《D3.js数据可视化实战手册》即将上市!

内容提要 如今这个互联网时代,人们每天都生产海量的数据,如果直接面对这些数据,可能让人无从下手.将数据可视化,用形象立体的形式将其展现,有利于分析其中的关联,攫取可能存在的商业机会.本书意图通过大量的示例和代码,向读者讲述如何利用D3.js来实现数据可视化.只要您了解Javascript,就能完全掌握本书的内容. 本书一共13章,从如何搭建D3.js的开发环境开始,逐步介绍D3中的各种操作,包括选集.数据的初步处理.数据映射.坐标轴组件.动画过渡效果.SVG相关介绍.绘制图表.安排布局.可视化交

D3 数据可视化实战 笔记

学习真是件奇妙的事情.这本书我之前都看过,有些的知识点却完全没有印象. 总结:把用到的知识好好研究:平时可以了解其他技术的基础,把相关的资料和难点记录下来. javascript陷阱 1.变量类型 var myName = 'sfp'; typeOf myName; //'String' 2.变量提升 for(var i=0; i<100; i++){ //... } //i在for循环开始之前就有了定义 3.全局命名空间 比较好的做法:只在函数里面声明变量:只声明一个全局对象. var loc

理解SVG坐标系统和变换: transform属性

SVG元素可以通过缩放,移动,倾斜和旋转来变换-类似HTML元素使用CSS transform来变换.然而,当涉及到坐标系时这些变换所产生的影响必然有一定差别.在这篇文章中我们讨论SVG的transform属性和CSS属性,包括如何使用,以及你必须知道的关于SVG坐标系变换的知识. 这是我写的SVG坐标系统和变换部分的第二篇.在第一篇中,包括了任何要理解SVG坐标系统基础的需要知道的内容:更具体的是, SVG viewport, viewBox 和 preserveAspectRatio 属性.

Pentaho6.1中D3可视化库的集成及数据联动的实现

1.软件环境 操作系统版本:Win 10 64位 可视化图形库:D3 Pentaho版本: biserver-ce-6.1.0.1-196 2.对D3的简单介绍 D3允许你将任意的数据绑定到文档对象模型(DOM),然后运用数据驱动转换到文档上.例如,你可以使用D3将一个数组生成一个HTML表格.或者,使用相同的数据来创建一个有平滑过渡和交互的交互式SVG条形图. D3不是一个旨在提供每一个可能想到的功能的单一框架.相反的,D3所解决的问题的关键是:高效操作基于数据的文档.它提供了显著的灵活性,展

理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio

SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我们将讨论控制SVG坐标系的最重要的三个属性:viewport, viewBox, 和 preserveAspectRatio. 这是本系列三篇文章中的第一篇,这篇文章讨论SVG中的坐标系和变换. 理解SVG坐标系和变换(第一部分)-viewport,viewBox,和preserveAspectRa