- From: L. David Baron <dbaron@dbaron.org>
- Date: Mon, 18 Mar 2013 15:51:45 -0700
- To: www-style@w3.org
This is a followup to the discussion in
http://lists.w3.org/Archives/Public/www-style/2013Feb/0385.html
about the interaction of animations and transitions in the cascade.
I met with smfr, dino, hober, and sylvaing a few weeks ago (on
2013-02-22) to discuss this issue further, and I wanted to describe
some of the results of that discussion (which was still
inconclusive, although I think we made a bunch of progress).
There are really two questions that are closely tied together:
How transitions and animations interact in the cascade.
How transitions are started.
Based on previous discussions in the group, we think it's important
that:
1. User !important rules for properties (e.g., color) must
override that property in the animation without preventing the
rest of the animation from running.
2. Animations should override transitions (that is, if an
animation is started while a transition is running, the
animation should win).
3. Animations and transitions of inherited properties (e.g.,
color) should work.
4. When an animation is set, it should take effect immediately,
even if there is also a transition specified or already running.
5. Changes caused by animations animating should not trigger
transitions.
Important things we want that are pretty much taken care of:
6. We don't want ridiculous numbers of transition events firing
when an inherited property (e.g., color) is transitioned. This
should be handled just fine because we we get at most one for
each element that actually has a 'transition-property' property
set on it to transition that property.
The fundamental problem we're running into is that we're having
trouble finding *any* model to describe the interaction of
animations and transitions and the starting of transitions that
satisfies points 1-6 and is also sufficiently Web-compatible. I'd
like to avoid adding any additional constraints to the problem
before we have a solution to the existing constraints. (The
Web-compatibility problem hopefully isn't that bad, since there's
quite a bit of wiggle room since implementations have very
significant disagreements. However, that wiggle-room is not
infinite.)
Some examples of things we want to be interoperable (and clearly
defined by the model in the specification) but feel like we can't
worry too much about (in other words, we'll take whatever we get
from a model that satisfies the above):
7. What happens with:
<span id="a">a <span id="b">b</span> a</span>
#a { color: green }
#a:hover { color: blue }
#a { transition: 2s color linear }
#b { transition: 10s color linear }
While we agree that the color on #a should transition over 2s,
and that we don't want the current WebKit behavior in which the
colors transition in sequence, we don't have a strong opinion on
whether #b transitions over 2s or 10s. 10s seems likely to be
easier. (Gecko does 2s, though.) Also consider the behavior
when reversing the times. (In an ideal world, we might want to
take the longer time, but we don't see how to describe a model
that produces that result.) Also consider the behavior when the
color (and :hover style) are on #a's parent.
8. What happens with this harder variant of the previous case:
<div id="a"><div id="b"><div id="c"></div></div></div>
#a { font-size: 15px }
#a:hover { font-size: 20px }
#b { transition: font-size: 5s }
#c { width: 10em; transition: width 3s; }
#a:hover > #b > #c { width: 20em }
When #a goes into the :hover state, ignoring transitions, #c's
width changes due to two different reasonso
9. Consider the variant of the previous case where #a's font-size
was already animating:
<div id="b"><div id="c"></div></div>
@keyframes fs { from { font-size: 15px } to { font-size: 20px } }
#b { animation: font-size infinite alternate 2s linear }
#c { width: 10em; transition: width 3s }
#c:hover { width: 20em }
When #c goes into the hover state, does the animation of width
(a) not run (b) run but jump at the end to update to the current
state of the animation or (c) run without jumping? We couldn't
find a model that describes (c) without a lot of complexity.
We'd probably prefer (a) but don't prefer it enough over (b) to
impose significant performance constraints on implementations.
So here's an outline of a proposed model that I'd like to try
implementing (and thus test for Web-compatibility) that I think
might satisfy constraints 1-6:
A. In order to prevent animations from triggering transitions, we
specify that the decision about whether to start a transition (in
response to a style change) involves not just a simple comparison
of the old computed style to the new computed style, but always
involves a comparison between styles that correspond to the same
animation times. In other words, the "old style" used in the
comparison to determine whether to start a transition is old in
the sense of not being up-to-date in terms of style changes
triggered by sources other than animations, but must be
up-to-date in terms of animations. This is the mechanism to
address requirement (5).
B. The styles from animations and transitions both fit in the
cascade between non-!important and !important rules. In other
words, the cascade is:
UA
User
HTML Presentation Hints
Author
Transitions
Animations
Author !important
User !important
UA !important
This addresses requirements (1), (2), and (4), but then requires
that we explain how transitions start in a way that satisfies
requirement (3).
C. Determining when transitions start involves a comparison that is
(logically, at least, though not necessarily in terms of
implementation) comparing the "old" computed style for the entire
document with the "new" computed style for the entire document,
where "old" and "new" are as defined in point (A) above. This
means that when an inherited property changes dynamically, it is
possible to start more than one transition at the same time if
'transition-property' is specified on both an ancestor and
descendant for that property. Such transitions will execute
simultaneously; if the descendant transition finishes first, the
element will end up inheriting the ancestor's transition. While
this is not necessarily a nice effect, it is the effect the
author requested. This is part of how point (6) is addressed.
(If we can figure out how, it might be nice to let the longer
transition win, since that seems likely to produce better
results. But I can't currently describe a model that leads to
that result.)
D. Transitioning values are inherited by descendants just like any
other values. In other words, explicit 'inherit', or for
inherited values, lack of any cascaded value on a descendant,
leads to the transitioning value being inherited. If, from (C),
there is a transition simultaneously running on the descendant,
that overrides the inherited value as any other specified value
does. This is the remainder of the explanation for how point (6)
works, and also addresses point (3) in that the result of the
transition inherits just like anything else does.
E. Transitions "run" whether or not they are overridden in the
cascade. In other words, if there is a style change that should
trigger a transition based on the model described, but it is
overriden by an animation or by an !important rule, the
transition still fires events and is still exposed to any other
APIs through which it could be detected (e.g., something
resulting from the Web Animations work).
I'd like to try implementing this proposal in Gecko if others think it's
a reasonable approach, though I can't promise to do so particularly
promptly.
I think advancing transitions past CR is going to require actually
testing our solution here to see if it's Web-compatible, but it might be
possible to move to CR at the point when we have an experimental
implementation.
Does this model seem reasonable to others?
-David
--
𝄞 L. David Baron http://dbaron.org/ 𝄂
𝄢 Mozilla http://www.mozilla.org/ 𝄂
Received on Monday, 18 March 2013 22:52:09 UTC