D3.js - 动画

D3.js 通过转换支持动画。我们可以通过正确使用转换来做动画。转换是关键帧动画的有限形式,只有两个关键帧 - 开始和结束。起始关键帧通常是 DOM 的当前状态,而结束关键帧是你指定的一组属性,样式和其他属性。转换非常适合转换到新视图,而不需要依赖于起始视图的复杂代码。

示例 - 让我们在“transition_color.html”页面中使用以下代码。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <h3>Simple transitions</h3>
      <script>
         d3.select("body").style("background-color", "lightblue") 
         // make the background-color lightblue.transition()
         .style("background-color", "gray");
         // make the background-color gray
      </script>
   </body>
</html>

这里,文档的背景颜色从白色变为浅灰色,然后变为灰色。

duration() 方法

duration() 方法允许属性更改在指定的持续时间内平滑发生,而不是瞬间发生。让我们使用以下代码进行 5 秒的转换。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <h3>Simple transitions</h3>
      <script>
         d3.selectAll("h3").transition().style("color","green").duration(5000);
      </script>
   </body>
</html>

在这里,转换平稳且均匀地发生。我们还可以使用以下方法直接指定 RGB 颜色代码值。

d3.selectAll("h3").transition().style("color","rgb(0,150,120)").duration(5000);

现在,每个颜色编号从 0 到 150 缓慢,平滑和均匀地进行。为了从起始帧值到结束帧值精确混合中间帧,D3.js 使用内部插值方法。语法如下 -

d3.interpolate(a, b)

D3 还支持以下插值类型 -

  • interpolateNumber - 支持数值。

  • interpolateRgb - 支持颜色。

  • interpolateString - 支持字符串。

D3.js 负责使用适当的插值方法,在高级情况下,我们可以直接使用插值方法来获得我们想要的结果。如果需要,我们甚至可以创建一个新的插值方法。

delay() 方法

delay() 方法允许在一段时间之后进行转换。请考虑“transition_delay.html”中的以下代码。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <h3> Simple transitions </h3>
      <script>
         d3.selectAll("h3").transition()
            .style("font-size","28px").delay(2000).duration(2000);
      </script>
   </body>
</html>

转换的生命周期

转换有一个四阶段的生命周期 -

  • 转换计划
  • 转换开始。
  • 转型运行。
  • 转型结束。

让我们一一详细地讨论这些问题。

转换计划

创建转换时会计划转换。当我们调用 selection.transition 时,我们是在计划转换。这也是当我们调用 attr()style() 和其他转换方法来定义结束关键帧时。

转换开始

转换基于其设定的延迟开始,该延迟是在安排转换时指定的。如果未指定延迟,则转换将尽快开始,通常在几毫秒之后。

如果转换有延迟,则应仅在转换开始时设置起始值。我们可以通过侦听开始事件来做到这一点 -

d3.select("body")
   .transition()
   .delay(200)
   .each("start", function() { d3.select(this).style("color", "green"); })
   .style("color", "red");

转换运行

当转换运行时,它会以 0 到 1 的转换值重复调用。除了延迟和持续时间之外,转换还可以轻松控制时序。缓和会扭曲时间,例如慢进和慢进。某些缓动函数可能暂时给出 t 大于 1 或小于 0 的值。

转型结束

转换结束时间始终精确为 1,因此在转换结束时准确设置结束值。转换基于其延迟和持续时间的总和而结束。转换结束时,将调度 end 事件。