OLD | NEW |
(Empty) | |
| 1 <!-- |
| 2 Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
| 3 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt |
| 4 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| 5 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt |
| 6 Code distributed by Google as part of the polymer project is also |
| 7 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt |
| 8 --> |
| 9 |
| 10 <link rel="import" href="../polymer/polymer.html"> |
| 11 <link rel="import" href="core-animation.html"> |
| 12 |
| 13 <!-- |
| 14 @group Polymer Core Elements |
| 15 |
| 16 `core-animation-group` combines `core-animation` or `core-animation-group` eleme
nts to |
| 17 create a grouped web animation. The group may be parallel (type is `par`) or seq
uential |
| 18 (type is `seq`). Parallel groups play all the children elements simultaneously,
and |
| 19 sequential groups play the children one after another. |
| 20 |
| 21 Example of an animation group to rotate and then fade an element: |
| 22 |
| 23 <core-animation-group type="seq"> |
| 24 <core-animation id="fadeout" duration="500"> |
| 25 <core-animation-keyframe> |
| 26 <core-animation-prop name="transform" value="rotate(0deg)"></core-anim
ation-prop> |
| 27 <core-animation-prop name="transform" value="rotate(45deg)"></core-ani
mation-prop> |
| 28 </core-animation-keyframe> |
| 29 </core-animation> |
| 30 <core-animation id="fadeout" duration="500"> |
| 31 <core-animation-keyframe> |
| 32 <core-animation-prop name="opacity" value="1"></core-animation-prop> |
| 33 </core-animation-keyframe> |
| 34 <core-animation-keyframe> |
| 35 <core-animation-prop name="opacity" value="0"></core-animation-prop> |
| 36 </core-animation-keyframe> |
| 37 </core-animation> |
| 38 </core-animation-group> |
| 39 |
| 40 @element core-animation-group |
| 41 @status beta |
| 42 @homepage github.io |
| 43 --> |
| 44 <polymer-element name="core-animation-group" constructor="CoreAnimationGroup" ex
tends="core-animation" attributes="type"> |
| 45 <script> |
| 46 (function() { |
| 47 |
| 48 var ANIMATION_GROUPS = { |
| 49 'par': AnimationGroup, |
| 50 'seq': AnimationSequence |
| 51 }; |
| 52 |
| 53 Polymer({ |
| 54 |
| 55 publish: { |
| 56 /** |
| 57 * If target is set, any children without a target will be assigned th
e group's |
| 58 * target when this property is set. |
| 59 * |
| 60 * @property target |
| 61 * @type HTMLElement|Node|Array|Array<HTMLElement|Node> |
| 62 */ |
| 63 |
| 64 /** |
| 65 * For a `core-animation-group`, a duration of "auto" means the durati
on should |
| 66 * be the specified duration of its children. If set to anything other
than |
| 67 * "auto", any children without a set duration will be assigned the gr
oup's duration. |
| 68 * |
| 69 * @property duration |
| 70 * @type number |
| 71 * @default "auto" |
| 72 */ |
| 73 duration: {value: 'auto', reflect: true}, |
| 74 |
| 75 /** |
| 76 * The type of the animation group. 'par' creates a parallel group and
'seq' creates |
| 77 * a sequential group. |
| 78 * |
| 79 * @property type |
| 80 * @type String |
| 81 * @default 'par' |
| 82 */ |
| 83 type: {value: 'par', reflect: true} |
| 84 }, |
| 85 |
| 86 typeChanged: function() { |
| 87 this.apply(); |
| 88 }, |
| 89 |
| 90 targetChanged: function() { |
| 91 // Only propagate target to children animations if it's defined. |
| 92 if (this.target) { |
| 93 this.doOnChildren(function(c) { |
| 94 c.target = this.target; |
| 95 }.bind(this)); |
| 96 } |
| 97 }, |
| 98 |
| 99 durationChanged: function() { |
| 100 if (this.duration && this.duration !== 'auto') { |
| 101 this.doOnChildren(function(c) { |
| 102 // Propagate to children that is not a group and has no |
| 103 // duration specified. |
| 104 if (!c.type && (!c.duration || c.duration === 'auto')) { |
| 105 c.duration = this.duration; |
| 106 } |
| 107 }.bind(this)); |
| 108 } |
| 109 }, |
| 110 |
| 111 doOnChildren: function(inFn) { |
| 112 var children = this.children; |
| 113 if (!children.length) { |
| 114 children = this.shadowRoot ? this.shadowRoot.childNodes : []; |
| 115 } |
| 116 Array.prototype.forEach.call(children, function(c) { |
| 117 // TODO <template> in the way |
| 118 c.apply && inFn(c); |
| 119 }, this); |
| 120 }, |
| 121 |
| 122 makeAnimation: function() { |
| 123 return new ANIMATION_GROUPS[this.type](this.childAnimations, this.timi
ngProps); |
| 124 }, |
| 125 |
| 126 hasTarget: function() { |
| 127 var ht = this.target !== null; |
| 128 if (!ht) { |
| 129 this.doOnChildren(function(c) { |
| 130 ht = ht || c.hasTarget(); |
| 131 }.bind(this)); |
| 132 } |
| 133 return ht; |
| 134 }, |
| 135 |
| 136 apply: function() { |
| 137 // Propagate target and duration to child animations first. |
| 138 this.durationChanged(); |
| 139 this.targetChanged(); |
| 140 this.doOnChildren(function(c) { |
| 141 c.apply(); |
| 142 }); |
| 143 return this.super(); |
| 144 }, |
| 145 |
| 146 get childAnimationElements() { |
| 147 var list = []; |
| 148 this.doOnChildren(function(c) { |
| 149 if (c.makeAnimation) { |
| 150 list.push(c); |
| 151 } |
| 152 }); |
| 153 return list; |
| 154 }, |
| 155 |
| 156 get childAnimations() { |
| 157 var list = []; |
| 158 this.doOnChildren(function(c) { |
| 159 if (c.animation) { |
| 160 list.push(c.animation); |
| 161 } |
| 162 }); |
| 163 return list; |
| 164 } |
| 165 }); |
| 166 |
| 167 })(); |
| 168 </script> |
| 169 </polymer-element> |
OLD | NEW |