Skip to content

[web-animations-1] Animatable.animate() should not flush #3613

Closed
@birtles

Description

@birtles

From Mozilla bug 1524480:

It turns out that whether or not Element.animate flushes is observable (and it doesn't flush in Blink but does in Gecko and WebKit).

Suppose we have:

div {
  opacity: 0.1;
  transition: 1s opacity linear;
}

And then we do:

getComputedStyle(div).opacity;

At this point the computed opacity of div is 0.1.

Now, suppose we update the specified opacity to 0.2 but DON'T flush style:

div.style.opacity = '0.2';

Then trigger an animation on the same element:

div.animate({ opacity: [0.6, 1] }, 1000);

At this point if Element.animate() flushes style it will cause us to trigger a transition from 0.1 to 0.2.

However, if Element.animate() does NOT flush style we will:

  • Generate a new Animation animating from 0.6 to 1.
  • Then on the next restyle we will have a before-change style opacity of 0.6 (since we bring declarative animations up-to-date as part of calculating the before-change style).
  • And we we also have an after-change style of 0.6 (for the same reason).

Since the before-change style and after-change style have not changed, no transition will be generated.

Test case: https://codepen.io/birtles/pen/YBxxBd

I propose we spec that Animatable.animate() (and similarly KeyframeEffect.setKeyframes(), etc.) do not flush style (or, in CSS transitions spec terms, trigger a style change event).

The reason is that if we require UAs to flush, it would mean that Element.animate() both flushes AND dirties style. As a result, if the author triggers a number of animations in a single animation frame, the browser would be required to flush multiple times per frame.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions