如何在cytoscape.js中实现边的行军蚁循环动画并指向目标节点
你当前的代码无法循环动画的核心原因是:cytoscape.js的动画默认是从元素当前的属性值过渡到目标值,第一次动画执行完后,边的line-dash-offset已经固定为24,后续递归触发的动画都是从24过渡到24,没有数值变化自然不会产生动画效果。同时你设置的line-dash-pattern总长度为12(8+4),offset只需要变化12个单位就能完成一个完整的虚线周期,设置为24属于冗余配置。
最优修复方案(使用内置循环参数,无需手动递归)
样式配置保持原有设置即可:
{ selector: "edge", style: { "curve-style": "taxi", width: 2, "target-arrow-shape": "triangle", "target-arrow-color": "#9dbaea", "line-style": "dashed", "line-dash-pattern": [8, 4], } }
动画代码简化为:
// 直接调用animation的loop参数实现无缝循环 cy.edges().animation({ style: { "line-dash-offset": 12 // 等于dash pattern总长度,刚好完成一个周期位移 }, duration: 1000, loop: true // 内置循环参数,自动重置属性实现无缝衔接 }).play();
如果需要调整动画流动方向:把line-dash-offset的目标值改为-12,动画就会朝向源节点流动。
兼容递归写法的修复方案
如果你需要保留递归逻辑做自定义扩展,需要在每次动画结束后手动重置line-dash-offset到初始值:
let loopAnimation = eles => { eles.animation( { style: { "line-dash-offset": 12, } }, { duration: 1000 } ).play().promise('complete').then(() => { eles.style('line-dash-offset', 0) // 重置offset到初始值 loopAnimation(eles) }) }; cy.edges().forEach(loopAnimation);
最终实现效果:

内容的提问来源于stack exchange,提问作者Kevin King
相关产品推荐
相关产品推荐

