- From: James Robinson <jamesr@google.com>
- Date: Tue, 17 Apr 2012 18:32:28 -0700
- To: Boris Zbarsky <bzbarsky@mit.edu>
- Cc: "Tab Atkins Jr." <jackalmage@gmail.com>, Sylvain Galineau <sylvaing@microsoft.com>, "www-style@w3.org" <www-style@w3.org>
- Message-ID: <CAD73mdK0K1sXZ3+8nuaX328xGd6urEmRjayawVmeNJa-QXLvcw@mail.gmail.com>
On Tue, Apr 17, 2012 at 5:22 PM, Boris Zbarsky <bzbarsky@mit.edu> wrote:
> On 4/17/12 7:40 PM, James Robinson wrote:
>
>> Have you had a chance to think about this yet?
>>
>
> Somewhat.
>
> If I remember the context here, the proposal was effectively some sort of
> synchronization barrier after every single inline style set or something.
> That doesn't seem very feasible to me, honestly, and I think I said so at
> the time....
>
>
I don't think my proposal is nearly that heavyweight. Here it is again,
see http://lists.w3.org/Archives/Public/www-style/2012Jan/0816.html for the
fuller context:
Whenever the browser notices a change in the computed style of a property
that would result in an animation/transition, it queues a task. When the
task runs, it checks if a CSS box exists for that element and if the
computed value is something that triggers an animation/transition. Then
and only then would the animation/transition actually start - all start
events fire, :animating/:transition pseudo-classes start matching, etc etc.
If the element doesn't have a CSS box when the task runs, or if the
computed style has changed back such that the animation/transition would be
a no-op, then the animation/transition silently does not happen.
The advantage of doing this off a task is that the only work that needs to
happen if/when the browser flushes styles is queueing a task. The behavior
is still somewhat racy in the sense that the author can race setTimeout()s
against the task and have the animation/transition start or not depending
on who wins the race, but I don't think that is any different from any
other setTimeout()-based wackiness.
Concretely with this proposal in Sylvain's example the transition would not
occur in either of the scenarios he mentions:
e.style.color = "blue";
e.style.display = "block";
e.style.display = "block";
e.style.color = "blue";
or in this slightly trickier one:
e.style.color = "blue";
document.body.offsetTop; // forces a style flush, at least in WebKit
e.style.display = "none";
This also means that the following would always return false:
<style>
#e:transitioning { background-color: green }
</style>
<script>
function checkForTransitionInSameScriptBlock() {
e.style.color = "blue";
return getComputedStyle(e).backgroundColor == "green"; // or rgb(0, 255,
0) or however it's supposed to serialize
}
</script>
If the style flush happens totally asynchronously with respect to script,
say at requestAnimationFrame time, the browser can go ahead and start the
animation/transition right then and there since there won't be any
script-observable difference in behavior between that and queuing a
separate task.
- James
> I agree that this causes issues with transitions. I don't really know
> what we can do about that: the triggering mechanism for transitions is
> fundamentally broken for a lot of things people seem to want to do with
> them. :(
>
> -Boris
>
Received on Wednesday, 18 April 2012 01:32:57 UTC