-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathweb-animation-declarative.js
104 lines (95 loc) · 3.54 KB
/
web-animation-declarative.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* Copyright 2012 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function attrAsNumber(element, attribute, defaultValue) {
if (element.hasAttribute(attribute)) {
return Number(element.getAttribute(attribute));
}
return defaultValue;
}
function attrAsText(element, attribute, defaultValue) {
if (element.hasAttribute(attribute)) {
return element.getAttribute(attribute);
}
return defaultValue;
}
function attrAsPixelValue(element, attribute, defaultValue) {
if (element.hasAttribute(attribute)) {
var s = element.getAttribute(attribute);
return Number(s.substring(0, s.length - 2));
}
return defaultValue;
}
function resolveAnimProperties(elem) {
var prop = attrAsText(elem, "prop");
var from = attrAsText(elem, "from");
var to = attrAsText(elem, "to");
var result = {}
result[prop] = [from, to];
return result;
}
function resolveTimingProperties(elem) {
var startDelay = attrAsNumber(elem, "startDelay");
var duration = attrAsNumber(elem, "duration");
var iterationCount = attrAsNumber(elem, "iterationCount", 1);
var iterationStart = attrAsNumber(elem, "iterationStart", 0);
var fill = attrAsText(elem, "fill");
var playbackRate = attrAsNumber(elem, "playbackRate");
var startTime = attrAsNumber(elem, "startTime");
var direction = attrAsText(elem, "direction");
var resolutionStrategy = attrAsText(elem, "resolutionStrategy");
var name = elem.id;
return {startDelay: startDelay, duration: duration, iterationCount: iterationCount, iterationStart: iterationStart,
fill: fill, playbackRate: playbackRate, direction: direction, startTime: startTime, resolutionStrategy: resolutionStrategy, name: name};
}
function instantiateElem(elem) {
var animFunc = resolveAnimProperties(elem);
var timing = resolveTimingProperties(elem);
if (elem.tagName == "ANIMATION") {
elem.template = new AnimTemplate(animFunc, timing, timing.resolutionStrategy);
} else if (elem.tagName == "PAR") {
elem.template = new ParAnimGroupTemplate([], timing, timing.resolutionStrategy);
} else {
elem.template = new SeqAnimGroupTemplate([], timing, timing.resolutionStrategy);
}
return timing.startTime;
}
var animations = document.querySelectorAll("animation");
for (var i = 0; i < animations.length; i++) {
var animation = animations[i];
if (animation.parentElement.tagName == "SEQ" || animation.parentElement.tagName == "PAR") {
continue;
}
var startTime = instantiateElem(animation);
animation.template.animateLive(animation.parentElement, startTime);
}
function instantiateTree(elem) {
var startTime = instantiateElem(elem);
for (var i = 0; i < elem.children.length; i++) {
instantiateTree(elem.children[i]);
elem.template.add(elem.children[i].template);
}
return startTime;
}
var groups = document.querySelectorAll("seq, par");
for (var i = 0; i < groups.length; i++) {
var group = groups[i];
if (group.parentElement.tagName == "SEQ" || group.parentElement.tagName == "PAR") {
continue;
}
var startTime = instantiateTree(group);
group.template.animateLive(group.parentElement, startTime);
}
maybeRestartAnimation();