- 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