D3它能提供什么?【上】

在上一篇“D3究竟是什么?”中,我们把D3比作画笔,这次我们说说这支画笔能为你提供什么,这也是D3最核心的内容。

能力

在D3的官方说明中已经提到,它主要是为你提供现代浏览器所支持的全部功能,而且不用引入什么专有框架。这些功能其实就是可以使用HTML、SVG和CSS(v4已经可以支持Canvas)来绘制和控制图表,让其更加生动。这些是显而易见的,但往往越简单、越显而易见的东西却越容易被忽视。所以我们现在应该记住,只要我们在使用D3.js,我们就可以使用任何浏览器所支持的功能(HTML、SVG、CSS以及Canvas)来展现我们想要的图表。
换句话说就是D3为我们提供了操作DOM的功能,即增加、修改、删除。这些功能与jQuery十分相似,如果你用过jQuery,那么绝对不会对它陌生。我们在页面中引入D3的js文件(下载地址https://github.com/d3/d3/releases,文章所说内容均为v4版本)后,就可以使用全局变量d3来访问D3的所有内容。下面我们来具体介绍一下比较核心的操作DOM的API。

d3.selection

首先说一下D3里很重要的一个东西,它就是D3的选择--d3.selection。这个选择是个名词(并不是绝对的名词,也可以当“动词”用),你可以把它当成一个类,D3所有操作DOM的API几乎都是它的。它是对DOM元素的一种再包装,可以让你方便的使用其提供的方法进行操作,就好像使用jQuery一样。当我们需要操作DOM时(这也是使用D3最主要的工作内容),首先必须要把我们需要操作的DOM元素“变成”d3.selection对象。方法很简单,只要使用d3.select()d3.selectAll()方法即可。顾名思义,就是需要先让D3选中你要操作的元素。

// 选择第一个符合条件的dom元素
var selection = d3.select(selector);
// 选择所有符合条件的dom元素
var multiSelection = d3.selectAll(selector);

selector:一个css选择器字符串,只要是符合W3C标准的选择器D3都支持。如div表示div元素,.node表示类名中含有node的所有元素,div.node表示类名中含有node的div元素

d3.select()selector参数还可以是一个DOM元素对象,这种使用方式非常有用,在后面的文章中会讲到。这两个方法查找元素的范围是整个document

d3.select()d3.selectAll()返回的结果都是d3.selection对象--即使没有符合条件的元素,也会返回一个空的selection。它们两个的区别之一在上面代码的注释里已经说明了,它们还有一个非常重要的区别,这里先不说,留待下一篇再讲。

d3.selection同样有select()selectAll()方法,它们是在自己的元素中进行查找,比如d3.selectAll('div.node').select(':last-child')

添加

添加元素有两个方法,一个是

  • selection.append()
    d3-append.png
/**
 * 为selection里的每个元素添加指定的元素作为其最后一个子元素,
 * 并返回由新元素组成的新selection.
 */
var newSelection = selection.append(type)

type:可以是字符串,也可以是函数。当它是字符串时,必须是某类元素的名字,如divp等;当它是函数时,这个函数必须返回一个DOM元素实例。

例如我们需要在所有的div中添加一个span元素:

var spanSelection = d3.selectAll('div').append('span');

或者

var spanSelection = d3.selectAll('div').append(function(){ 
    return document.createElement('span')
});

另一个添加元素的方法是

  • selection.insert()
    d3-insert.png
/**
 *  在selection中的每个元素里插入一个新元素,
 *  新元素会放到`before`指定的元素前面
 */
var newSelection = selection.insert(type, [before]);

type:与selection.append()方法的type参数一样
before:一个css选择器,新元素会被插入到匹配它的第一个元素之前
before的默认值是null,当它是nullinsert()的结果与append()一样。

修改

在操作DOM的API中,最常用的是修改DOM的属性--元素标签里可用的属性,以及修改style的内容--即css。

  • selection.attr()
/**
 * 设置或获得属性值
 */
selection.attr(name, [value])

name:属性名
value:属性值,可以是数字、字符串等常量值,也可以是函数,当它是null时删除属性
当指定value时,设置属性值并返回当前selection;当不指定value时,返回selection中第一个元素的属性的当前值。如果value是一个函数,会使用该函数的返回值设置属性。

  • selection.style
/**
 * 设置或获取样式的值
 */
selection.style(name[, value[, priority]])

name:样式的属性名,如positiondisplay
value:样式的值,可以是数字、字符串等常量值,也可以是函数,当它是null时会移除属性--不是设置为空,而是把属性删除掉
priority:优先级,只能是null或字符串importantimportant即表示css规则中的!important

其他修改DOM的方法还有:

  • selection.classed(names[, value]):增加、获取或删除CSS类名
  • selection.text([value]):设置或获取文本内容
    还有其他一些方法,在这里就不一一列出了,大家可以到官方文档(https://github.com/d3/d3/blob/master/API.md)查看。

删除

把DOM元素从document中删除掉,只有一个方法

  • selection.remove()

    从document中删除selection里的所有DOM元素并返回当前selection,这时的selection是空的

小结

今天介绍了如何使用D3操作DOM元素,这是D3中非常基础且核心的内容,而且非常简单易于掌握。下一篇我们会介绍D3最核心的内容--数据驱动。
我在codepen上有一个简单的示例,有兴趣的朋友可以在浏览器中看一下:
https://codepen.io/guofei0723/pen/KqYOwp/left


欢迎大家关注我的微信公众号


var_web
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343