使用 d3.js 实现字符跳动效果,如下所示

实现代码

  const svg = d3.select('.el').append('svg').attr('width', 960).attr('height', 100).append('g');

  const words = 'abcdefghijklmnopqrstuvwxyz'.toUpperCase().split('');

  function update(data) {
    const t = d3.transition().duration(750);
    const text = svg.selectAll('text').data(data, (d) => d);

    // 进入时,可以在这里设置初始状态
    text
      .enter()
      .append('text')
      .attr('y', 100 / 2)
      .style('font-size', 18)
      .style('fill-opacity', 1e-6)
      .attr('dy', -50)
      .attr('fill', '#0f0')
      .attr('x', (d, i) => i * 32)
      .text((d) => d)
      .transition(t)
      .attr('dy', 0)
      .style('fill-opacity', 1);

    // 更新时,通过transition将进入时的状态或上一次的状态过渡到最新状态
    text
      .attr('fill', '#ccc')
      .transition(t)
      .attr('dy', 0)
      .style('fill-opacity', 1)
      .attr('x', (d, i) => i * 32);

    // 移除时,先执行过渡,过渡结束删除节点
    text.exit().attr('fill', '#f00').transition(t).attr('dy', 50).style('fill-opacity', 1e-6).remove();
  }

  update(words);

  // 定时重复执行更新,每两秒执行一次
  d3.interval(() => {
    update(
      d3
        .shuffle(words)
        .slice(0, Math.floor(Math.random() * 26))
        .sort(),
    );
  }, 2000);
});
Last Updated:
Contributors: leevare