Working with Transitions

轉(zhuǎn)換是動態(tài)操作

轉(zhuǎn)換是從一個start狀態(tài)轉(zhuǎn)換為end的一個動態(tài)過程. 例如我們將頁面的背景色從green轉(zhuǎn)換為red.

d3.select('body')
  .style('background-color', 'green')
  .transition()
  .delay(1000)
  .style('background-color', 'red');

我們可以監(jiān)聽transition的start/end事件:

d3.select('body')
  .transition()
  .delay(1000)
  .on('start', function() { d3.select(this).style('background-color', 'green')})
  .style('background-color', 'red')
  .on('end', () => console.log('end...'));

更簡單的方法在于使用類似styleTween/attrTween的方法(不確定是否常用):

d3.select('body').transition()
  .styleTween('background-color', () => d3.interpolate('green', 'red'));

針對d3.interpolate, 它需要知道給予參數(shù)的合理性(例如('green', 'red'), 則顏色從green過渡到red). 目前規(guī)則如下:

  • numbers
  • colors
  • geometric transforms
  • strings with embedded numbers(例如"96px")
    但如果是自己實(shí)現(xiàn)interplator, 則需要類似下列的寫法: 保證t=0時候返回a, t=1時候返回b:
function interpolateNumber(a, b) {
  return function(t) {
    return a + t * (b - a);
  }
}

轉(zhuǎn)換的生命周期

周期分為四個部分:

  • 轉(zhuǎn)換寫入計(jì)劃表
  • 轉(zhuǎn)換開始start
  • 轉(zhuǎn)換運(yùn)行run
  • 轉(zhuǎn)換結(jié)束end
    當(dāng)我們寫selection.transition時候, 轉(zhuǎn)換就寫入計(jì)劃表中. 則start在delay后面運(yùn)行; 否則start會盡可能快的運(yùn)行. 當(dāng)執(zhí)行run情況下, 它會重復(fù)調(diào)用t從0~1所返回的值. 當(dāng)t=1的時候, 執(zhí)行end操作.

實(shí)例: 在enter/update/exit中執(zhí)行transition

    const width = 960;
    const height = 500;
    const x = d3.scalePoint()
      .domain([0, 1, 2])
      .range([height / 4, width - height / 4]);

    const svg = d3.select('svg');
    let circle = svg.selectAll('circle')
      .data([0, 1])
      .enter().append('circle')
      .attrs({
        r: height / 4,
        cx: x,
        cy: height / 2
      });

    setTimeout(() => {
      circle = circle.data([1, 2], d => d);
      circle.transition().duration(750)
        .attr('r', height / 3)
        .style('fill', 'orange');
      
      circle.enter().append('circle')
        .attrs({
          r: height / 4,
          cx: x,
          cy: height / 2
        })
        .style('fill', 'green');

      circle.exit().transition()
        .attrs({
          r: 1e-6,
          fill: 'red'
        })
        .remove();
    }, 1000)
  • 使用d3.scalePoint, 將domain和range對應(yīng)起來.
  • 預(yù)先繪制[0, 1]兩個黑色的圓圈, 以750毫秒的速度繪制[1, 2]兩個圓圈, 半徑調(diào)整為height / 3, 顏色設(shè)置為橘色.
  • 將新增的2號圓圈, 半徑設(shè)置為height / 4, 并且顏色為green.
  • 將0號圓圈的半徑設(shè)置為1e-6, 填充紅色, 并刪除.

源碼

https://github.com/leicj/d3/blob/master/src/components/transition.js

?著作權(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)容

  • d3 (核心部分)選擇集d3.select - 從當(dāng)前文檔中選擇一系列元素。d3.selectAll - 從當(dāng)前文...
    謝大見閱讀 3,574評論 1 4
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 2,112評論 0 2
  • 可能很多人會覺得,生而在世,要追夢,尤其是現(xiàn)在80 90后當(dāng)?shù)?,都是一群追夢的少年?也許有你追到了,心滿意足。也...
    瑪麗蓮?fù)?/span>閱讀 369評論 0 0
  • 2017年9月30日,弟子蔡小敏,種種子第37天。 發(fā)心:我今天不僅是為了我個人而聞思修,更是為了六道輪回一切如母...
    Rubywry閱讀 206評論 0 4
  • 當(dāng)人們開始寫詩的事后,大概就是最最心意蕩漾,或者最最愁苦難擋的時候了。而為了某人而作的話,更是憑添了幾分情意。記得...
    citoyendumonde閱讀 239評論 0 0

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