-
React Nativeの認証フローを考える
React Nativeのアプリ開発やReactのSPA開発において認証フローは、クオリティを左右する重要な要素であることは間違いない。 実際、検索結果には、認証フローに言及した記事や質問が投稿されていて関心の高さが伺える。その内容としては、ルーター設計における認証フローに関するものが多くを占めている印象だ。 そしてReact Nativeのルーター設計には、React Navigationやreact-native-router-fluxが使われるが、いずれもルーター・ナビゲーションライブラリであって認証ロジックを提供していない。すなわちルーターで良しなに対応するか、自作の認証ロジックをこしらえる必要がある。 このエントリーでは、React Nativeの認証フロー について考えてみたい。 そもそも… そもそもReact Navigationの公式ドキュメントに、認証フローに言及したページがある。これはナビゲーションロジックを駆使して認証コンポーネントとプライベートコンポーネントを振り分けるというものだ。 まったくもって理にかなう認証フローだと思う。 その内容で十分だと思うならば、そちらを参考にするのがよいだろう。ただし認証ロジックを提供するものではないことは理解しなければならない。 認証フローのデモンストレーション AppScreen.js AppNavigator定数がメインナビゲーションに該当する。認証後に表示されるコンポーネントだ。AppNavigatorをcreateAppContainer(…)にセットした上で、withAuthenticator(…)にセットする。withAuthenticatorは、高階コンポーネントになっていて条件によって別コンポーネントを返す。 withAuthenticator.js まずconstructor(props) {…}で認証トークンを取得済みか否かを確認する。その結果で認証コンポーネントかプライベートコンポーネントに振り分ける。 認証トークン取得済みであればprops.authenticate(true);を実行して、this.props.isAuthenticatedの状態を更新する。これによってif (isAuthenticated) return <Component />;のコンポーネントが返される。すなわちこれは、AppScreen.jsで定義したcreateAppContainer(AppNavigator)を参照する。 認証トークン未取得であればprops.signIn();を実行して、this.props.authStageの状態を更新する。これによってswitch (authStage) {…}のcase types.SIGN_IN:が該当する。したがってサインインコンポーネントが返される。 authentication.js Reduxのaction-creatorとaction-type、reducerをまとめている。いわゆるDucksというデザインパターンだ。 stateにはisAuthenticatedとauthStageを定義している。この状態を更新するためにaction-creatorのforgotPassword、signUp、signIn、authenticateがある。 forgotPassword、signUp、signInは、authStageの状態を担当し、action-typeの定数値に更新する。 authenticateは、isAuthenticatedの状態を担当し、真偽値を受け取って更新する。 まとめ React Nativeの認証フロー に関する内容だった。 この内容ではReact Navigationを使っているが、react-native-router-fluxであっても再現可能だ。AppScreen.jsのwithAuthenticator(…)にreact-native-router-fluxのルーターコンポーネントをセットすればよい。 ただこの認証フローにも悩みどころがある。 React Navigationかreact-native-router-fluxに関わらず、認証コンポーネントはナビゲーション管轄外になっていることで、ヘッダーが表示されない。認証画面などにもヘッダーが必要ならば、NativeBaseなどのUIコンポーネントでヘッダーUIを挿入したり、各コンポーネントもナビゲーション化しなければならない。 UIコンポーネントを使う手段は、ヘッダーUIに差異が発生するから却下だろう。ナビゲーション化は、せっかく振り分けたのに、どこかモヤモヤする。 素直にReact Navigationの認証フローに倣ったほうがよいのかもしれない。 このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。
-
レスポンシブに対応したHTMLメールフレームワーク「MJML」でコーディングしてみる
HTMLメールのコーディングが難しいという声を聞く。わたしも同感だ。 Webコンテンツであれば、Webブラウザで表示されるようにコーディングをする。ところがHTMLメールのターゲットであるメールクライアントには、Webブラウザほど優れたレンダリングエンジンを積んでいないものもある。 つまりWebコンテンツのようにCSSコーディングができない。HTMLメール作成においては、だいたいはテーブルコーディングを行う。このような条件でメーラー依存を吸収してコーディングするというのは、骨が折れる。 このエントリーでは、メールクライアント間の依存を解消できるHTMLメールフレームワーク「MJML」を紹介したい。 MJMLについて MJMLは、HTMLメールを作成するHTMLメールフレームワークである。カスタムタグでコンポーネントベースに構成されていて、<mj-body>、<mj-section>、<mj-row>、<mj-column>などのセクショニング・コンテンツの要領で簡単にセマンティックコーディングできる。これらカスタムタグは公開用ビルドをすることでHTMLに変換される。 【MJML】 https://mjml.io/ 特徴 MJMLに触れてみる まずはMJMLを導入してみよう。 初期化 任意のプロジェクトフォルダにpackage.jsonがなければ以下コマンドで初期化すること。 導入 つづいて以下コマンドで、mjmlパッケージモジュールをインストールする。この時点でプロジェクトフォルダには、node_modulesとpackage.jsonが生成される。 作成 つづいてmjmlファイルを用意する。このサンプルではinput.mjmlとしたが、ファイル名は任意で構わない。 レンダリング つづいてHTMLにレンダリングする。 そもそも導入時のnodeパッケージは、ローカルのプロジェクトフォルダにインストールしたものだった。したがって、実行コマンドは./node_modules/mjml/bin/mjmlを参照しなければならない。 パスを設定すれば、プロジェクトフォルダ内でmjmlが可能になるとのことだが、わたしの理解が曖昧なため触れないでおきたい。 気になる場合は、mjml-cliのREADME.mdを参考にするとよい。 果たして、ターミナルにHTMLソースコードがレンダリングされただろうか。 アウトプット アウトプット方法についても触れておこう。以下コマンドでinput.mjmlをoutput.htmlにアウトプットしている。 まとめ レスポンシブ対応のHTMLメールフレームワーク「MJML」の紹介だった。 プログレッシブ・エンハンスメントが叫ばれて久しい昨今でもテーブルコーディングを行わざるを得ないHTMLメールであるが、MJMLを使うことでわざわざ煩わされることもない。 コンポーネントベースに構成されたカスタムタグは、その名称からおよその使い所を推測することが可能だろう。<mj-button>ならばボタンを担うタグという具合に、セマンティックコーディングの要領で記述することができる。 日頃HTMLに慣れ親しんでいるならば、ほとんど学習コストがかからず楽に導入できるはずだ。HTMLメール作成することがあればMJMLを使ってみてはいかがだろうか。 このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。
-
React NavigationのcreateBottomTabNavigatorでヘッダーUIを表示する方法
React Navigationのルーティング設定で、ヘッダーUIとタブバーUIを含むとき、タブ切り替えナビゲーションを担うcreateBottomTabNavigatorを使う。 ところが、createBottomTabNavigatorではヘッダーUIが表示されない。 タブバーUIにおいて、ヘッダーUIが不要なケースがあるかもしれないからヘッダーコンポーネントを含めていないと思われる。しかしその一方でcreateStackNavigatorだとヘッダーUIが表示される。 感の鋭いひとは、気づいたかもしれない。createBottomTabNavigatorとcreateStackNavigatorを複合的に使うことでヘッダーUIとタブバーUIの配置を実現できるということに。 このエントリーでは、ヘッダーとタブバーの要件を満たすReact Navigationのカスタマイズ方法を紹介したい。 createBottomTabNavigatorでタブバーUIを表示する 以下ソースコードを見てほしい。 createBottomTabNavigator APIを使っている。createBottomTabNavigatorの引数には、オブジェクト形式でHome, Cart, Settingプロパティが確認できる。各プロパティには、さらにオブジェクト形式でscreen, navigationOptionsプロパティがあり、screenに任意のReact.Componentを適用して、navigationOptionsでタブラベルを設定している。 タブバーUI設置は実現しているが、例によってヘッダーUIは表示されない。 createStackNavigatorでヘッダーUIを表示する 以下ソースコードを見てほしい。 行数が増えているが、実は、いたってシンプルだ。前述のソースコードからの変更点は、screenプロパティにcreateStackNavigatorを書いている。以下、差分キャプチャを見てほしい。 createBottomTabNavigatorのscreenにcreateStackNavigatorを展開しているだけだ。オブジェクトがネストして分かりにくさを覚えるが、createBottomTabNavigatorとcreateStackNavigatorのコンポーネントを通して任意のコンポーネントが表示される仕組みになっている。 果たして、タブバーUIとヘッダーUIを表示することができた。 まとめ ヘッダーUIとタブバーUIの要件を満たすReact Navigationのカスタマイズ方法の紹介だった。 「createBottomTabNavigatorのscreenにcreateStackNavigatorを展開している」と表現して、わたし自身があらためてスッキリした。ネストが多くてややこしいのだけれど、createBottomTabNavigatorのつもりで記述を済ませてからcreateStackNavigatorを書き加えると迷子になりにくいかもしれない。 このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。
-
会津若松市の高齢者福祉サービス「施術所利用券」の交付対象年齢75歳以上の人口をe-Stat APIで調べてみた
高齢化社会にともない各自治体でさまざまなサービスが展開されている。会津若松市でも同様で高齢福祉課では、いくつかの高齢者福祉サービスを実施している。 たとえば、給食サービスや緊急通報システム、介護者慰労金などが挙げられる。養護老人ホームも一般的なサービスのひとつだ。 さて今回取り上げたいサービスは、「はり、きゅう、マッサージ利用助成券」である。 はり、きゅう、マッサージ利用助成券について はり、きゅう、マッサージ利用助成券は、その名のとおり鍼やお灸、マッサージなどの施術所を利用する高齢者の出費負担を助けるものだ。 サービスを利用することで、その費用の一部を助成してくれる。対象者は、会津若松市に在住の75歳以上の高齢者で、市に登録している施術所のみで使うことができる。 助成額は、1枚800円で、最大6枚の助成券を交付される。つまり4,800円を節約できるわけだ。施術所によっては一回分に等しい額になる。申請するタイミングによって獲得できる枚数が変わるから気をつけてほしい。 施術所利用券に着眼した理由 施術所利用券に着眼した理由についても述べておこう。 わたしはロードバイクでサイクリングをすることが趣味で、ホビーレースに参加することもある。そのトレーニングで筋肉を痛めてしまい鍼灸院に通院した。 そこで施術所利用券の話を聞き、高齢者による施術所利用券の利用が芳しくないということだった。きっと施術所利用券のこと自体が認知されていないのだろうと思う。 このブログで少しでも広まればという想いとともに、技術ブログらしくAPIを活用して対象年齢の人口を調べて見ようと思ったのが理由だ。 会津若松市の75歳以上の人口 ようやく本題だ。会津若松市の75歳以上の人口を調べるには市区町村データを閲覧すれば済むのだが、それでは技術ブログらしくない。よってWebAPIを利用したい。 e-Stat APIを使う。e-Stat APIは、日本の統計が閲覧できる政府統計ポータルサイトだ。さまざまな分野の統計データが蓄積されていて、要件にあったものを詳細に検索できる。 e-Stat APIを使うための準備 1. ユーザー登録 政府統計の総合窓口(e-Stat)ユーザ登 2. アプリケーションIDの取得 マイページから、開発するアプリケーションを登録してアプリケーションIDを取得する。「アプリケーションIDの取得」の項目を記入する。名称、URL、概要がある。公開しないものならばURLは、「http://localhost/」とする。 e-Stat APIの使い方 e-Stat APIは、つぎの 統計表情報取得 メタ情報取得 統計データ取得? データセット登録 データセット参照 データカタログ情報取得 統計データ一括取得 が提供されている。このたびの要件である人口統計を取得するには、統計データ取得APIを利用する。統計データ取得APIのリクエストURLは、4パターン用意されている。XML、JSON、JSONP、CSV形式で、つぎのとおりだ。いずれもGETメソッドでリクエストする。 形式 URL XML形式 http(s)://api.e-stat.go.jp/rest/<バージョン>/app/getStatsData?<パラメータ群> JSON形式 http(s)://api.e-stat.go.jp/rest/<バージョン>/app/json/getStatsData?<パラメータ群> JSONP形式 http(s)://api.e-stat.go.jp/rest/<バージョン>/app/jsonp/getStatsData?<パラメータ群> CSV形式 http(s)://api.e-stat.go.jp/rest/<バージョン>/app/getSimpleStatsData?<パラメータ群> 会津若松市の75歳以上の人口を取得するリクエストURL http://api.e-stat.go.jp/rest/3.0/app/json/getStatsData?cdArea=07202&cdCat01=A1419&appId=<アプリケーションID>&lang=J&statsDataId=0000020201&metaGetFlg=Y&cntGetFlg=N§ionHeaderFlg=1 ご覧のとおりJSON形式のリクエストURLだ。そしてappIdパラメータは、先ほど作成したアプリケーションIDを適用する。以下キャプチャは、HTTPクライアントのPostmanで確認したときのものだ。 レスポンスデータを表示する リクエストURLについては見てもらった。そして会津若松市の75歳以上の人口も返却されているとわかった。 さてこれをWebページに表示したい。以下にサンプルソースコードとキャプチャを用意した。 会津若松市の75歳以上の人口は、18,466人であることがわかった。ただし、この人口は2015年時点のものだ。 まとめ…
-
360度画像をインタラクティブ表示するJavaScriptライブラリ「immersive-custom-elements」の使い方
全天球カメラやスマホアプリで撮った360度画像をWebページに配置するケースを考えてほしい。このようなときそのままimgタグで配置するようなことはあり得ない。360度画像を平面で見ても、せっかくの臨場感や没入感を味わうことができないからだ。 きっとぐるりと見渡すようなコンテンツを思い出すのではないだろうか。最近では不動産サイトや会社案内、宿泊施設などで活用されるシーンも増えていて目にすることがあると思う。 このエントリーでは、360度画像を表示するJavaScriptライブラリ「immersive-custom-elements」を紹介したい。 immersive-custom-elementsについて immersive-custom-elementsは、360度コンテンツをWebサイトに配置できる。ライブラリの読み込みとHTMLカスタム要素の配置のみの簡単仕様になっている。 特徴 ほかライブラリに依存しない 意識的にインスタンスしない HTMLカスタム要素で配置が簡単 オプションはHTMLカスタム要素の属性に記述 導入 導入は、CDNから読み込むかGitHubリポジトリから入手してほしい。今日現在ではnodeパッケージは無かった。したがって、いまはnpmインストールはできない。 CDNで読み込む 使い方 <img-360> 360度画像用のHTMLカスタム要素だ。 属性 型 必須 説明 src string yes 画像ファイルのパス width number yes 要素の幅 height number yes 要素の高さ <video-360> 360度映像を再生するHTMLカスタム要素だ。 属性 型 必須 説明 src strings yes 映像ファイルのパス width number yes 要素の幅 height number yes 要素の高さ loop – no ビデオループ muted…
-
[React Native] keyboardType propsのキーボードビジュアルの違い
アプリケーションのテキストフィールドのキーボードが、入力タイプによって最適化されることを思い出せるだろうか。メールアドレスフィールドだったり、電話番号フィールドだったりがわかりやすいかもしれない。メールアドレスを入力する場合は、@やドットが配置されていて、電話番号を入力する場合は、数字や#*+等の記号が配置されている。 このようにユーザーが入力しやすい機構が用意されているわけだが、テキストフィールドの入力タイプはエンジニアが明示しておく必要がある。 HTMLならば、<input>のtype属性にtextやpassword、numberなどを指定して、React Nativeならば、<TextInput>のkeyboardType propsにdefaultやnumber-padなどを指定するとキーボードが最適化される。 このエントリーでは、keyboardType propsの指定におけるキーボードビジュアルの違いを確認したい。 キーボードタイプの対応表 default number-pad decimal-pad numeric email-address phone-pad ascii-capable numbers-and-punctuation url name-phone-pad twitter web-search visible-password default number-pad decimal-pad numeric email-address phone-pad ascii-capable numbers-and-punctuation url name-phone-pad twitter web-search visible-password まとめ keyboardType propsの指定におけるキーボードビジュアルの違いについて確認してきた。プラットフォーム間においても、未対応のものがあって案件によって使い分けを検討するケースもあるかもしれない。とはいえ、適切なキーボードタイプの設定は、ユーザビリティ向上が見込めるため積極的に適用すると良さそうだ。
-
【React】スライダープラグイン「slick」のReact版「react-slick」の使い方
slickのことをjQueryプラグインとして覚えている人も多いと思う。slickは、スライダー&カルーセルを実装するプラグインでカスタマイズオプションも豊富に用意されていて使い勝手がよい。 わたしも多くの案件でスライダー実装には、slickを使ったものだ。いまでも静的サイトコーディングでスライダー実装が必要ならば、真っ先にslickを検討するはずだ。 そんなslickだが、jQueryプラグインであることから、昨今のSPAやSSR案件では使う機会が遠のいているのも事実。ReactやVue、Angularといったライブラリにもスライダー&カルーセルを実装するライブラリがあるからだ。そんな環境にわざわざjQueryを入れようとは思わない。 ところが、React用にモジュール化されたslickがあることを知った。 このエントリーでは、React環境でも使えるslickの移植版「react-slick」を紹介したい。 react-slickについて スライダー&カルーセルを実装するモジュールだ。jQueryプラグインで広く知られるslickがReactコンポーネントで使えるモジュールとなっている。 【slick】https://kenwheeler.github.io/slick/ 【React Slick】https://react-slick.neostack.com/ 特徴 レスポンシブ対応している ブレークポイントごとにレイアウト変更できる CSS3で動作する スワイプ、マウスドラッグ 左右を少し見せる 矢印、ページネーション、自動再生、マウスオーバーで自動再生を停止 slickの破棄 react-slickを触ってみる react-slickのインストールと設置方法について触れてみよう。 インストール インストールは、プロジェクトルートで追加コマンドを実行する。 コマンド実行後は、package.jsonに”react-slick”: “x.x.x”,が追加されているはずだ。 CSSを設置 react-slickもslickプラグイン同様にCSSを設置しなければならない。react-slickはjQuery版slickの移植であるため、CSSはオリジナルのものを使わなければならない。CSSの設置は、CDNのものを使うか、slick-carouselをインストールして使う。 CDNで読み込む cdnjs CDNにホストされているCSSファイルを読み込む。<link>タグで読み込むのだから、publicルートのindex.htmlに記述するとよい。 npm (or yarn) でインストール いまほどインストールしたslick-carouselのCSSファイルをインポートする。 react-slickを使ってみる react-slickを使ってみよう。スライダーUI用のコンポーネントを作ることを想定している。保存するファイル名は任意にしてもらって構わない。 上記のソースコードでは、一枚ずつ切り替わるスライダーを実装している。settings定数に指定しているオプション名もオリジナルslickそのもので、jQuery版slickのオプションを流用すればよい。オプションをオブジェクト形式で記述しているところもまったく同じで懐かしさを覚える。 まとめ React環境でも使えるslickの移植版「react-slick」の紹介だった。 jQueryプラグインで使った経験があるのならば、余計な学習が不要で馴染みやすいものだと思う。あらたに使い始めるという場合においても、わずらわしい依存性がないことで導入しやすいはずだ。スライダーカスタマイズにしても、jQuery版slickの情報がたくさん公開されているので、困ることはない。ぜひ試してもらいたいモジュールのひとつだ。 このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。
-
API GatewayのKongをインストールしてみた
私はAmazon API Gatewayを利用したことがありました。テストを行う際、そこで全て完結して便利だな程度で利用していました。 同じようなAPI GatewayにKongというものがあることを知りました。Kongとは、いろんなところに存在するAPIをKongを通じて利用できるようにする仕組み、APIプラットフォームです。 オープンソースとして公開されています。Kongがどのようなものか掴むためインストールする方法を紹介します。 Kongとは? Kong社が2015年に公開したAPIゲートウェイと、そのプラットフォーム。 導入できる主な機能 認証 セキュリティ ロギング トラフィック制御 また、 nginxベースにより、高速、高負荷に強い プラグインを組み込みよる柔軟な拡張可能 等の特徴があります。 検証バージョン Docker-compose 版を利用しました。 Docker : 2.1.0.0 (36874)macOS : High Sierra Docker以外 のインストールも様々用意されてます。 参考公式ドキュメントは、こちらdockerhubは、こちら 動作確認にむけた手順 1.一式をダウンロード、展開2.docker-composeにてイメージビルド、コンテナ起動 3.コンテナ実行 4.cURL にて動作確認 ↓ レスポンス Kongの利用 5-minute Quickstartの案内を実行してみました。 1.コンテナ実行 2.DB マイグレーション(データベース準備)( .confファイルを指定すれば、独自の構成も試せます。) 3.Kong 開始 (停止する場合) (リロードする場合) KongデフォルトListenポート 8000 : クライアントからのHTTPトラフィック用、upstreamサービスに転送 8443 : クライアントからのHTTPSトラフィック用、8000と似ているがHTTPSのみ…
-
[react-native-router-flux] フォーカスされてるタブのアイコンにアクティブカラーをつける方法
react-native-router-fluxを使ってRouter設計するとき、タブバーUI用にTabsコンポーネントがある。アプリのスクリーン下部にあるナビゲーションUIのことだ。 タブバーデザインにおいてよほどの理由がない限りは、Tabsコンポーネントを使う。UIコンポーネントを利用すれば同様のものが設置できるし、自作タブバーにすることもできるが、わざわざそうする理由もない。なにより遷移設定が面倒くさい。 そんなTabsコンポーネントであるが、アクティブ時のカラーや非アクティブ時のカラーをカスタマイズするpropsがある。これを書き加えることで、タップしたときに色を変えられるわけだ。 しかしアイコン表示において手こずった事案があった。 このエントリーでは、フォーカスされているタブのアイコンにアクティブカラーをつける方法を共有したい。 react-native ^0.59.8 react-native-router-flux ^4.0.6 native-base ^2.13.4 タブバーにアイコンを表示する まずはRouter設定をする。使うコンポーネントは、 <Router> <Tabs> <Scene> の3つ。タブは「ホーム、カート、設定」を切り替える単純なものを想定している。 上記ソースコードのコメントアウト行を見てほしい。 各タブにアイコン設置するため、<Icon>を使っている。これはNativeBaseのIconコンポーネントだ。<Scene>にそれぞれ設定することでアイコンが表示される。以下のようになると思う。 つづいては、タブがフォーカスされたときにアクティブカラーを着色する工程だ。 タブがフォーカスされているとき(されていないとき)のカラーを指定する タブをタップしてフォーカスされたときに、テキストおよびアイコンがアクティブであるとわかるようにカラーを変えたい。 上記ソースコードのコメントアウト行を見てほしい。 activeTintColor propsがアクティブ時のカラーコードで、inactiveTintColor propsが非アクティブ時のカラーコードを設定している。いずれのpropsも文字列を受け付ける。 現在フォーカスされているホームタブのテキストはアクティブカラーになっている。ところが、アイコンのカラーは変わっていない。それもそのはずで、外部のコンポーネントなのだから仕方がない。 <Icon>は、NativeBaseのコンポーネントだった。アイコンのカラーを変更するには、style propsにオブジェクト形式で、CSSを記述すればよい。 上記ソースコードのコメントアウト行を見てほしい。 <Scene>のicon propsに設定した関数の引数から、focusedを受け取っている。これは真偽値が格納されている。つまりタブがフォーカスならtrueというわけだ。 style propsに、focusedがtrueならアクティブカラーで、falseなら非アクティブカラーがを渡している。これにてアイコンにもアクティブカラーを付与することができた。 まとめ フォーカスされているタブのアイコンにアクティブカラーをつける方法の共有だった。 この内容では、NativeBaseのIconコンポーネントを使っているが、自作のsvgアイコンやほかのUIコンポーネントであっても同様のことができるはずだ。focusedを受け取ってフォーカスか否かを確認して切り替えればよいのだから。 このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。
-
[CSS] タブ切り替えUIのスライドするインジケータを作る方法
タブ切り替えは、省スペースにコンテンツを配置できるUIで、Webサイト、ネイティブアプリ問わずに実装されている。 タブをクリック、もしくはタップすれば、対象エリアがそのタブに関連する情報に切り替わる仕組みだ。そしてクリックされたタブは、アクティブ状態のスタイルが付与される。これがフィードバックとなって、ユーザーは自身がクリックしたタブを認識できるということなのだろう。 このアクティブ状態の表現はさまざまで多種多様にある。たとえば、内包するテキストやロゴの色が濃くなったり、サイズが大きくなったりする。あるいは、タブ自体に罫線が付いたり、影が付いたりする。 さらにはアニメーションで表現するものもある。 アクティブ状態のタブの上辺か下辺にボーダーがあって、タブ切り替え時に横にスライドするといったものだ。タブの横幅が不一致である場合は、ボーダーも可変する。 このエントリーでは、タブ切り替えUIにスライドするインジケータを作る方法を紹介したい。 タブ切り替えUIをコーディングする HTML <li class=”tabbar-indicator”></li>がインジケータを担っている。タブ下辺にあるボーダーを表現するためだけのタグだ。 CSS (SCSS) .tabbar-indicator {…}がインジケータのスタイルだ。ポイントはposition: absolute;で、各タブの梱包要素を基準に絶対位置に配置している。この場合は、下部だからbottom: 0;というわけだ。そしてtransition: width 225ms ease, left 225ms ease;で変化するプロパティを指定している。この場合は、widthとleftが対象になる。 JS クリックしたタブの左辺オフセット値と横幅をインジケータ要素にスタイル付与している。CSSのtransitionでwidthとleftが対象だった。つまりクリックしたタブの左辺まで移動しながら横幅がフィットするようなアニメーションが実現する。 まとめ タブ切り替えUIにスライドするインジケータを作る方法の紹介だった。 タブ切り替えUIにおいてはサンプルのとおり記述してもらえば再現はするが、コンテンツ部分は記述しなかった。理解の妨げになると思ってのことだけれど、もし上記ソースコードをカスタマイズするならば、JSのif (e.target.matches(this.element)) {…}内で展開すればよい。イベントデリゲートでタブクリックだったか否かを判定してくれるif文だ。タブ要素に、data属性でも記述してコンテンツ要素と結びつければタブ切り替え機能の完成だ。機会があれば挑戦してみてほしい。 このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。