- From: Brian Birtles <bbirtles@mozilla.com>
- Date: Fri, 05 Apr 2013 10:30:11 +0900
- To: "public-fx@w3.org" <public-fx@w3.org>
Web animations minutes, 4 / 5 April 2013 Etherpad: https://etherpad.mozilla.org/ep/pad/view/ro.lfR1XxRmef2/latest Present: Doug, Shane, Steve, Brian Agenda: 1. Status update 2. Keyframe effect animations / handling missing key frames 3. Keyframes specifying multiple properties 4. Shrinking the API surface area 5. F2F dates 1. STATUS UPDATE ================ Brian: - Still reworking the spec, up to events (section 27). Nearly done. Shane: - Matrix interpolation in polyfill Steve - Tweaking media integration in polyfill 2. KEYFRAME EFFECT ANIMATIONS / HANDLING MISSING KEY FRAMES =========================================================== Proposal: https://docs.google.com/document/d/13oOejOlp36U9Oc0uNUSJFUJ8ebg0g80p8O16VgxFqh8/edit In brief: Full form of a keyframe dictionary is: {offset: <number|"auto">, value: <CSS String>, composite: <"add"|"set"|"auto">} However: * composite can be left out, and defaults to "auto" * offset can be left out, and defaults to "auto" * keyframes without explicit offset or composite values can be specified as just the value string Keyframe lists are lists of keyframe dictionary values (or strings). e.g. ["50px", {offset: 0.2, value: "25px", composite: "add", "100px"] keyframes dictionaries map properties to keyframe lists, and also allow a global composite to be specified, e.g. {left: ["50px", {offset: 0.2, value: "25px", composite: "add", "100px"], composite: "set"} The global composite defaults to "set". "auto" composite implies that the global composite value is used. "auto" offset implies that the keyframe (along with any "auto" offset contiguous keyframes) will be distributed evenly in the available space. As an exception, a single keyframe with "auto" offset will always be placed at an offset of 1. QUESTION: Should we just use null for "auto" offset? > Brian to follow up with Cameron about what's better here See document for details of the compositing algorithm given a keyframe list, an underlying value, and an interpolation fraction. > Brian to work this into spec What about Path animation effects? For now add a composite operation to path animation effects. This 'global' composite operation parameter will be specified on each sub-type of animation effect--not on the superclass AnimationEffect--since there may be animation effects we add in the future for which the composite operation doesn't make sense. Steve has a concern that having a 'global' composite operation on keyframes may cause problems in the future. We'll think about this for the next few days to see if we can come up with any concrete examples of problems. In the absence of any we'll stick with the 'global' option. 3. KEYFRAMES SPECIFYING MULTIPLE PROPERTIES =========================================== (Brian) We currently have a model with a 1-to-1 correspondance between an animation effect and a target property. Reasons why: * Makes describing the compositing easier (but this is a bit of a non-issue since what you're really compositing is animation values, not the effects) -- This means you don't end up with part of an animation effect being applied and part not being applied * We want to avoid an architectural pattern where these animation effects get increasingly blobbish--i.e. if we allow a key frame animation effect to target multiple properties how long will it be before we start getting requests to add a start delay per property to animation effects? -- Looking at how CSS is used I'm not sure how big a deal this is? I'm not sure that either of those are major concerns and I think authors will find it both surprising and frustrating that you can't have multiple properties in the API even though you can in CSS. Shane: +1. In fact the polyfill transparently allows the specification of multiple values. At the moment it silently inserts a GroupAnimationEffect, but I would prefer KeyframeAnimationEffect to deal with multiple properties directly. Brian: I think we should revisit this. I'll have to rewrite the animations stuff significantly but I think it's worth it. Either this, or the ability to have multiple animation effects per Animation is necessary to support Animation ctors of the form: new Animation(elem, { left: '10px'; right: '10px' }, 5); Shane: (historical note) that is supported by the GroupAnimationEffect - i.e. we don't _need_ to change. I still think we should. Brian: And if we're to support: AnimationEffect.createFromString({ left: '10px'; right: '10px' }) It has to be this. > We all agree. Key frame animation effects will henceforth be able to target multiple properties. 4. SHRINKING THE API SURFACE AREA ================================= (Brian) I wonder if we can remove the animation effect interfaces like KeyframeAnimationEffect / PathAnimationEffect. Just make AnimationEffect an opaque class with a ctor. So you can still *make* new animation effects but passing in the appropriate property bags but you can't modify / inspect them? Shane: maybe a method to extract the property bags too so you can extract-modify-create as a poor-man's update? Brian (contd.): Or, alternatively: dictionary KeyframeParams { sequence<KeyframeValueParams> values; (double or DOMString) offset = "auto"; DOMString? timingFunction = null; }; dictionary KeyframeValueParams { DOMString property; DOMString value; // Make this any? CompositeOperation composite = "auto"; }; typedef sequence<KeyframeParams> Keyframes; [Constructor (Keyframes frames, optional AccumulateOperation accumulate = "none")] interface KeyframeAnimationEffect : AnimationEffect { Keyframes getFrames(); void setFrames(Keyframes frames); }; * setFrames is not strictly necessary -- you can just create a new KeyframeAnimationEffect to set them. In the ctor (and setFrames if it exists) still provide special wording for ECMAScript to support: { left: '100px' } { left: '100px', top: '20px' } { left: ['100px', '200px'] } { left: ['100px', '200px'], composite: 'add' } { left: ['100px', '50px', '200px'], opacity: ['0', '1', '0'] } { left: ['100px', '50px', '200px'], opacity: ['0', {offset: 0.2, value: '1'}, '0'] } (Some discussion about the last one) But when you call getFrames you always get back the normalized version, e.g. { left: ['100px', '200px'] } expands to: [ { offset: 0, values: [ { property: 'left', value: '100px', composite: 'set' } ] }, { offset: 1, values: [ { property: 'left', value: '200px', composite: 'set' } ] } ] Notes: * This proposal is doing three things at once - refactoring the keyframes interfaces to drop all the nested interfaces and just use dictionaries - adding the ability to target multiple properties per keyframe - adding the per-value composite operation So, it makes comparison a little difficult. Sorry about that. Analysis: * It's a bit more clumsy that dealing with real interfaces * Lets us drop the KeyframeList interface (which is reasonably large but fairly straightforward) * Lets us drop the Keyframe interface * We already have KeyframeDictionary (= KeyframeParams in this case) * KeyframeValueParams here is new but that's because this handles multiple target properties per key frame so we need to add this anyway * Overall the surface area is smaller by a reasonably noticeable amount * We can still add the Keyframes interfaces in a future version once we have a better idea of the needs > Notes: as an internal representation, sorting by property is probably easier (not sorting on a continuous value, no need to construct missing values). This doesn't need to impact the specification. > Lots of discussion over whether per-property or per-offset sorting is 'better' for animators. We concluded there are arguments in both directions. We could potentially measure the sparsness of properties in @keyframes rules as an indication of how suitable sorting-by-offset is. Steve is somewhat reluctant to support both representations, mainly from the perspective of reducing complexity. It's possible that there might be a nice hybrid representation that allows nesting of per-property and per-offset sorting sections within each other. Shane is going to have a think about this. This might be a problem: { left: ["0px", "50px", "200px", "300px"], opacity: [{offset: 0.33, value: "0"}] }. Since we don't want to it to be implementation whether the keyframes at ~0.33 get merged or not. Discussed providing a fixed offset min-delta to avoid. 5. F2F DATES ============ When to meet in Tokyo? 27-31 May Meeting time from here on: same time in Sydney 9am Tokyo / 10am Sydney / 5pm MTV Next meeting: Thurs Apr 11 17:00 PDT / Fri 12 Apr 10:00 AEST / Fri 12 Apr 09:00 JST @ https://etherpad.mozilla.org/KG6TnwU8a0 Past meetings: http://www.w3.org/Graphics/fx/wiki/Web_Animations/Meetings
Received on Friday, 5 April 2013 01:30:44 UTC