OLD | NEW |
| (Empty) |
1 /** | |
2 @license | |
3 Copyright (c) 2015 The Polymer Project Authors. All rights reserved. | |
4 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt | |
5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt | |
6 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt | |
7 Code distributed by Google as part of the polymer project is also | |
8 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt | |
9 | |
10 */ | |
11 /**************************/ | |
12 /* STYLES FOR THE SPINNER */ | |
13 /**************************/ | |
14 | |
15 /* | |
16 * Constants: | |
17 * STROKEWIDTH = 3px | |
18 * ARCSIZE = 270 degrees (amount of circle the arc takes up) | |
19 * ARCTIME = 1333ms (time it takes to expand and contract arc) | |
20 * ARCSTARTROT = 216 degrees (how much the start location of the arc | |
21 * should rotate each time, 216 gives us a | |
22 * 5 pointed star shape (it's 360/5 * 3). | |
23 * For a 7 pointed star, we might do | |
24 * 360/7 * 3 = 154.286) | |
25 * CONTAINERWIDTH = 28px | |
26 * SHRINK_TIME = 400ms | |
27 */ | |
28 | |
29 :host { | |
30 display: inline-block; | |
31 position: relative; | |
32 width: 28px; /* CONTAINERWIDTH */ | |
33 height: 28px; /* CONTAINERWIDTH */ | |
34 } | |
35 | |
36 #spinnerContainer { | |
37 width: 100%; | |
38 height: 100%; | |
39 } | |
40 | |
41 #spinnerContainer.active { | |
42 /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ | |
43 -webkit-animation: container-rotate 1568ms linear infinite; | |
44 animation: container-rotate 1568ms linear infinite; | |
45 } | |
46 | |
47 @-webkit-keyframes container-rotate { | |
48 to { -webkit-transform: rotate(360deg) } | |
49 } | |
50 | |
51 @keyframes container-rotate { | |
52 to { transform: rotate(360deg) } | |
53 } | |
54 | |
55 .spinner-layer { | |
56 position: absolute; | |
57 width: 100%; | |
58 height: 100%; | |
59 opacity: 0; | |
60 } | |
61 | |
62 .layer-1 { | |
63 border-color: var(--paper-spinner-layer-1-color, --google-blue-500); | |
64 } | |
65 | |
66 .layer-2 { | |
67 border-color: var(--paper-spinner-layer-2-color, --google-red-500); | |
68 } | |
69 | |
70 .layer-3 { | |
71 border-color: var(--paper-spinner-layer-3-color, --google-yellow-500); | |
72 } | |
73 | |
74 .layer-4 { | |
75 border-color: var(--paper-spinner-layer-4-color, --google-blue-500); | |
76 } | |
77 | |
78 /** | |
79 * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): | |
80 * | |
81 * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it
doesn't | |
82 * guarantee that the animation will start _exactly_ after that value. So we avo
id using | |
83 * animation-delay and instead set custom keyframes for each color (as layer-2un
dant as it | |
84 * seems). | |
85 * | |
86 * We write out each animation in full (instead of separating animation-name, | |
87 * animation-duration, etc.) because under the polyfill, Safari does not recogni
ze those | |
88 * specific properties properly, treats them as -webkit-animation, and overrides
the | |
89 * other animation rules. See https://github.com/Polymer/platform/issues/53. | |
90 */ | |
91 .active .spinner-layer.layer-1 { | |
92 /* durations: 4 * ARCTIME */ | |
93 -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) in
finite both, layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite
both; | |
94 animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite b
oth, layer-1-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; | |
95 } | |
96 | |
97 .active .spinner-layer.layer-2 { | |
98 /* durations: 4 * ARCTIME */ | |
99 -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) in
finite both, layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite
both; | |
100 animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite b
oth, layer-2-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; | |
101 } | |
102 | |
103 .active .spinner-layer.layer-3 { | |
104 /* durations: 4 * ARCTIME */ | |
105 -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) in
finite both, layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite
both; | |
106 animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite b
oth, layer-3-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; | |
107 } | |
108 | |
109 .active .spinner-layer.layer-4 { | |
110 /* durations: 4 * ARCTIME */ | |
111 -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) in
finite both, layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite
both; | |
112 animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite b
oth, layer-4-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; | |
113 } | |
114 | |
115 @-webkit-keyframes fill-unfill-rotate { | |
116 12.5% { -webkit-transform: rotate(135deg); } /* 0.5 * ARCSIZE */ | |
117 25% { -webkit-transform: rotate(270deg); } /* 1 * ARCSIZE */ | |
118 37.5% { -webkit-transform: rotate(405deg); } /* 1.5 * ARCSIZE */ | |
119 50% { -webkit-transform: rotate(540deg); } /* 2 * ARCSIZE */ | |
120 62.5% { -webkit-transform: rotate(675deg); } /* 2.5 * ARCSIZE */ | |
121 75% { -webkit-transform: rotate(810deg); } /* 3 * ARCSIZE */ | |
122 87.5% { -webkit-transform: rotate(945deg); } /* 3.5 * ARCSIZE */ | |
123 to { -webkit-transform: rotate(1080deg); } /* 4 * ARCSIZE */ | |
124 } | |
125 | |
126 @keyframes fill-unfill-rotate { | |
127 12.5% { transform: rotate(135deg); } /* 0.5 * ARCSIZE */ | |
128 25% { transform: rotate(270deg); } /* 1 * ARCSIZE */ | |
129 37.5% { transform: rotate(405deg); } /* 1.5 * ARCSIZE */ | |
130 50% { transform: rotate(540deg); } /* 2 * ARCSIZE */ | |
131 62.5% { transform: rotate(675deg); } /* 2.5 * ARCSIZE */ | |
132 75% { transform: rotate(810deg); } /* 3 * ARCSIZE */ | |
133 87.5% { transform: rotate(945deg); } /* 3.5 * ARCSIZE */ | |
134 to { transform: rotate(1080deg); } /* 4 * ARCSIZE */ | |
135 } | |
136 | |
137 /** | |
138 * HACK: Even though the intention is to have the current .spinner-layer at | |
139 * `opacity: 1`, we set it to `opacity: 0.99` instead since this forces Chrome | |
140 * to do proper subpixel rendering for the elements being animated. This is | |
141 * especially visible in Chrome 39 on Ubuntu 14.04. See: | |
142 * | |
143 * - https://github.com/Polymer/paper-spinner/issues/9 | |
144 * - https://code.google.com/p/chromium/issues/detail?id=436255 | |
145 */ | |
146 @-webkit-keyframes layer-1-fade-in-out { | |
147 from { opacity: 0.99; } | |
148 25% { opacity: 0.99; } | |
149 26% { opacity: 0; } | |
150 89% { opacity: 0; } | |
151 90% { opacity: 0.99; } | |
152 100% { opacity: 0.99; } | |
153 } | |
154 | |
155 @keyframes layer-1-fade-in-out { | |
156 from { opacity: 0.99; } | |
157 25% { opacity: 0.99; } | |
158 26% { opacity: 0; } | |
159 89% { opacity: 0; } | |
160 90% { opacity: 0.99; } | |
161 100% { opacity: 0.99; } | |
162 } | |
163 | |
164 @-webkit-keyframes layer-2-fade-in-out { | |
165 from { opacity: 0; } | |
166 15% { opacity: 0; } | |
167 25% { opacity: 0.99; } | |
168 50% { opacity: 0.99; } | |
169 51% { opacity: 0; } | |
170 } | |
171 | |
172 @keyframes layer-2-fade-in-out { | |
173 from { opacity: 0; } | |
174 15% { opacity: 0; } | |
175 25% { opacity: 0.99; } | |
176 50% { opacity: 0.99; } | |
177 51% { opacity: 0; } | |
178 } | |
179 | |
180 @-webkit-keyframes layer-3-fade-in-out { | |
181 from { opacity: 0; } | |
182 40% { opacity: 0; } | |
183 50% { opacity: 0.99; } | |
184 75% { opacity: 0.99; } | |
185 76% { opacity: 0; } | |
186 } | |
187 | |
188 @keyframes layer-3-fade-in-out { | |
189 from { opacity: 0; } | |
190 40% { opacity: 0; } | |
191 50% { opacity: 0.99; } | |
192 75% { opacity: 0.99; } | |
193 76% { opacity: 0; } | |
194 } | |
195 | |
196 @-webkit-keyframes layer-4-fade-in-out { | |
197 from { opacity: 0; } | |
198 65% { opacity: 0; } | |
199 75% { opacity: 0.99; } | |
200 90% { opacity: 0.99; } | |
201 100% { opacity: 0; } | |
202 } | |
203 | |
204 @keyframes layer-4-fade-in-out { | |
205 from { opacity: 0; } | |
206 65% { opacity: 0; } | |
207 75% { opacity: 0.99; } | |
208 90% { opacity: 0.99; } | |
209 100% { opacity: 0; } | |
210 } | |
211 | |
212 /** | |
213 * Patch the gap that appear between the two adjacent div.circle-clipper while t
he | |
214 * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). | |
215 * | |
216 * Update: the gap no longer appears on Chrome when .spinner-layer's opacity is
0.99, | |
217 * but still does on Safari and IE. | |
218 */ | |
219 .gap-patch { | |
220 position: absolute; | |
221 box-sizing: border-box; | |
222 top: 0; | |
223 left: 45%; | |
224 width: 10%; | |
225 height: 100%; | |
226 overflow: hidden; | |
227 border-color: inherit; | |
228 } | |
229 | |
230 .gap-patch .circle { | |
231 width: 1000%; | |
232 left: -450%; | |
233 } | |
234 | |
235 .circle-clipper { | |
236 display: inline-block; | |
237 position: relative; | |
238 width: 50%; | |
239 height: 100%; | |
240 overflow: hidden; | |
241 border-color: inherit; | |
242 } | |
243 | |
244 .circle-clipper .circle { | |
245 width: 200%; | |
246 } | |
247 | |
248 .circle { | |
249 box-sizing: border-box; | |
250 height: 100%; | |
251 border-width: 3px; /* STROKEWIDTH */ | |
252 border-style: solid; | |
253 border-color: inherit; | |
254 border-bottom-color: transparent !important; | |
255 border-radius: 50%; | |
256 -webkit-animation: none; | |
257 animation: none; | |
258 | |
259 @apply(--layout-fit); | |
260 } | |
261 | |
262 .circle-clipper.left .circle { | |
263 border-right-color: transparent !important; | |
264 -webkit-transform: rotate(129deg); | |
265 transform: rotate(129deg); | |
266 } | |
267 | |
268 .circle-clipper.right .circle { | |
269 left: -100%; | |
270 border-left-color: transparent !important; | |
271 -webkit-transform: rotate(-129deg); | |
272 transform: rotate(-129deg); | |
273 } | |
274 | |
275 .active .circle-clipper.left .circle { | |
276 /* duration: ARCTIME */ | |
277 -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite bo
th; | |
278 animation: left-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; | |
279 } | |
280 | |
281 .active .circle-clipper.right .circle { | |
282 /* duration: ARCTIME */ | |
283 -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite b
oth; | |
284 animation: right-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; | |
285 } | |
286 | |
287 @-webkit-keyframes left-spin { | |
288 from { -webkit-transform: rotate(130deg); } | |
289 50% { -webkit-transform: rotate(-5deg); } | |
290 to { -webkit-transform: rotate(130deg); } | |
291 } | |
292 | |
293 @keyframes left-spin { | |
294 from { transform: rotate(130deg); } | |
295 50% { transform: rotate(-5deg); } | |
296 to { transform: rotate(130deg); } | |
297 } | |
298 | |
299 @-webkit-keyframes right-spin { | |
300 from { -webkit-transform: rotate(-130deg); } | |
301 50% { -webkit-transform: rotate(5deg); } | |
302 to { -webkit-transform: rotate(-130deg); } | |
303 } | |
304 | |
305 @keyframes right-spin { | |
306 from { transform: rotate(-130deg); } | |
307 50% { transform: rotate(5deg); } | |
308 to { transform: rotate(-130deg); } | |
309 } | |
310 | |
311 #spinnerContainer.cooldown { | |
312 /* duration: SHRINK_TIME */ | |
313 -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cub
ic-bezier(0.4, 0.0, 0.2, 1); | |
314 animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezie
r(0.4, 0.0, 0.2, 1); | |
315 } | |
316 | |
317 @-webkit-keyframes fade-out { | |
318 from { opacity: 0.99; } | |
319 to { opacity: 0; } | |
320 } | |
321 | |
322 @keyframes fade-out { | |
323 from { opacity: 0.99; } | |
324 to { opacity: 0; } | |
325 } | |
OLD | NEW |