如何在D3火焰图中禁用初始加载动画并关联相关方法?
D3火焰图:动画开关+过渡方法整合实现
实现要点
- 用简单的布尔变量
animate一键控制初始加载动画的开启/关闭 - 把
transition()、duration()、interrupt()串起来,解决动画冲突问题
修改后的完整代码
<html> <head> <link rel="stylesheet" type="text/css" href="${flcss}" /> </head> <body> <div id="chart"></div> <script type="text/javascript" src="https://d3js.org/d3.v7.js"></script> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/d3-flame-graph@4.1.3/dist/d3-flamegraph.min.js" ></script> <script type="text/javascript"> // 动画总开关:false=禁用初始加载动画,true=启用 const animate = false; const chart = flamegraph().width(960); d3.json("${json_file}") .then((data) => { const chartContainer = d3.select("#chart"); // 先中断所有未完成的动画,防止新旧动画叠加乱跳 chartContainer.interrupt(); if (animate) { // 开启动画:给渲染加过渡效果,设置动画时长 chartContainer .datum(data) .transition() .duration(750) // 动画持续750毫秒,可按需调整 .call(chart); } else { // 禁用动画:直接渲染,没有过渡效果 chartContainer .datum(data) .call(chart); } }) .catch((error) => { console.warn(error); }); // 后续更新数据也能复用这套逻辑 function updateChart(newData) { const chartContainer = d3.select("#chart"); chartContainer.interrupt(); if (animate) { chartContainer .datum(newData) .transition() .duration(750) .call(chart); } else { chartContainer.datum(newData).call(chart); } } </script> </body> </html>
关键逻辑说明
animate开关:只要改这个变量的true/false,就能快速控制所有过渡动画,不用改多处代码interrupt()的作用:每次渲染前先停掉之前没跑完的动画,避免多次触发时动画堆在一起,导致图表显示异常transition()+duration()组合:开启动画时,通过这两个方法给图表渲染加上平滑过渡,duration()里的数值决定动画快慢- 无动画分支:关动画时直接调用图表渲染,跳过过渡步骤,实现瞬间加载的效果
内容的提问来源于stack exchange,提问作者Goky
相关产品推荐
相关产品推荐

