【发布时间】:2018-05-24 08:13:48
【问题描述】:
我有一个使用 d3 显示的帐户余额值。每一秒,该值都会更新,根据是增加还是减少,我希望它分别闪烁绿色或红色。我有两个处理 flash 的 css 动画,每个都由一个可以添加到元素的修饰符类控制,例如 -increase 或 -decrease。
我正在使用 d3 的 classed 来控制这些类,但这就是我遇到一些问题的地方。每个更新循环,我检查并删除这两个类,然后有条件地重新添加适当的类以触发新动画。问题是,如果类与上一个循环保持相同,它不会被删除并再次添加,因此当类更改时触发器上的动画。我怎样才能让这些动画每次都触发?
function refreshBalance(accounts){
let sum = 0;
for(let i=0; i < accounts.length; i++){
sum = sum + (accounts[i].value * accounts[i].rate);
}
let balance = d3.select(".balance").select(".currency-value");
let diff;
if ((sum - balance.attr("data-balance")) > 0){
diff = "increment";
} else {
diff = "decrement";
}
balance.attr("data-balance", normalizeCurrency(sum, 4, 4))
.text(normalizeCurrency(sum, 4, 4));
balance.classed("-increment", false);
balance.classed("-decrement", false);
balance.classed("-increment", diff === "increment");
balance.classed("-decrement", diff === "decrement");
}
【问题讨论】:
-
我怀疑您在删除类和添加它们之间需要一些延迟,或者至少删除和添加类操作需要单独进行。尝试将后两个
-increment和-decrement操作包装在setTimeout中(尽管可能有一种更符合 d3 习惯的方式)。 -
您也可以在过渡动画结束后使用延迟来删除
-increment和-decrement类。无论如何,如果添加和删除类的操作发生在同一个事件周期中,浏览器将不会知道该类实际上已更改,如果它恰好将类设置为与以前相同的值。
标签: javascript css animation d3.js transition