D3.js transition动画操作

773 阅读1分钟

D3.js 动画效果

transition()动画效果

主要是使用 selection.transition( ) 这个 API 来处理动画,由于是操作dom元素,因此要先用select() 的方法选定 DOM 元素后,才能将动画绑定到返回的 selection 实体上。实现动画效果主要使用transition的以下几种API方法:

  • transition.duration( ) ⇒ 控制动画时长,这里是从动画开始到结束的时间
  • transition.ease( ) ⇒ 调整动画运动效果
  • transition.delay( ) ⇒ 设定动画延迟时间
  • transition.on(事件, callback) ⇒ 设定动画产生的事件
<body>
    <svg width="500" height="400" style="border: 1px solid red">
        <rect class="moveBtn" width="100" height="100" fill="red" ></rect>
    </svg>
    <button>点击移动</button>
</body>

</html>
<script>
    const rect = d3.select("rect")
    document.querySelector('button').addEventListener('click', function(){
    rect.transition()  // 开始执行动画
        .duration(1000)     // 设置动画持续时间
		.attr('transform', 'translate(200, 100)')   // 移动位置
      	.attr("fill","blue")   // 改变颜色
      	.attr('stroke-width', '0.5px')  // 添加边框
        .attr('stroke', 'black')    // 边框颜色
})
</script>

33.gif

transition.delay( )  设置延迟
<body>
    <svg width="500" height="400" style="border: 1px solid red">

    </svg>
    <button>点击移动</button>
</body>

</html>
<script>
    const dataDelay = [10, 30, 50, 70, 90, 110]
    const delay = d3.select('svg')
        .selectAll('circle')
        .data(dataDelay)  
        .enter()
        .append('circle')
        .attr('cx', d => d)
        .attr('cy', 30)
        .attr('r', 10)
        .attr('fill', 'blue')
        .attr('opacity', '0.5')
	// 绘制出对应的圆形
    document.querySelector('button').addEventListener('click', function () {
        delay.transition()
            .delay((d, i) => i * 200)   // 设置出对应的延时时间
            .attr('cx', d => d + 200)    // 设置位移的距离
    })
</script>

11.gif

.ease( ) 动画效果

transition.ease( ) 的参数必须是一个方法,用来设定动画每一帧的时长,借此达到不同的动画效果。

d3.easeBack、d3.easeBackIn、d3.easeBackInOut、d3.easeBackOut d3.easeBounce、d3.easeBounceIn、d3.easeBounceInOut、d3.easeBounceOut d3.easeCircle、d3.easeCircleIn、d3.easeCircleInOut、d3.easeCircleOut d3.easeCubic、d3.easeCubicIn、d3.easeCubicInOut、d3.easeCubicOut d3.easeElastic、d3.easeElasticIn、d3.easeElasticInOut、d3.easeElasticOut d3.easeExp、d3.easeExpIn、d3.easeExpInOut、d3.easeExpOut d3.easeLinear d3.easePoly、d3.easePolyIn、d3.easePolyInOut、d3.easePolyOut d3.easeQuad、d3.easeQuadIn、d3.easeQuadInOut、d3.easeQuadOut d3.easeSin、d3.easeSinIn、d3.easeSinInOut、d3.easeSinOut

<body>
    <svg width="500" height="400" style="border: 1px solid red">

    </svg>
    <button>点击移动</button>
</body>

</html>
<script>
    const rect = d3.select('svg')
        .append("rect")
        .attr('width', 100)
        .attr('height', 130)
        .attr('fill',"red")
    document.querySelector('button').addEventListener('click', function () {
        rect.transition()
            .ease(d3.easeBack)   // 可以使用不同的效果完成动画
            .attr("fill","blue")
    })
</script>

transition.on( ) 动画的生命周期

  • start ⇒ 动画开始时
  • end ⇒ 动画结束时
  • interrupt ⇒ 动画被中断
  • cancel ⇒ 动画被取消
使用动画完成无线循环动画
<body>
    <svg width="500" height="400" style="border: 1px solid red">

    </svg>
    <button>点击移动</button>
</body>

</html>
<script>
	// 设置向右侧移动
    const goright = function () {
        d3.active(this)   // 这里的this是取到的rect这个元素
            .attr('x', 200)
            .transition()
            .on("start", goLeft);
    }
    // 设置向左侧移动 回到原点
    const goLeft = function () {
        d3.active(this)   // 这里的this是取到的rect这个元素
            .attr('x', 0)
            .transition()
            .on("start", goright);
    }
    // 添加矩形元素
    const rect = d3.select('svg')
        .append("rect")
        .attr('width', 100)
        .attr('height', 100)
        .attr('fill', "red")

    document.querySelector('button').addEventListener('click', function () {
        rect.transition()  // 执行动画
            .duration(1000)
            .on('start', goright)
    })

</script>

22.gif