🌀

ボタンローディング表示のサイズ制御に関するTips

2024/12/12に公開

ボタンでローディング表示するとき、元のボタンテキストより横幅が短かったり長い内容を表示するとサイズが変わってしまう恐れがあります。
これの対処Tipsの紹介です。

元ネタ

https://x.com/chronark_/status/1866779278815162376

  • ボタン幅に固定値を与えない
  • ローディング表示で切り替わってもボタン内要素の最長幅を維持
  • TailwindCSSで表現

Wes Bosの回答(本記事の内容の90%)

https://x.com/wesbos/status/1866895899554926912

(TailwindCSSではなくCSSでの解説動画でしたが学びがたくさん)

キモ

  • 1行1列だけのGridを使う(Grid Areaを使う)
  • opacityではなくvisibilityを使う(a11yのため)

でした。

a11y的に、opacityを使うとローディング要素に指定した文字も含めてしまい、テキストリーダーで読み上げてしまうとのこと。(button内の文字が"Save Item Saving Item"になってる!)
学び。

TailwindCSSでのチャレンジ

さて、このままではただのパクリ記事になってしまうので、学びを添えて記事とさせていただきます。

上記の内容を元ネタの通りTailwindCSSで書くにはどうしたらよいかと興味が出てやってみました。

https://x.com/t6adev/status/1867009648563458401

出来た。

  • ローディングのトグルにdata attributeを利用
  • Grid Areaのために[]で記述(Docs
  • groupの利用

コードはこちら
https://play.tailwindcss.com/CyOQ1MFT0f?layout=horizontal

TailwindCSSではcss gridの全てはutility classで用意されていないので[]を使いました。
ボタンテキストとローディング要素にarea名を指定して、visible/invisible をgroupとdataの組み合わせでトグルしてあげれば完了です。Reactであれば、data属性の値をstateで可変に与えることで実現できます。
a11yもDev Tool上で確認すると問題なさそうです。

かなり見やすいですね、気に入りました!

React Tokyoというコミュニティがスタート

宣伝です。
この度、Zustand,Jotai,Valtio,Waku作者として有名な@dai_shi さんと一緒にReact Tokyoというコミュニティをスタートしました!
東京を中心としたReactのオンライン&オフラインコミュニティとして活動していきますので、ご興味ある方ぜひご参加ください!

https://x.com/ReactTokyo/status/1864325542746706283

まだまだ立ち上げ中なので協力してくださるメンバーも随時募集しております!

主にオンラインではDiscordを交流の場とし、
https://discord.gg/5B9jYpABUy
オフライン交流はConnpassを利用してイベントを開催予定です。
https://react-tokyo.connpass.com/

各種SNS含めよろしくお願いします😊

https://x.com/ReactTokyo
https://bsky.app/profile/react-tokyo.bsky.social

良いお年を!

Discussion