- From: L. David Baron <dbaron@dbaron.org>
- Date: Fri, 8 Aug 2014 21:18:28 -0700
- To: Sylvain Galineau <galineau@adobe.com>
- Cc: "<www-style@w3.org>" <www-style@w3.org>
- Message-ID: <20140809041828.GA30737@crum.dbaron.org>
On Friday 2014-08-08 17:07 +0000, Sylvain Galineau wrote: > We know css-animations interpolate the computed value of the properties being animated. We want to clarify how the animating values are computed when they depend on the value of another property. (We will cover the application of non-animatable properties separately) [...] > Though the discussion was somewhat confusing - on the phone, timelines are hard - I think we covered these three approaches: So after the call, I actually tried to divide things out into seven possible approaches. I had lettered mine as A-G, for what base values are used to find the computed value of an animating property: A) Base values are static values only. Between options (A) and (B) this example: @animation a { from { font-size: 20px; text-indent: 1em } } div { font-size: 10px; animation: a linear 1s } changes from animating text-indent from 10px (A) to doing so from 20px (B). B) Base values are static values plus other values in same keyframe rule. Between options (B) and (C) this example: @animation a { from { font-size: 20px } from { text-indent: 1em } } div { font-size: 10px; animation: a linear 1s } changes from animating text-indent from 10px (B) to doing so from 20px (C). C) Base values are static values plus other values in all keyframe rules in this @keyframes rule at same time. Between options (C) and (D) this example: @animation a { from { font-size: 20px } 50% { text-indent: 1em } to { font-size: 40px } } div { font-size: 10px; animation: a linear 1s } changes its text-indent at the 50% time from 10px (C) to 30px (D). D) base values are static values plus interpolated values from this @keyframes rule. Between options (D) and (E) this example: @animation a { from { font-size: 20px } to { font-size: 40px } } @animation b { 50% { text-indent: 1em } } div { font-size: 10px; animation: a linear 1s, b linear 1s; } changes its text-indent at the 50% time from 10px (D) to 30px (E). E) base values are static values at animation start time plus interpolated values from animations underneath this one (in cascading order) and this one, on the element to which this animation applies Between options (E) and (F) the example from the (D)-(E) change modified to use the style with the animation property in the reverse order: div { font-size: 10px; animation: b linear 1s, a linear 1s; } makes the same change. F) base values are static values inherited from other elements at animation start time plus interpolated values from all animations, both under and over this one, on this element Between options (F) and (G) this example: @animation a { from { font-size: 20px } to { font-size: 40px } } @animation b { 50% { text-indent: 1em } } div { font-size: 10px; animation: a linear 1s; } div > * { animation: b linear 1s } changes the div's child's text-indent at the 50% time from 10px (F) to 30px (G). G) base values are interpolated values from all animations on this element and on all elements on which its computed values depend Our options A are the same. I'm not sure if your option B is my F or my G. I'm not sure if your option C is my B, my C, or my D. Then there's a sub-choice for options E and F and G: α) base values are static (i.e., chosen based on the animations known to apply at a certain future time when this animation is started) β) base values are dynamic (i.e., if the expected value at a future time changes the running animation changes to match) (Note that we already chose static for the implicit 0% and 100% keyframes, I believe.) I agree that F or G does sound nice. But it has a bunch of complexity, with either variant α or β, particularly once repeating animations are considered. With variant α (static), it requires storing at the time the animation starts the data needed to compute a potentially infinite sequence of future values for a repeating animation whose base values are going to be changing over time. The worst cases involve multiple repeating animations running at durations that do not have a common integer multiple. With variant β (dynamic), at least for (F) and (G), although not necessarily (E), requires in at least some cases calculating the base values for every tick of the animation, since the dependency order for computed values between different properties (which does, we believe, have a noncyclic dependency graph) need not match the cascading order of the animations. (For (F), it's possible this might not be needed now, but would suddenly be needed if we introduced a unit in which line-heights could be used as a measurement unit, since that could introduce quadratic animations with the font-size -> line-height -> other length dependency. For (G), this complexity is clearly a problem now just based on inheriting font-size animations between enough elements forming at least any a * t^n + b function, for time t, constants a and b, and integer constant n.) I would not want to commit to (E), (F), or (G) without somebody having implementation experience handling both the repeating animations issue and handling sending such animations to be run on the compositor. And as I said in the telecon [1], I think this issue is complicated. -David [1] http://lists.w3.org/Archives/Public/www-style/2014Jul/0617.html -- 𝄞 L. David Baron http://dbaron.org/ 𝄂 𝄢 Mozilla https://www.mozilla.org/ 𝄂 Before I built a wall I'd ask to know What I was walling in or walling out, And to whom I was like to give offense. - Robert Frost, Mending Wall (1914)
Received on Saturday, 9 August 2014 04:20:56 UTC