- From: Glen Huang <curvedmark@gmail.com>
- Date: Mon, 29 Jun 2015 16:55:51 +0800
- To: Brian Birtles <bbirtles@mozilla.com>
- Cc: public-fx@w3.org
Thank you for the detailed explanation. I think i have a better understanding on how to use web-animations now. > On Jun 29, 2015, at 9:42 AM, Brian Birtles <bbirtles@mozilla.com> wrote: > > Hi Glen, > > Sorry, I'm just now catching up on your feedback. > > On 2015/06/25 20:58, Glen Huang wrote: >> Also curious about two things: >> >> 1. Is zero duration, forwards filled, single keyframe effect valid and >> fills with the keyframe?; >> ``` >> new KeyframeEffect(el, {position: "static"}, {fill: "forwards"}) // is >> el's position static after the effect is played? >> ``` > > Yes, that's correct. > >> 2. Are partial keyframes valid and properties specified in a keyframe >> extends to the next one? >> ``` >> el.style.position = "static"; >> new KeyframeEffect(el, [{ >> position: "absolute", >> prop: val1 >> }, { >> // is position absolute in this keyframe? >> prop: val2 >> }], {duration: 1000, fill: "forwards"}) >> ``` > > Yes, partial keyframes are valid. The defined behavior here is: > > * Since there is no keyframe at offset 1 for 'position', one will be created with the 'neutral composition value' and 'composite: add'.[1] > * The neutral composition value is some value that, when added to the underlying value, produces the underlying value.[2] So in this case it's going to be some kind of null-like value (that, in this case, will evaluate to 'static' when we add it to 'static'). > > As a result, this should interpolate from 'position: absolute' to 'position: static'. > > Best regards, > > Brian > > [1] http://w3c.github.io/web-animations/#the-effect-value-of-a-keyframe-animation-effect, step 8 > [2] http://w3c.github.io/web-animations/#neutral-value-for-composition > >> Thanks. >> >>> On Jun 22, 2015, at 6:21 PM, Shane Stephens <shans@google.com >>> <mailto:shans@google.com>> wrote: >>> >>> On Tue, Jun 16, 2015 at 7:07 PM Glen Huang <curvedmark@gmail.com >>> <mailto:curvedmark@gmail.com>> wrote: >>> >>> The conversation unfortunately died. >>> >>> Maybe the use cases aren't compelling enough. That's totally fine. >>> The only question I have is that in the responding mail, you said >>> >>>> You can do this with closures too. Just toggle the class in the >>>> classList. >>> >>> But I don't think I can. >>> >>> Your original suggestion was that I should negate styles in the >>> keyframes, and since the effect is only backwards filled, those >>> negations will go aways when the effect is no longer active. >>> >>> Now, by toggling class I assume you mean I should put these >>> negations inside a class and enable that class when closure is >>> called? But now when the effect is no longer active, the class >>> won't be removed automatically. So when do I remove it manually? >>> There is no hook in the effect to notify me when the effect is no >>> longer active. >>> >>> >>> Basically, you set your final state in CSS then override using the >>> animation. For example, before the animation starts you set: >>> navBar.style['justify-content'] = "space-between"; >>> >>> Then in your animation, you "animate" justify-content from "center" to >>> "center". It holds that value while it fills forwards. >>> >>> When the animation is done, use the onfinish hook to cancel it, and >>> the value stops applying, falling back to the final state you've set >>> up in CSS. >>> >>> I have another use case that could be covered by this hook: when >>> multiple effects are nested, I want some of them to fill forwards, >>> but others to fill forwards until the root effect is no longer >>> active. With this hook, I can change the nested effect's fill to >>> none in the hook of the root effect. >>> >>> >>> Again though this is using events to set the visual state, which you >>> really shouldn't do. Instead, this sounds like some kind of advanced >>> groups case - given that we haven't nailed down basic groups yet I >>> think it's probably a way off before we consider looking at it. >>> >>> You can in general get a mixture of fill effects by refactoring your >>> groups appropriately. This doesn't give you everything but it gets you >>> a long way. >>> >>> Cheers, >>> -Shane >>> >>> >>> So the question is, since such hook doesn't exist, is there any >>> other way to achieve the things I described? >>> >>> >>> In general - yeah, though some of them may be difficult. Another >>> question, though, is 'does this hook fit with the realities of >>> animation' - sadly the answer here is no, because it's impossible for >>> us to give you an event callback in which it's safe to modify visual >>> state. >>> >>> Cheers, >>> -Shane >>> >>> >>> Thank you very much. >>> >>>> On May 27, 2015, at 3:24 PM, Shane Stephens <shans@google.com >>>> <mailto:shans@google.com>> wrote: >>>> >>>> Hi Glen, >>>> >>>> >>>> >>>> On Wed, May 27, 2015 at 5:09 PM Glen Huang <curvedmark@gmail.com >>>> <mailto:curvedmark@gmail.com>> wrote: >>>> >>>> Hi, I recently tried to manage very complex animation, and >>>> realized I need this feature: >>>> >>>> When animations fire ready and finish events, they first >>>> bubble into to the associated effects, if effects have >>>> nesting children, recursively bubble into them, after that, >>>> bubble back to animations, much like how dom events work. >>>> >>>> Do you think it makes sense? >>>> >>>> >>>> I think it sounds complicated, and it doesn't match the intention >>>> of events well. If you have some specific examples where you want >>>> this behavior, perhaps we can work through them with you? >>>> >>>> My use case is like this: >>>> >>>> There are many components in a page. Each different >>>> combinations of them can chain together to create an >>>> animation. To make things manageable, I design the components >>>> so that they can each return effects pertaining to its part >>>> in different animation sequences. And when a particular >>>> animation is required, I select the corresponding components >>>> and their corresponding effects, composite these effects and >>>> play it. >>>> >>>> The difficulty is that each components now only has control >>>> for its turn in the animation, but sometimes it needs to >>>> change styles after/before the whole animation sequence >>>> (e.g., pull itself out of flow before/after the animation). >>>> >>>> >>>> You must be walking your component list to generate these >>>> animation effects. Why not generate closures for what you need to >>>> do before the animation sequence starts while walking the list, >>>> then apply them centrally when you start the animation? >>>> >>>> With the proposed API, it's as simple as changing styles in >>>> the corresponding event hooks. >>>> >>>> >>>> Yes, but at the cost of a great deal of complexity in the >>>> implementation. You're also assuming synchronous events (more on >>>> this below). >>>> >>>> However, Shane suggested an alternative solution: before the >>>> animation starts, change each component's styles to the >>>> desired final value, and use backwards filled effect to >>>> negate the styles before animating. >>>> >>>> I think it's a nice solution, but there are a few problems: >>>> >>>> * While returning effects, components' methods need to >>>> add/remove styles. You can't embed these actions into the >>>> effect itself. This means the effect must be played in >>>> the next tick after they are created, which isn't always >>>> feasible. >>>> >>>> Store the effect update in a closure, and run the closure from >>>> the same function that plays the animation. >>>> >>>> * This solution requires you to always put the component in >>>> the final styles first, but sometimes the component is >>>> easier to animate upon the current styles, and only >>>> change to the final styles after the animation is finished. >>>> >>>> Given that additive animation is not yet implemented I can't >>>> understand why this would be true. >>>> >>>> * Negating the styles can be difficult, especially vendor >>>> prefixes are involved. With event hooks, you can use >>>> temporary classes to negate the styles, relying on tools >>>> like autoprefixer to deal with vendor prefixes. >>>> >>>> You can do this with closures too. Just toggle the class in the >>>> classList. >>>> >>>> So, in summary, i think bubbling events to effects should >>>> make managing complex animation much easier, and would like >>>> to hear your thoughts on this. >>>> >>>> P.S. In order to make these event hooks practical, I think we >>>> should force that the two events should fire in the same >>>> event loop as that of the first/last frame. In other words, >>>> for example, changing styles in the finish event of a >>>> non-forwards filled effect shouldn't cause FOUC. >>>> >>>> >>>> We considered and rejected synchronous events some time back. >>>> It's impossible to synchronize with the compositor thread. >>>> >>>> In general, you should not be making visual changes in event >>>> handlers. They can never be genuinely frame-aligned, so doing so >>>> is just going to be setting yourself up for FOUC or inconsistent >>>> behaviors between browsers. >>>> >>>> Cheers, >>>> -Shane >>>> >>>> Thank you. >>>> >>> >> >
Received on Monday, 29 June 2015 08:56:48 UTC