12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2023

Day 6

Elixir Phoenix 1.7 で ローディングアイコンを使う

Last updated at Posted at 2023-11-05

はじめに

Phoenix バージョン 1.7 で ローディングアイコン を使う方法について考えてみます。

ローディングアイコンを作る・探す

CSS

CSS だけで十分かっこいいのができるようです。スタイルシートにローディングアイコンのクラスを定義してそれを使うだけです。

my-site.html
<div class="loader"></div>
my-stylesheet.css
/* 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がインストールされているか確認
node --version
npmがインストールされているか確認
npm --version

通常 Node パッケージは assets/ ディレクトリ配下に置かれることが多いようです。(最上位の階層ではなく)assets/ ディレクトリの中で npm install を実行します。

daisyuiをインストールする例
(cd assets && npm install --save-dev tailwindcss daisyui)

詳しくは Tailwind Node.js のインストール手順 を参照してください。

コンポーネントにする

ローディングアイコンの共通ロジックを関数コンポーネントをしてまとめておくと便利かもしれません。

custom_components.ex
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 の成果です。ありがとうございます。

toukon-qiita-macbook_20230912_091808.jpg

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?