首页 > 解决方案 > D3中的平滑递归转换

问题描述

我创建了一个简单的过渡,它在最后会回忆起自己。为什么它是生涩的,如何使它变得光滑?(这里是jsfiddle )

    var circle = svg.append('circle')
    .attr("r",10)
    .attr("cx",10)
    .attr("cy",10)
    .style("fill","red");

    go()

    function go() {
        var c=svg.select("circle");
        c
        .transition()
        .duration(1000)
        .attr("cx",1*c.attr("cx")+10)
        .on("end",go);

    }

标签: javascriptd3.jstransition

解决方案


这是因为默认情况下,过渡缓动函数不是线性的,而是easeCubic。将缓动函数设置为线性可以解决问题:

    function go() {
        var c=svg.select("circle");
        c
        .transition()
        .ease(d3.easeLinear) // <-- THIS WAS ADDED
        .duration(1000)
        .attr("cx",1*c.attr("cx")+100)
        .on("end",go);
}

来自d3-transition 文档

如果未指定缓动函数,则默认为 d3.easeCubic。

为什么会卡顿是因为在使用easeCubic时,对象开始缓慢移动并缓慢停止。您可以在此处可视化缓动效果:https ://easings.net/#easeInOutCubic

固定演示(线性缓动)


推荐阅读