目次
vue-preloadersとは
vue-preloadersは、安定した、柔軟で完全にカスタマイズ可能なVue.jsおよびNuxt.jsのプリローダーコンポーネントライブラリです。
【動画サイズ:186KB】
環境
Vue | 2.6.10 |
vue-preloaders | 1.0.13 |
インストール
以下のnpm、CDNを使ってインストールします。
npm
npm install vue-preloaders --save
UMD
<script src="https://cdn.jsdelivr.net/npm/vue-preloaders@1.0.13/dist/vue-preloaders.umd.min.js"></script>
gitリポジトリは以下から取得できます。
導入手順
step.1 ライブラリの取り込み
-
ES6等の場合
import VuePreloaders from 'vue-preloaders'
- UMDの場合
const VuePreloaders = window['vue-preloaders'];
step.2 メソッドを設定
上記で取得したVuePreloadersを
Vue.use
に取り込みます。
Vue.use(VuePreloaders); new Vue({ el: '#app' });
step.3 テンプレートを準備
各種コンポーネントを設置します。
サンプルはケバブケースで記載しています。
<div id="app"> <div class="container"> <div class="squares"> <div class="square" v-for="i in 4" :key="i"></div> </div> </div> <div class="container"> <div class="preloader loading"> <span class="slice"></span> <span class="slice"></span> <span class="slice"></span> <span class="slice"></span> <span class="slice"></span> <span class="slice"></span> </div> </div> </div>
step.4 スタイルを適用する
/* squares */ .container { text-align: center; } .squares { position: relative; display: inline-block; width: 40px; height: 40px; overflow: hidden; transform-origin: bottom left; animation: squares 1s linear infinite; } .square { position: absolute; width: 20px; height: 20px; background-color: black; left: 0px; top: 0px; } .square:first-child { top: 20px; } .square:nth-child(2) { left: 20px; top: 20px; animation: square2 1s linear infinite; } .square:nth-child(3) { animation: square3 1s linear infinite; } .square:last-child { left: 20px; animation: square4 1s linear infinite; } @keyframes squares { from { transform: scale(1); } 90% { transform: scale(1); } to { transform: scale(0.5); } } @keyframes square2 { from { transform: translateY(-50px); } 25% { transform: translate(0); } to { transform: translate(0); } } @keyframes square3 { from { transform: translateY(-50px); } 50% { transform: translate(0); } to { transform: translate(0); } } @keyframes square4 { from { transform: translateY(-50px); } 75% { transform: translate(0); } to { transform: translate(0); } } /* preload */ @keyframes preload-show-1 { from { transform: rotateZ(60deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-hide-1 { to { transform: rotateZ(60deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-cycle-1 { 5% { transform: rotateZ(60deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } 10%, 75% { transform: rotateZ(60deg) rotateY(0) rotateX(0deg); border-left-color: #f7484e; } 80%, 100% { transform: rotateZ(60deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-show-2 { from { transform: rotateZ(120deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-hide-2 { to { transform: rotateZ(120deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-cycle-2 { 10% { transform: rotateZ(120deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } 15%, 70% { transform: rotateZ(120deg) rotateY(0) rotateX(0deg); border-left-color: #f7484e; } 75%, 100% { transform: rotateZ(120deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-show-3 { from { transform: rotateZ(180deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-hide-3 { to { transform: rotateZ(180deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-cycle-3 { 15% { transform: rotateZ(180deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } 20%, 65% { transform: rotateZ(180deg) rotateY(0) rotateX(0deg); border-left-color: #f7484e; } 70%, 100% { transform: rotateZ(180deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-show-4 { from { transform: rotateZ(240deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-hide-4 { to { transform: rotateZ(240deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-cycle-4 { 20% { transform: rotateZ(240deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } 25%, 60% { transform: rotateZ(240deg) rotateY(0) rotateX(0deg); border-left-color: #f7484e; } 65%, 100% { transform: rotateZ(240deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-show-5 { from { transform: rotateZ(300deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-hide-5 { to { transform: rotateZ(300deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-cycle-5 { 25% { transform: rotateZ(300deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } 30%, 55% { transform: rotateZ(300deg) rotateY(0) rotateX(0deg); border-left-color: #f7484e; } 60%, 100% { transform: rotateZ(300deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-show-6 { from { transform: rotateZ(360deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-hide-6 { to { transform: rotateZ(360deg) rotateY(-90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-cycle-6 { 30% { transform: rotateZ(360deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } 35%, 50% { transform: rotateZ(360deg) rotateY(0) rotateX(0deg); border-left-color: #f7484e; } 55%, 100% { transform: rotateZ(360deg) rotateY(90deg) rotateX(0deg); border-left-color: #9c2f2f; } } @keyframes preload-flip { 0% { transform: rotateY(0deg) rotateZ(-60deg); } 100% { transform: rotateY(360deg) rotateZ(-60deg); } } body { background: #efefef; } .preloader { position: absolute; top: 50%; left: 50%; font-size: 20px; display: block; width: 3.75em; height: 4.25em; margin-left: -1.875em; margin-top: -2.125em; transform-origin: center center; transform: rotateY(180deg) rotateZ(-60deg); } .preloader .slice { border-top: 1.125em solid transparent; border-right: none; border-bottom: 1em solid transparent; border-left: 1.875em solid #f7484e; position: absolute; top: 0px; left: 50%; transform-origin: left bottom; border-radius: 3px 3px 0 0; } .preloader .slice:nth-child(1) { transform: rotateZ(60deg) rotateY(0deg) rotateX(0); animation: 0.15s linear 0.82s preload-hide-1 both 1; } .preloader .slice:nth-child(2) { transform: rotateZ(120deg) rotateY(0deg) rotateX(0); animation: 0.15s linear 0.74s preload-hide-2 both 1; } .preloader .slice:nth-child(3) { transform: rotateZ(180deg) rotateY(0deg) rotateX(0); animation: 0.15s linear 0.66s preload-hide-3 both 1; } .preloader .slice:nth-child(4) { transform: rotateZ(240deg) rotateY(0deg) rotateX(0); animation: 0.15s linear 0.58s preload-hide-4 both 1; } .preloader .slice:nth-child(5) { transform: rotateZ(300deg) rotateY(0deg) rotateX(0); animation: 0.15s linear 0.5s preload-hide-5 both 1; } .preloader .slice:nth-child(6) { transform: rotateZ(360deg) rotateY(0deg) rotateX(0); animation: 0.15s linear 0.42s preload-hide-6 both 1; } .preloader.loading { animation: 2s preload-flip steps(2) infinite both; } .preloader.loading .slice:nth-child(1) { transform: rotateZ(60deg) rotateY(90deg) rotateX(0); animation: 2s preload-cycle-1 linear infinite both; } .preloader.loading .slice:nth-child(2) { transform: rotateZ(120deg) rotateY(90deg) rotateX(0); animation: 2s preload-cycle-2 linear infinite both; } .preloader.loading .slice:nth-child(3) { transform: rotateZ(180deg) rotateY(90deg) rotateX(0); animation: 2s preload-cycle-3 linear infinite both; } .preloader.loading .slice:nth-child(4) { transform: rotateZ(240deg) rotateY(90deg) rotateX(0); animation: 2s preload-cycle-4 linear infinite both; } .preloader.loading .slice:nth-child(5) { transform: rotateZ(300deg) rotateY(90deg) rotateX(0); animation: 2s preload-cycle-5 linear infinite both; } .preloader.loading .slice:nth-child(6) { transform: rotateZ(360deg) rotateY(90deg) rotateX(0); animation: 2s preload-cycle-6 linear infinite both; }
サンプル
さいごに
カスタマイズ可能なVue.jsおよびNuxt.jsのプリローダーコンポーネントライブラリでした。
今日はこの辺でー