D3.js核心概念

D3.js是一個JavaScript的函數(shù)庫,主要用來做數(shù)據(jù)可視化。

本節(jié)內(nèi)容介紹了選擇集、動態(tài)屬性、enter、exit、update操作和過渡。選擇集描述如何選中想要操作的節(jié)點(diǎn);動態(tài)屬性控制選中節(jié)點(diǎn)元素的屬性;enter、exit、update分別來添加節(jié)點(diǎn)、移除節(jié)點(diǎn)、更新節(jié)點(diǎn);過渡用來制作動畫效果。

下載最新版本(4.11.0)在這里:

也可直接鏈接,拷貝下面片段:

<script src="https://d3js.org/d3.v4.min.js"></script>

D3教程:點(diǎn)擊這里

Selections

D3可以選擇某一種標(biāo)簽的所有節(jié)點(diǎn)進(jìn)行批量操作,也可以根據(jù)需要選擇單獨(dú)的節(jié)點(diǎn)進(jìn)行操作。當(dāng)使用JavaScrip對某一種標(biāo)簽節(jié)點(diǎn)操作時需要進(jìn)行迭代操作,而使用D3可以批量操作,減少代碼冗余。

選擇所有節(jié)點(diǎn)進(jìn)行操作:

d3.selectAll("p").style("color", "white");

選擇單獨(dú)節(jié)點(diǎn)進(jìn)行操作:

d3.select("body").style("background-color", "black");

以上示例是按照標(biāo)簽名來選擇節(jié)點(diǎn)元素(“p”和“body”),還可以按照attribute value、class、id等選擇節(jié)點(diǎn)元素。與jQuery相似,使用#匹配id,.匹配class......

Dynamic Properties

樣式、屬性可以被指定為D3中數(shù)據(jù)的函數(shù),而不僅僅是簡單的常量。

例如,隨機(jī)初始化段落的顏色:

d3.selectAll("p").style("color", function() {
  return "hsl(" + Math.random() * 360 + ",100%,50%)";
});

根據(jù)奇偶設(shè)置段落的顏色:

d3.selectAll("p").style("color", function(d, i) {
  return i % 2 ? "#fff" : "#eee";
}); 

數(shù)據(jù)可以動態(tài)綁定到節(jié)點(diǎn)元素中。數(shù)據(jù)被指定為一個數(shù)組,每個元素作為一個參數(shù)傳遞到函數(shù)中,默認(rèn)情況下是按索引逐個元素進(jìn)行傳遞,數(shù)組中的第一個元素被傳遞給第一個節(jié)點(diǎn),第二個元素被傳遞給第二個節(jié)點(diǎn),以此類推。

例如,將數(shù)字?jǐn)?shù)組綁定到段落元素,段落字體大小按數(shù)組中這些數(shù)字來依次顯示:

d3.selectAll("p")
  .data([4, 8, 15, 16, 23, 42])
  .style("font-size", function(d) { return d + "px"; });

Enter and Exit

使用enter和exit函數(shù),分別可以為傳入的數(shù)據(jù)創(chuàng)建新的節(jié)點(diǎn)和去除多余的節(jié)點(diǎn)。

當(dāng)數(shù)組綁定到節(jié)點(diǎn)時,數(shù)組中的元素逐個與選中的節(jié)點(diǎn)進(jìn)行綁定。如果節(jié)點(diǎn)數(shù)量少于數(shù)組元素?cái)?shù)量時,會創(chuàng)建新節(jié)點(diǎn)綁定多出的數(shù)據(jù)。如果節(jié)點(diǎn)數(shù)量多于數(shù)組元素?cái)?shù)量時,會移除末尾多出的節(jié)點(diǎn)。enter之后一般使用append來進(jìn)行節(jié)點(diǎn)元素的實(shí)際創(chuàng)建,exit之后一般使用remove來移除多出的節(jié)點(diǎn)。

例:

d3.select("body")
  .selectAll("p")
  .data([4, 8, 15, 16, 23, 42])
  .enter().append("p")
  .text(function(d) { return "I’m number " + d + "!"; });

更新節(jié)點(diǎn)元素。不會創(chuàng)建新的節(jié)點(diǎn)。

// Update...
var p = d3.select("body")
  .selectAll("p")
  .data([4, 8, 15, 16, 23, 42])
  .text(function(d) { return d; });

創(chuàng)建新的節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)數(shù)量小于數(shù)組元素?cái)?shù)量時,創(chuàng)建新的節(jié)點(diǎn),使節(jié)點(diǎn)數(shù)量與數(shù)據(jù)元素?cái)?shù)量相等。

// Enter...
p.enter().append("p")
    .text(function(d) { return d; });

刪除多余節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)數(shù)量大于數(shù)組元素?cái)?shù)量時,移除末尾多余的節(jié)點(diǎn),使節(jié)點(diǎn)數(shù)量與數(shù)據(jù)元素?cái)?shù)量相等。

// Exit...
p.exit().remove();

Transitions

D3支持動畫效果,這種動畫效果可以通過對樣式屬性的過渡實(shí)現(xiàn)。其補(bǔ)間插值支持多種方式,比如線性、彈性等。

d3-transition詳解:點(diǎn)擊這里

這里介紹四個函數(shù)。

transition()

啟動過渡效果。其前后是圖形變化前后的狀態(tài)(形狀、位置、顏色等等)。

duration()

指定過渡的持續(xù)時間,單位為毫秒。

ease()

指定過渡的方式,常用的有:

  • linear:普通的線性變化
  • circle:慢慢地到達(dá)變換的最終狀態(tài)
  • elastic:帶有彈跳的到達(dá)最終狀態(tài)
  • bounce:在最終狀態(tài)處彈跳幾次

delay()

指定延遲的時間,表示一定時間后才開始轉(zhuǎn)變,單位同樣為毫秒。此函數(shù)可以對整體指定延遲,也可以對個別指定延遲。

例,背景色過渡到黑色,1秒后開始過渡,過渡時長為1秒:

d3.select("body").transition()
        .delay(1000)
        .duration(1000)
        .style("background-color", "black");

更多內(nèi)容:Github個人博客
備注:本文發(fā)表于 https://cnyangkui.github.io/2017/10/11/d3core.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對集合的操作 關(guān)于d3.attr 一個可以處理很多情況的函數(shù),當(dāng)只傳入一個參數(shù)時,如果是string,則返回該屬性...
    陳堅(jiān)生閱讀 2,766評論 0 2
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,175評論 0 29
  • 王想是什么時候開始問我這個問題的,我想想,那一定是在一個十分普通的夜里,他安靜的躺在床上,然后平靜地問我:我到底是...
    百鬼夜行衣閱讀 651評論 0 0
  • One 依稀記得小學(xué)那會很調(diào)皮,總喜歡和領(lǐng)居家的小男孩一起追逐打...
    莫為浮云遮望眼閱讀 220評論 0 0
  • 認(rèn)識我,你后悔嗎? 輕易就相信別人, 不是因?yàn)槲疑担?而是人生已經(jīng)如此艱難, 有些謊言我不想拆穿…… 喜歡去幫助別...
    紫色音符閱讀 1,024評論 0 3

友情鏈接更多精彩內(nèi)容