- From: L. David Baron <dbaron@dbaron.org>
- Date: Tue, 12 Apr 2011 16:49:47 -0700
- To: Simon Fraser <smfr@me.com>
- Cc: "Tab Atkins Jr." <jackalmage@gmail.com>, Dean Jackson <dino@apple.com>, www-style@w3.org
On Tuesday 2011-04-12 15:16 -0700, Simon Fraser wrote: > On Apr 12, 2011, at 12:53 PM, Tab Atkins Jr. wrote: > > > On Tue, Apr 12, 2011 at 12:32 PM, L. David Baron <dbaron@dbaron.org> wrote: > >> On Tuesday 2011-04-12 11:33 -0700, Simon Fraser wrote: > >>> On Apr 12, 2011, at 10:29 AM, L. David Baron wrote: > >>>> On Tuesday 2011-04-12 08:56 -0700, Tab Atkins Jr. wrote: > >>>>> On Mon, Apr 11, 2011 at 9:09 PM, L. David Baron <dbaron@dbaron.org> wrote: > >>>>>> (Alternatively, I suppose one could check for whether the property > >>>>>> is specified in any keyframe -- though that's a bit more work.) > >>>>> > >>>>> You need to check all the keyframes. Given a keyframe like this: > >>>>> > >>>>> @keyframes wobble { > >>>>> 0% { left: 0; top: 0; } > >>>>> 33% { top: 100px; } > >>>>> 67% { top: -100px; } > >>>>> 100% { left: 100px; top: 0; } > >>>>> } > >>>>> > >>>>> In the middle third of the animation, the nearest keyframe blocks > >>>>> don't have any mention of 'left', but 'left' is still being animated. > >>>> > >>>> The spec should perhaps mention that somewhere. > >>> > >>> Agreed :) > >>> > >>>> Additionally, it should say how that behavior interacts with timing > >>>> functions specified in keyframes. > >>> > >>> In this case left animates exactly as if the middle two keyframes were missing: > >>> > >>> @keyframes wobble { > >>> 0% { left: 0; top: 0; } > >>> 100% { left: 100px; top: 0; } > >>> } > >>> > >>> If the first keyframe had a timing-function, then that's the one that would apply. > >>> > >>> In other words, properties are interpolated between the keyframes > >>> that specify them. > >> > >> This makes sense -- and seems better for authors -- but it surprises > >> me given that (a) the spec doesn't say this and (b) the spec says > >> that duplicate keyframes get dropped, which is part of what led me > >> to the model that I interpreted (and implemented) from what the spec > >> does say. > >> > >> So given this model, it seems like it would make much more sense if > >> the spec also said that duplicate keyframes weren't dropped, but > >> were instead cascaded, so that, with: > >> > >> 0% { left: 0; top: 0 } > >> 50% { top: 40px; left: 40px } > >> 50% { top: 25px; } > >> 100% { top: 100px; left: 100px } > >> > >> you'd end up with top animating according to: > >> 0% { top: 0 } > >> 50% { top: 25px } > >> 100% { top: 100px } > >> and left animating according to: > >> 0% { left: 0 } > >> 50% { left: 40px } > >> 100% { left: 100px } > >> instead of having, as the spec currently says, left animating > >> according to: > >> 0% { left: 0 } > >> 100% { left: 100px } > >> because the second 50% keyframe overrides the first. > > What's the use case for cascading keyframes? One is when you want some properties to be repeated at multiple key selectors. For example, you could traverse the edges of a square, clockwise from top left, with: 0%, 25%, 100% { top: 0 } 50%, 75% { top: 100px } 0%, 75%, 100% { left: 0 } 25%, 50% { left: 100px } rather than having to write: 0%, 100% { top: 0; left: 0 } 25% { top: 0; left: 100px } 50% { top: 100px; left: 100px } 75% { top: 100px; left: 0 } > If we allow cascading keyframes, it's not obvious that you could use separate > timing functions for different properties, since the timing-function property itself > would be affected by the cascade. That depends on how you define the cascading: if you defined it to use the last keyframe for any keyframe selector that has the property (rather than actually merging the keyframes together) you wouldn't have that problem. -David -- L. David Baron http://dbaron.org/ Mozilla Corporation http://www.mozilla.com/
Received on Wednesday, 13 April 2011 00:26:03 UTC