- From: Brian Birtles via GitHub <sysbot+gh@w3.org>
- Date: Tue, 05 Dec 2017 04:41:25 +0000
- To: public-css-archive@w3.org
_From @notoriousb1t on November 11, 2016 3:46_
I haven't figured that out yet. In Just Animate, I implemented this feature, but I haven't gotten it to work unless all keyframes have offsets specified.
http://codepen.io/notoriousb1t/pen/0a7f8478e7e7172ac9d5122bf01a5861?editors=0010
``` js
just.animate({
targets: '.box',
to: '1.6s',
css: [
{
y: '200px',
offset: .5
},
{
y: 0,
offset: [0, 1]
}
],
iterations: Infinity,
easing: 'ease'
});
```
In that example, removing the offset of .5 completely breaks it. Here is my (naive) approach that doesn't requires them to be specified for all if offset arrays are used
``` ts
/**
* copies keyframs with an offset array to separate keyframes
*
* @export
* @param {waapi.IKeyframe[]} keyframes
*/
export function expandOffsets(keyframes: ja.ICssKeyframeOptions[]): void {
const len = keyframes.length;
for (let i = len - 1; i > -1; --i) {
const keyframe = keyframes[i];
if (!isArray(keyframe.offset)) {
continue;
}
keyframes.splice(i, 1);
const offsets = keyframe.offset as number[];
const offsetLen = offsets.length;
for (let j = 0; j < offsetLen; j++) {
const newKeyframe = deepCopyObject(keyframe);
newKeyframe.offset = offsets[j];
keyframes.splice(i, 0, newKeyframe);
}
}
// resort by offset
keyframes.sort(keyframeOffsetComparer);
}
```
I do have an idea on how it could be distributed that would make sense most of the time.
- copy/move offset 0 into index 0 if it exists
- copy/move offset 1 into index length-1 if it exists
- assign index 0 to offset 0
- assign index length-1 to offset 1
- copy remaining offset arrays next to each other in order
- the remaining offsets are subdivided evenly between the known offsets
- then the keyframes are sorted by offset ascending
So:
``` js
element.animate({
keyframes: [
{ opacity: 0 },
{ opacity: 1, offset: [1, .6, .3, 0] },
{ opacity: 0 }
]
});
```
turns into
``` js
element.animate({
keyframes: [
{ opacity: 1, offset: 0 },
{ opacity: 0, offset: .15 },
{ opacity: 1, offset: .3 },
{ opacity: 1, offset: .6 },
{ opacity: 0, offset: .8 },
{ opacity: 1, offset: 1 },
]
});
```
That is kind of what I think would work if trying to respect the intent of loosely timed keyframes.
--
GitHub Notification of comment by birtles
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/2060#issuecomment-349193681 using your GitHub account
Received on Tuesday, 5 December 2017 04:41:31 UTC