目前你能做的最好的就是请求动画帧。
getComputedStyle
显然返回计算属性的实时更新对象。
你可以像这样做一个基本的动画循环:
var computedStyle = getComputedStyle(element);
var animate = function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = computedStyle.color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
requestAnimationFrame(animate);
};
animate();
如果任何使用的属性发生更改,您可以通过仅更新来进行优化:
var computedStyle = getComputedStyle(element);
var lastFrameBackground;
var lastFrameColor;
var animate = function () {
if (
computedStyle.background !== lastFrameBackground ||
computedStyle.color !== lastFrameColor
) {
lastFrameBackground = computedStyle.background;
lastFrameColor = computedStyle.color;
// assuming expensive drawing code here
// not like this!
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = computedStyle.color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
requestAnimationFrame(animate);
};
animate();
如果是针对特定的 CSS 动画,您可以通过侦听和来管理requestAnimationFrame
循环,或者如果这些事件没有足够好的浏览器支持,您可以在知道动画将开始(例如for )和停止时将其启动当动画属性的计算值停止变化时(即,如果它等于其先前的值,则不调用)。animationstart
animationend
mouseenter
:hover
requestAnimationFrame
如果您不需要平滑地制作动画,则可以使用setInterval
可能更好的性能(检查文档是否隐藏,这requestAnimationFrame
会隐式执行):
var computedStyle = getComputedStyle(element);
setInterval(function () {
if (!document.hidden) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = computedStyle.color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
}, 200);