D3.js--从陌生到熟悉

Working with Transitions

2018-04-21  本文已影响0人  雷朝建

转换是动态操作

转换是从一个start状态转换为end的一个动态过程. 例如我们将页面的背景色从green转换为red.

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

我们可以监听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, 它需要知道给予参数的合理性(例如('green', 'red'), 则颜色从green过渡到red). 目前规则如下:

function interpolateNumber(a, b) {
  return function(t) {
    return a + t * (b - a);
  }
}

转换的生命周期

周期分为四个部分:

实例: 在enter/update/exit中执行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)

源码

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

上一篇下一篇

猜你喜欢

热点阅读