342 lines
11 KiB
HTML
342 lines
11 KiB
HTML
<!--
|
|
@license
|
|
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
|
|
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
|
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
|
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
|
Code distributed by Google as part of the polymer project is also
|
|
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
|
-->
|
|
|
|
<dom-module id="paper-spinner-styles">
|
|
<template>
|
|
<style>
|
|
/*
|
|
/**************************/
|
|
/* STYLES FOR THE SPINNER */
|
|
/**************************/
|
|
|
|
/*
|
|
* Constants:
|
|
* ARCSIZE = 270 degrees (amount of circle the arc takes up)
|
|
* ARCTIME = 1333ms (time it takes to expand and contract arc)
|
|
* ARCSTARTROT = 216 degrees (how much the start location of the arc
|
|
* should rotate each time, 216 gives us a
|
|
* 5 pointed star shape (it's 360/5 * 3).
|
|
* For a 7 pointed star, we might do
|
|
* 360/7 * 3 = 154.286)
|
|
* SHRINK_TIME = 400ms
|
|
*/
|
|
|
|
:host {
|
|
display: inline-block;
|
|
position: relative;
|
|
width: 28px;
|
|
height: 28px;
|
|
|
|
/* 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */
|
|
--paper-spinner-container-rotation-duration: 1568ms;
|
|
|
|
/* ARCTIME */
|
|
--paper-spinner-expand-contract-duration: 1333ms;
|
|
|
|
/* 4 * ARCTIME */
|
|
--paper-spinner-full-cycle-duration: 5332ms;
|
|
|
|
/* SHRINK_TIME */
|
|
--paper-spinner-cooldown-duration: 400ms;
|
|
}
|
|
|
|
#spinnerContainer {
|
|
width: 100%;
|
|
height: 100%;
|
|
|
|
/* The spinner does not have any contents that would have to be
|
|
* flipped if the direction changes. Always use ltr so that the
|
|
* style works out correctly in both cases. */
|
|
direction: ltr;
|
|
}
|
|
|
|
#spinnerContainer.active {
|
|
-webkit-animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite;
|
|
animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite;
|
|
}
|
|
|
|
@-webkit-keyframes container-rotate {
|
|
to { -webkit-transform: rotate(360deg) }
|
|
}
|
|
|
|
@keyframes container-rotate {
|
|
to { transform: rotate(360deg) }
|
|
}
|
|
|
|
.spinner-layer {
|
|
position: absolute;
|
|
width: 100%;
|
|
height: 100%;
|
|
opacity: 0;
|
|
white-space: nowrap;
|
|
border-color: var(--paper-spinner-color, --google-blue-500);
|
|
}
|
|
|
|
.layer-1 {
|
|
border-color: var(--paper-spinner-layer-1-color, --google-blue-500);
|
|
}
|
|
|
|
.layer-2 {
|
|
border-color: var(--paper-spinner-layer-2-color, --google-red-500);
|
|
}
|
|
|
|
.layer-3 {
|
|
border-color: var(--paper-spinner-layer-3-color, --google-yellow-500);
|
|
}
|
|
|
|
.layer-4 {
|
|
border-color: var(--paper-spinner-layer-4-color, --google-green-500);
|
|
}
|
|
|
|
/**
|
|
* IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee):
|
|
*
|
|
* iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't
|
|
* guarantee that the animation will start _exactly_ after that value. So we avoid using
|
|
* animation-delay and instead set custom keyframes for each color (as layer-2undant as it
|
|
* seems).
|
|
*/
|
|
.active .spinner-layer {
|
|
-webkit-animation-name: fill-unfill-rotate;
|
|
-webkit-animation-duration: var(--paper-spinner-full-cycle-duration);
|
|
-webkit-animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
-webkit-animation-iteration-count: infinite;
|
|
animation-name: fill-unfill-rotate;
|
|
animation-duration: var(--paper-spinner-full-cycle-duration);
|
|
animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
animation-iteration-count: infinite;
|
|
opacity: 1;
|
|
}
|
|
|
|
.active .spinner-layer.layer-1 {
|
|
-webkit-animation-name: fill-unfill-rotate, layer-1-fade-in-out;
|
|
animation-name: fill-unfill-rotate, layer-1-fade-in-out;
|
|
}
|
|
|
|
.active .spinner-layer.layer-2 {
|
|
-webkit-animation-name: fill-unfill-rotate, layer-2-fade-in-out;
|
|
animation-name: fill-unfill-rotate, layer-2-fade-in-out;
|
|
}
|
|
|
|
.active .spinner-layer.layer-3 {
|
|
-webkit-animation-name: fill-unfill-rotate, layer-3-fade-in-out;
|
|
animation-name: fill-unfill-rotate, layer-3-fade-in-out;
|
|
}
|
|
|
|
.active .spinner-layer.layer-4 {
|
|
-webkit-animation-name: fill-unfill-rotate, layer-4-fade-in-out;
|
|
animation-name: fill-unfill-rotate, layer-4-fade-in-out;
|
|
}
|
|
|
|
@-webkit-keyframes fill-unfill-rotate {
|
|
12.5% { -webkit-transform: rotate(135deg) } /* 0.5 * ARCSIZE */
|
|
25% { -webkit-transform: rotate(270deg) } /* 1 * ARCSIZE */
|
|
37.5% { -webkit-transform: rotate(405deg) } /* 1.5 * ARCSIZE */
|
|
50% { -webkit-transform: rotate(540deg) } /* 2 * ARCSIZE */
|
|
62.5% { -webkit-transform: rotate(675deg) } /* 2.5 * ARCSIZE */
|
|
75% { -webkit-transform: rotate(810deg) } /* 3 * ARCSIZE */
|
|
87.5% { -webkit-transform: rotate(945deg) } /* 3.5 * ARCSIZE */
|
|
to { -webkit-transform: rotate(1080deg) } /* 4 * ARCSIZE */
|
|
}
|
|
|
|
@keyframes fill-unfill-rotate {
|
|
12.5% { transform: rotate(135deg) } /* 0.5 * ARCSIZE */
|
|
25% { transform: rotate(270deg) } /* 1 * ARCSIZE */
|
|
37.5% { transform: rotate(405deg) } /* 1.5 * ARCSIZE */
|
|
50% { transform: rotate(540deg) } /* 2 * ARCSIZE */
|
|
62.5% { transform: rotate(675deg) } /* 2.5 * ARCSIZE */
|
|
75% { transform: rotate(810deg) } /* 3 * ARCSIZE */
|
|
87.5% { transform: rotate(945deg) } /* 3.5 * ARCSIZE */
|
|
to { transform: rotate(1080deg) } /* 4 * ARCSIZE */
|
|
}
|
|
|
|
@-webkit-keyframes layer-1-fade-in-out {
|
|
0% { opacity: 1 }
|
|
25% { opacity: 1 }
|
|
26% { opacity: 0 }
|
|
89% { opacity: 0 }
|
|
90% { opacity: 1 }
|
|
to { opacity: 1 }
|
|
}
|
|
|
|
@keyframes layer-1-fade-in-out {
|
|
0% { opacity: 1 }
|
|
25% { opacity: 1 }
|
|
26% { opacity: 0 }
|
|
89% { opacity: 0 }
|
|
90% { opacity: 1 }
|
|
to { opacity: 1 }
|
|
}
|
|
|
|
@-webkit-keyframes layer-2-fade-in-out {
|
|
0% { opacity: 0 }
|
|
15% { opacity: 0 }
|
|
25% { opacity: 1 }
|
|
50% { opacity: 1 }
|
|
51% { opacity: 0 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
@keyframes layer-2-fade-in-out {
|
|
0% { opacity: 0 }
|
|
15% { opacity: 0 }
|
|
25% { opacity: 1 }
|
|
50% { opacity: 1 }
|
|
51% { opacity: 0 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
@-webkit-keyframes layer-3-fade-in-out {
|
|
0% { opacity: 0 }
|
|
40% { opacity: 0 }
|
|
50% { opacity: 1 }
|
|
75% { opacity: 1 }
|
|
76% { opacity: 0 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
@keyframes layer-3-fade-in-out {
|
|
0% { opacity: 0 }
|
|
40% { opacity: 0 }
|
|
50% { opacity: 1 }
|
|
75% { opacity: 1 }
|
|
76% { opacity: 0 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
@-webkit-keyframes layer-4-fade-in-out {
|
|
0% { opacity: 0 }
|
|
65% { opacity: 0 }
|
|
75% { opacity: 1 }
|
|
90% { opacity: 1 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
@keyframes layer-4-fade-in-out {
|
|
0% { opacity: 0 }
|
|
65% { opacity: 0 }
|
|
75% { opacity: 1 }
|
|
90% { opacity: 1 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
.circle-clipper {
|
|
display: inline-block;
|
|
position: relative;
|
|
width: 50%;
|
|
height: 100%;
|
|
overflow: hidden;
|
|
border-color: inherit;
|
|
}
|
|
|
|
/**
|
|
* Patch the gap that appear between the two adjacent div.circle-clipper while the
|
|
* spinner is rotating (appears on Chrome 50, Safari 9.1.1, and Edge).
|
|
*/
|
|
.spinner-layer::after {
|
|
left: 45%;
|
|
width: 10%;
|
|
border-top-style: solid;
|
|
}
|
|
|
|
.spinner-layer::after,
|
|
.circle-clipper::after {
|
|
content: '';
|
|
box-sizing: border-box;
|
|
position: absolute;
|
|
top: 0;
|
|
border-width: var(--paper-spinner-stroke-width, 3px);
|
|
border-color: inherit;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.circle-clipper::after {
|
|
bottom: 0;
|
|
width: 200%;
|
|
border-style: solid;
|
|
border-bottom-color: transparent !important;
|
|
}
|
|
|
|
.circle-clipper.left::after {
|
|
left: 0;
|
|
border-right-color: transparent !important;
|
|
-webkit-transform: rotate(129deg);
|
|
transform: rotate(129deg);
|
|
}
|
|
|
|
.circle-clipper.right::after {
|
|
left: -100%;
|
|
border-left-color: transparent !important;
|
|
-webkit-transform: rotate(-129deg);
|
|
transform: rotate(-129deg);
|
|
}
|
|
|
|
.active .gap-patch::after,
|
|
.active .circle-clipper::after {
|
|
-webkit-animation-duration: var(--paper-spinner-expand-contract-duration);
|
|
-webkit-animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
-webkit-animation-iteration-count: infinite;
|
|
animation-duration: var(--paper-spinner-expand-contract-duration);
|
|
animation-timing-function: cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
animation-iteration-count: infinite;
|
|
}
|
|
|
|
.active .circle-clipper.left::after {
|
|
-webkit-animation-name: left-spin;
|
|
animation-name: left-spin;
|
|
}
|
|
|
|
.active .circle-clipper.right::after {
|
|
-webkit-animation-name: right-spin;
|
|
animation-name: right-spin;
|
|
}
|
|
|
|
@-webkit-keyframes left-spin {
|
|
0% { -webkit-transform: rotate(130deg) }
|
|
50% { -webkit-transform: rotate(-5deg) }
|
|
to { -webkit-transform: rotate(130deg) }
|
|
}
|
|
|
|
@keyframes left-spin {
|
|
0% { transform: rotate(130deg) }
|
|
50% { transform: rotate(-5deg) }
|
|
to { transform: rotate(130deg) }
|
|
}
|
|
|
|
@-webkit-keyframes right-spin {
|
|
0% { -webkit-transform: rotate(-130deg) }
|
|
50% { -webkit-transform: rotate(5deg) }
|
|
to { -webkit-transform: rotate(-130deg) }
|
|
}
|
|
|
|
@keyframes right-spin {
|
|
0% { transform: rotate(-130deg) }
|
|
50% { transform: rotate(5deg) }
|
|
to { transform: rotate(-130deg) }
|
|
}
|
|
|
|
#spinnerContainer.cooldown {
|
|
-webkit-animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite, fade-out var(--paper-spinner-cooldown-duration) cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
animation: container-rotate var(--paper-spinner-container-rotation-duration) linear infinite, fade-out var(--paper-spinner-cooldown-duration) cubic-bezier(0.4, 0.0, 0.2, 1);
|
|
}
|
|
|
|
@-webkit-keyframes fade-out {
|
|
0% { opacity: 1 }
|
|
to { opacity: 0 }
|
|
}
|
|
|
|
@keyframes fade-out {
|
|
0% { opacity: 1 }
|
|
to { opacity: 0 }
|
|
}
|
|
</style>
|
|
</template>
|
|
</dom-module>
|