Repository: tobiasahlin/SpinKit Branch: master Commit: 742a71277c49 Files: 8 Total size: 26.8 KB Directory structure: gitextract_dx25p364/ ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bower.json ├── examples.html ├── package.json └── spinkit.css ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ node_modules/ .DS_Store *.sublime-project *.sublime-workspace ================================================ FILE: CHANGELOG.md ================================================ # 2.0.1 * Fixed: Chase spinner's HTML snippet now has the correct number of children # 2.0.0 * New: Added examples.html, with an overview of all spinners * New: Added a brand new chase spinner * New: Added spinkit.min.css * Fixed: `inline-block` is no longed used to position any spinners (decoupling spacing from any potential font effects) * Changed: Most spinners now have more distinct and shorter names * Changed: No positioning is now applied by default on any of the spinners (center the spinner with the utility class `sk-center`) * Changed: All elements now only have one single class * Changed: No more dependencies. gulp, npm, node, etc. is not required to build this project. There's nothing to build * Changed: No more SCSS. All configuration is now done through CSS vars * Fixed: All keyframe animations are now named after the elements/classes that are using them # 1.2.5 * Fixed: Add folding cube spinner (11) to combined CSS file # 1.2.4 * Fixed: Borked gulp script (#106) * Fixed: Moved changes made in CSS, to SCSS # 1.2.3 * Fixed: More exact (33% -> 33.33%) cube dimensions for cube grid spinner * Fixed: Comment format for HTML inside CSS, for easier copy and pasting (removed * at the beginning of each row) # 1.2.2 * Fixed: Use variable for spinner size (defaults to 40px) # 1.2.1 * Fixed: Two spinners were slightly broken on Android * Changed: Bumped default top and bottom margin to 40px # 1.2.0 * Added: Folding cube spinner * Fixed: Lowercase in package name # 1.1.0 * Removed one spinner (circle with rotating circle, not polished enough) * Cleaned up the CSS * Added more SCSS variables to more easily customize spinners * Introduced SCSS `@for` loops to more easily change timing of spinners * Removed moot `version` property from bower.json # 1.0.1 * Fix: Missed sass variables for background-color ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2020 Tobias Ahlin Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # [SpinKit](http://tobiasahlin.com/spinkit/) Simple loading spinners animated with CSS. See [demo](http://tobiasahlin.com/spinkit/). SpinKit only uses (`transform` and `opacity`) CSS animations to create smooth and easily customizable animations. ## Usage - Add `spinkit.css` or `spinkit.min.css` to your project (or copy-paste the CSS that you need for your spinner—there are no dependencies between spinners, no shared classes, and no shared animations, etc, so it should be fairly straight-forward to extract only the code that you need) - Add a spinner to your project by copy-pasting HTML from `spinkit.css` or `examples.html` - Add the `sk-center` utility class to the spinner to center it (it sets `margin` to `auto`) - By default, the `width` and `height` of all spinners are set to `40px`. `background-color` is set to `#333`. - Configure the spinner by overwriting the CSS variables, primarily `--sk-size` (spinner width & height) and `--sk-color` (spinner color). If you need broader browser support, remove the CSS variables. You can include SpinKit to your project with `bower`: ```bash $ bower install spinkit ``` or npm: ```bash $ npm install spinkit ``` ## Spinners Given that you have included `spinkit.min.css` in your project, these snippets will produce the different spinners: ### Plane ```html
``` ### Chase ```html
``` ### Bounce ```html
``` ### Wave ```html
``` ### Pulse ```html
``` ### Flow ```html
``` ### Swing ```html
``` ### Circle ```html
``` ### Circle Fade ```html
``` ### Grid ```html
``` ### Fold ```html
``` ### Wander ```html
``` ## Web browser compatibility SpinKit uses CSS animations and variables: - CSS keyframes animations [are at +96.5% global support](http://caniuse.com/#feat=css-animation) - CSS variables [are at +91.8% global support](https://caniuse.com/#feat=css-variables) ### Implementing a fallback spinner How do you know if you need to provide a fallback? You can check for animation support with [Modernizr](http://modernizr.com), or manually check for the `animation` property, and replace the spinner with a GIF if it's not supported: ```javascript function browserSupportsCSSProperty(propertyName) { var elm = document.createElement('div'); propertyName = propertyName.toLowerCase(); if (elm.style[propertyName] != undefined) return true; var propertyNameCapital = propertyName.charAt(0).toUpperCase() + propertyName.substr(1), domPrefixes = 'Webkit Moz ms O'.split(' '); for (var i = 0; i < domPrefixes.length; i++) { if (elm.style[domPrefixes[i] + propertyNameCapital] != undefined) return true; } return false; } ``` Use it to check for `animation` support: ```javascript if (!browserSupportsCSSProperty('animation')) { // fallback… } ``` ================================================ FILE: bower.json ================================================ { "name": "SpinKit", "homepage": "https://github.com/tobiasahlin/SpinKit", "authors": [ "Tobias Ahlin" ], "description": "A collection of loading indicators animated with CSS", "main": "css/spinkit.css", "keywords": [ "css", "scss", "web" ], "license": "MIT", "ignore": [ "**/.*", "node_modules" ] } ================================================ FILE: examples.html ================================================ SpinKit Examples
================================================ FILE: package.json ================================================ { "name": "spinkit", "version": "2.0.1", "description": "A collection of loading indicators animated with CSS", "keywords": [ "css", "spinkit", "spinner", "loading", "ui" ], "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "https://github.com/tobiasahlin/SpinKit.git" }, "author": "Tobias Ahlin Bjerrome", "license": "MIT", "bugs": { "url": "https://github.com/tobiasahlin/SpinKit/issues" }, "homepage": "https://github.com/tobiasahlin/SpinKit" } ================================================ FILE: spinkit.css ================================================ /* Config */ :root { --sk-size: 40px; --sk-color: #333; } /* Utility class for centering */ .sk-center { margin: auto; } /* Plane
*/ .sk-plane { width: var(--sk-size); height: var(--sk-size); background-color: var(--sk-color); animation: sk-plane 1.2s infinite ease-in-out; } @keyframes sk-plane { 0% { transform: perspective(120px) rotateX(0deg) rotateY(0deg); } 50% { transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); } 100% { transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); } } /* Chase
*/ .sk-chase { width: var(--sk-size); height: var(--sk-size); position: relative; animation: sk-chase 2.5s infinite linear both; } .sk-chase-dot { width: 100%; height: 100%; position: absolute; left: 0; top: 0; animation: sk-chase-dot 2.0s infinite ease-in-out both; } .sk-chase-dot:before { content: ''; display: block; width: 25%; height: 25%; background-color: var(--sk-color); border-radius: 100%; animation: sk-chase-dot-before 2.0s infinite ease-in-out both; } .sk-chase-dot:nth-child(1) { animation-delay: -1.1s; } .sk-chase-dot:nth-child(2) { animation-delay: -1.0s; } .sk-chase-dot:nth-child(3) { animation-delay: -0.9s; } .sk-chase-dot:nth-child(4) { animation-delay: -0.8s; } .sk-chase-dot:nth-child(5) { animation-delay: -0.7s; } .sk-chase-dot:nth-child(6) { animation-delay: -0.6s; } .sk-chase-dot:nth-child(1):before { animation-delay: -1.1s; } .sk-chase-dot:nth-child(2):before { animation-delay: -1.0s; } .sk-chase-dot:nth-child(3):before { animation-delay: -0.9s; } .sk-chase-dot:nth-child(4):before { animation-delay: -0.8s; } .sk-chase-dot:nth-child(5):before { animation-delay: -0.7s; } .sk-chase-dot:nth-child(6):before { animation-delay: -0.6s; } @keyframes sk-chase { 100% { transform: rotate(360deg); } } @keyframes sk-chase-dot { 80%, 100% { transform: rotate(360deg); } } @keyframes sk-chase-dot-before { 50% { transform: scale(0.4); } 100%, 0% { transform: scale(1.0); } } /* Bounce
*/ .sk-bounce { width: var(--sk-size); height: var(--sk-size); position: relative; } .sk-bounce-dot { width: 100%; height: 100%; border-radius: 50%; background-color: var(--sk-color); opacity: 0.6; position: absolute; top: 0; left: 0; animation: sk-bounce 2s infinite cubic-bezier(0.455, 0.03, 0.515, 0.955); } .sk-bounce-dot:nth-child(2) { animation-delay: -1.0s; } @keyframes sk-bounce { 0%, 100% { transform: scale(0); } 45%, 55% { transform: scale(1); } } /* Wave
*/ .sk-wave { width: var(--sk-size); height: var(--sk-size); display: flex; justify-content: space-between; } .sk-wave-rect { background-color: var(--sk-color); height: 100%; width: 15%; animation: sk-wave 1.2s infinite ease-in-out; } .sk-wave-rect:nth-child(1) { animation-delay: -1.2s; } .sk-wave-rect:nth-child(2) { animation-delay: -1.1s; } .sk-wave-rect:nth-child(3) { animation-delay: -1.0s; } .sk-wave-rect:nth-child(4) { animation-delay: -0.9s; } .sk-wave-rect:nth-child(5) { animation-delay: -0.8s; } @keyframes sk-wave { 0%, 40%, 100% { transform: scaleY(0.4); } 20% { transform: scaleY(1); } } /* Pulse
*/ .sk-pulse { width: var(--sk-size); height: var(--sk-size); background-color: var(--sk-color); border-radius: 100%; animation: sk-pulse 1.2s infinite cubic-bezier(0.455, 0.03, 0.515, 0.955); } @keyframes sk-pulse { 0% { transform: scale(0); } 100% { transform: scale(1); opacity: 0; } } /* Flow
*/ .sk-flow { width: calc(var(--sk-size) * 1.3); height: calc(var(--sk-size) * 1.3); display: flex; justify-content: space-between; } .sk-flow-dot { width: 25%; height: 25%; background-color: var(--sk-color); border-radius: 50%; animation: sk-flow 1.4s cubic-bezier(0.455, 0.03, 0.515, 0.955) 0s infinite both; } .sk-flow-dot:nth-child(1) { animation-delay: -0.30s; } .sk-flow-dot:nth-child(2) { animation-delay: -0.15s; } @keyframes sk-flow { 0%, 80%, 100% { transform: scale(0.3); } 40% { transform: scale(1); } } /* Swing
*/ .sk-swing { width: var(--sk-size); height: var(--sk-size); position: relative; animation: sk-swing 1.8s infinite linear; } .sk-swing-dot { width: 45%; height: 45%; position: absolute; top: 0; left: 0; right: 0; margin: auto; background-color: var(--sk-color); border-radius: 100%; animation: sk-swing-dot 2s infinite ease-in-out; } .sk-swing-dot:nth-child(2) { top: auto; bottom: 0; animation-delay: -1s; } @keyframes sk-swing { 100% { transform: rotate(360deg); } } @keyframes sk-swing-dot { 0%, 100% { transform: scale(0.2); } 50% { transform: scale(1); } } /* Circle
*/ .sk-circle { width: var(--sk-size); height: var(--sk-size); position: relative; } .sk-circle-dot { width: 100%; height: 100%; position: absolute; left: 0; top: 0; } .sk-circle-dot:before { content: ''; display: block; width: 15%; height: 15%; background-color: var(--sk-color); border-radius: 100%; animation: sk-circle 1.2s infinite ease-in-out both; } .sk-circle-dot:nth-child(1) { transform: rotate(30deg); } .sk-circle-dot:nth-child(2) { transform: rotate(60deg); } .sk-circle-dot:nth-child(3) { transform: rotate(90deg); } .sk-circle-dot:nth-child(4) { transform: rotate(120deg); } .sk-circle-dot:nth-child(5) { transform: rotate(150deg); } .sk-circle-dot:nth-child(6) { transform: rotate(180deg); } .sk-circle-dot:nth-child(7) { transform: rotate(210deg); } .sk-circle-dot:nth-child(8) { transform: rotate(240deg); } .sk-circle-dot:nth-child(9) { transform: rotate(270deg); } .sk-circle-dot:nth-child(10) { transform: rotate(300deg); } .sk-circle-dot:nth-child(11) { transform: rotate(330deg); } .sk-circle-dot:nth-child(1):before { animation-delay: -1.1s; } .sk-circle-dot:nth-child(2):before { animation-delay: -1s; } .sk-circle-dot:nth-child(3):before { animation-delay: -0.9s; } .sk-circle-dot:nth-child(4):before { animation-delay: -0.8s; } .sk-circle-dot:nth-child(5):before { animation-delay: -0.7s; } .sk-circle-dot:nth-child(6):before { animation-delay: -0.6s; } .sk-circle-dot:nth-child(7):before { animation-delay: -0.5s; } .sk-circle-dot:nth-child(8):before { animation-delay: -0.4s; } .sk-circle-dot:nth-child(9):before { animation-delay: -0.3s; } .sk-circle-dot:nth-child(10):before { animation-delay: -0.2s; } .sk-circle-dot:nth-child(11):before { animation-delay: -0.1s; } @keyframes sk-circle { 0%, 80%, 100% { transform: scale(0); } 40% { transform: scale(1); } } /* Circle Fade
*/ .sk-circle-fade { width: var(--sk-size); height: var(--sk-size); position: relative; } .sk-circle-fade-dot { width: 100%; height: 100%; position: absolute; left: 0; top: 0; } .sk-circle-fade-dot:before { content: ''; display: block; width: 15%; height: 15%; background-color: var(--sk-color); border-radius: 100%; animation: sk-circle-fade 1.2s infinite ease-in-out both; } .sk-circle-fade-dot:nth-child(1) { transform: rotate(30deg); } .sk-circle-fade-dot:nth-child(2) { transform: rotate(60deg); } .sk-circle-fade-dot:nth-child(3) { transform: rotate(90deg); } .sk-circle-fade-dot:nth-child(4) { transform: rotate(120deg); } .sk-circle-fade-dot:nth-child(5) { transform: rotate(150deg); } .sk-circle-fade-dot:nth-child(6) { transform: rotate(180deg); } .sk-circle-fade-dot:nth-child(7) { transform: rotate(210deg); } .sk-circle-fade-dot:nth-child(8) { transform: rotate(240deg); } .sk-circle-fade-dot:nth-child(9) { transform: rotate(270deg); } .sk-circle-fade-dot:nth-child(10) { transform: rotate(300deg); } .sk-circle-fade-dot:nth-child(11) { transform: rotate(330deg); } .sk-circle-fade-dot:nth-child(1):before { animation-delay: -1.1s; } .sk-circle-fade-dot:nth-child(2):before { animation-delay: -1.0s; } .sk-circle-fade-dot:nth-child(3):before { animation-delay: -0.9s; } .sk-circle-fade-dot:nth-child(4):before { animation-delay: -0.8s; } .sk-circle-fade-dot:nth-child(5):before { animation-delay: -0.7s; } .sk-circle-fade-dot:nth-child(6):before { animation-delay: -0.6s; } .sk-circle-fade-dot:nth-child(7):before { animation-delay: -0.5s; } .sk-circle-fade-dot:nth-child(8):before { animation-delay: -0.4s; } .sk-circle-fade-dot:nth-child(9):before { animation-delay: -0.3s; } .sk-circle-fade-dot:nth-child(10):before { animation-delay: -0.2s; } .sk-circle-fade-dot:nth-child(11):before { animation-delay: -0.1s; } @keyframes sk-circle-fade { 0%, 39%, 100% { opacity: 0; transform: scale(0.6); } 40% { opacity: 1; transform: scale(1); } } /* Grid
*/ .sk-grid { width: var(--sk-size); height: var(--sk-size); /* Cube positions * 1 2 3 * 4 5 6 * 7 8 9 */ } .sk-grid-cube { width: 33.33%; height: 33.33%; background-color: var(--sk-color); float: left; animation: sk-grid 1.3s infinite ease-in-out; } .sk-grid-cube:nth-child(1) { animation-delay: 0.2s; } .sk-grid-cube:nth-child(2) { animation-delay: 0.3s; } .sk-grid-cube:nth-child(3) { animation-delay: 0.4s; } .sk-grid-cube:nth-child(4) { animation-delay: 0.1s; } .sk-grid-cube:nth-child(5) { animation-delay: 0.2s; } .sk-grid-cube:nth-child(6) { animation-delay: 0.3s; } .sk-grid-cube:nth-child(7) { animation-delay: 0.0s; } .sk-grid-cube:nth-child(8) { animation-delay: 0.1s; } .sk-grid-cube:nth-child(9) { animation-delay: 0.2s; } @keyframes sk-grid { 0%, 70%, 100% { transform: scale3D(1, 1, 1); } 35% { transform: scale3D(0, 0, 1); } } /* Fold
*/ .sk-fold { width: var(--sk-size); height: var(--sk-size); position: relative; transform: rotateZ(45deg); } .sk-fold-cube { float: left; width: 50%; height: 50%; position: relative; transform: scale(1.1); } .sk-fold-cube:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--sk-color); animation: sk-fold 2.4s infinite linear both; transform-origin: 100% 100%; } .sk-fold-cube:nth-child(2) { transform: scale(1.1) rotateZ(90deg); } .sk-fold-cube:nth-child(4) { transform: scale(1.1) rotateZ(180deg); } .sk-fold-cube:nth-child(3) { transform: scale(1.1) rotateZ(270deg); } .sk-fold-cube:nth-child(2):before { animation-delay: 0.3s; } .sk-fold-cube:nth-child(4):before { animation-delay: 0.6s; } .sk-fold-cube:nth-child(3):before { animation-delay: 0.9s; } @keyframes sk-fold { 0%, 10% { transform: perspective(140px) rotateX(-180deg); opacity: 0; } 25%, 75% { transform: perspective(140px) rotateX(0deg); opacity: 1; } 90%, 100% { transform: perspective(140px) rotateY(180deg); opacity: 0; } } /* Wander
*/ .sk-wander { width: var(--sk-size); height: var(--sk-size); position: relative; } .sk-wander-cube { background-color: var(--sk-color); width: 20%; height: 20%; position: absolute; top: 0; left: 0; --sk-wander-distance: calc(var(--sk-size) * 0.75); animation: sk-wander 2.0s ease-in-out -2.0s infinite both; } .sk-wander-cube:nth-child(2) { animation-delay: -0.5s; } .sk-wander-cube:nth-child(3) { animation-delay: -1.0s; } @keyframes sk-wander { 0% { transform: rotate(0deg); } 25% { transform: translateX(var(--sk-wander-distance)) rotate(-90deg) scale(0.6); } 50% { /* Make FF rotate in the right direction */ transform: translateX(var(--sk-wander-distance)) translateY(var(--sk-wander-distance)) rotate(-179deg); } 50.1% { transform: translateX(var(--sk-wander-distance)) translateY(var(--sk-wander-distance)) rotate(-180deg); } 75% { transform: translateX(0) translateY(var(--sk-wander-distance)) rotate(-270deg) scale(0.6); } 100% { transform: rotate(-360deg); } }