SVG D3.js - transition ( tween、interpolate )

之前有介紹過「d3.js 基本的 transition」( 好像是一月份的事情了,真是好久以前啦... ),這篇要來談談比較難的 tween ( 補間動畫 ),在之前的 transition 都是使用 d3.js 預設的補間動畫,而 tween 可以透過一個函式,指定中間過場的行為,這個方式其實很好用,因為我們除了基本的長、寬、位置、顏色,更可以做出文字、數字...等電腦不知道如何做補間動作的效果 ( 例如 1~10 的數字變換 ),而 tween 通常會搭配 interpolate 一起服用,所以這篇就一起來介紹。

參考:d3.js 基本的 transition

tween 的用法其實滿容易的,就是tween(name,factory),當中的 name 是我們自訂這個補間動畫的名稱,不過這個 name 實際上沒有太大的用處,彷彿是識別用的 ( 可以參考 stackoverflow 的這篇,也是有人對這個 name 有同樣的困惑 ),至於第二個參數 factory 就十分重要了,裏頭主要會放上我們需要進行補間動畫的程式,以下面的這個例子來看,透過interpolateRound,可以計算 0 到 100 之間的補間數字,然後再透過 tween 本身的 return,就可以非常簡單的做出一個 0 到 100 跳動的效果。( 範例:svg-d3-15-transition-tween-demo1.html )

var show = d3.select('#show');

show.transition().tween("number", function() {
  var i = d3.interpolateRound(0, 100);
  return function(t) {
    this.textContent = i(t);
  };
});

在上一篇 transition 有提過,duration 預設值為 250ms,因此我們如果把 duration 拉長,就會看到數字慢慢增加。( 範例:svg-d3-15-transition-tween-demo2.html )

var show = d3.select('#show');

show.transition()
.duration(2000)
.tween("number", function() {
  var i = d3.interpolateRound(0, 100);
  return function(t) {
    this.textContent = i(t);
  };
});

SVG D3.js - transition ( tween、interpolate )

比較清楚 tween 在幹嘛之後,接著要先來看一下 interpolate 的用法,畢竟 tween 的精髓還是在 interpolate,其實在之前已經有出現過 interpolate ( SVG D3.js - 繪製線段 ),是幫我們自動去計算線段之間的插值,而 interpolate 主要有以下這幾種:

到這邊基本上已經可以利用 interpolate 和 tween 做出自己的補間動畫,這個方式其實在許多視覺畫圖表的動態都滿常見的,最後我們將前面的集合在一起做個變化,就會有頗酷的效果囉!( 範例:svg-d3-15-transition-tween-demo9.html

var show = d3.select('#show');
var cc = document.getElementById('color');

show.transition()
.duration(2000)
.tween("number", function() {
  var i = d3.interpolateRound('0', '1000');
  var c = d3.interpolateRgb('#555', '#fa0');
  return function(t) {
    this.textContent = i(t);
    d3.select(this).style({'color':c(t)});
    console.log(cc.textContent);
    cc.innerHTML = c(t);
  };

SVG D3.js - transition ( tween、interpolate )

有興趣瞧瞧其他新文章嗎?