はじめに
Phoenix バージョン 1.7 で ローディングアイコン を使う方法について考えてみます。
ローディングアイコンを作る・探す
CSS
CSS だけで十分かっこいいのができるようです。スタイルシートにローディングアイコンのクラスを定義してそれを使うだけです。
<div class="loader"></div>
/* https://github.com/lukehaas/css-loaders/blob/step2/css/load3.css */
.loader {
font-size: 10px;
margin: 50px auto;
text-indent: -9999em;
width: 11em;
height: 11em;
border-radius: 50%;
background: #ffffff;
background: -moz-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
background: -webkit-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
background: -o-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
background: -ms-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
background: linear-gradient(to right, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
position: relative;
-webkit-animation: load3 1.4s infinite linear;
animation: load3 1.4s infinite linear;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
}
.loader:before {
width: 50%;
height: 50%;
background: #ffffff;
border-radius: 100% 0 0 0;
position: absolute;
top: 0;
left: 0;
content: '';
}
.loader:after {
background: #0dc5c1;
width: 75%;
height: 75%;
border-radius: 50%;
content: '';
margin: auto;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
@-webkit-keyframes load3 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load3 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
有志の方々が俺俺ローディングアイコンの CSS を公開してくださっています。ありがとうございます。
Tailwind CSS の animate-spin
クラス
Tailwind CSS が利用できる環境であれば、Tailwind CSS の animate-spin
クラスを他の Tailwind CSS クラスと組み合わせることによりローディングアイコンを作ることができるようです。
<div class="w-12 h-12 rounded-full absolute border-8 border-gray-300"></div>
<div class="w-12 h-12 rounded-full absolute border-8 border-indigo-400 border-t-transparent animate-spin"></div>
Phoenix 1.7 では初期設定で Tailwind CSS が使えるようになっているので、何も設定しなくても animate-spin
クラスが使えるはずです。
DaisyUI
DaisyUI(第三者製 Tailwind CSS プラグイン)で定義されているクラスを利用する方法もあります。
<div class="loading loading-spinner loading-lg"></div>
DaisyUI をインストールするには Node.js が必要になります。
node --version
npm --version
通常 Node パッケージは assets/
ディレクトリ配下に置かれることが多いようです。(最上位の階層ではなく)assets/
ディレクトリの中で npm install
を実行します。
(cd assets && npm install --save-dev tailwindcss daisyui)
詳しくは Tailwind Node.js のインストール手順 を参照してください。
コンポーネントにする
ローディングアイコンの共通ロジックを関数コンポーネントをしてまとめておくと便利かもしれません。
defmodule MnishiguchiWeb.CustomComponents do
use Phoenix.Component
attr :visible, :boolean, default: false
def loading_indicator(assigns) do
~H"""
<div :if={@visible}">
<%# ここにローディングアイコンを貼り付ける %>
</div>
"""
end
end
さいごに
本記事は autoracex #253 の成果です。ありがとうございます。