前回に引き続き、Counter画面を見ていきます。まず、前回の単方向データバインドのサンプルとして追加していたコードは今回は使わないため、いったん削除しておきます。
続いて、Counter.razorにもとから用意されているボタンの部分に注目します。
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
button という要素名の部分にカーソルを合わせると、IntelliSenseのツールチップが表示されます。ここには「button 要素はそのコンテンツによってラベル付けされるボタンを表します。」と説明されており、これはHTMLの標準的なボタン要素であることを示しています。
図1 Counter.razorのbutton要素(class=”btn btn-primary”)
図2 button要素にカーソルを合わせたときのツールチップ
次に class=”btn btn-primary” の部分について解説します。class属性で指定しているのは CSS クラス と呼ばれるもので、色や形といった見た目の定義に名前を付けてまとめておき、それを毎回書かずに共通で使い回せるようにする仕組みです。ここで定義されているクラスのおかげで、実行すると青いボタンとして表示されます。
図3 実行結果。btn-primaryクラスにより青いボタンとして表示される
このクラスがどこで定義されているのかを確認するため、ソリューションエクスプローラーの wwwroot フォルダーを開き、lib → bootstrap → css とたどっていくと、bootstrap.css(bootstrap.min.css)というファイルが見つかります。
図4 ソリューションエクスプローラー(wwwroot > lib > bootstrap)
このファイルの先頭部分を見ると、コメントとして Bootstrap のバージョン(v5.3.3)や著作権表示、MITライセンスであることが記載されており、あわせて getbootstrap.com へのURLも書かれています。
図5 bootstrap.min.cssファイル先頭のコメント(バージョン・ライセンス情報)
Blazorのプロジェクトには標準でこの Bootstrap が組み込まれており、ボタンやフォームなど、Webでよく使われる部品の見た目があらかじめ定義されています。実際に Bootstrap の公式サイトを開くと、「世界で最も利用されているHTML、CSS、JSのフレームワークです」と紹介されており、上部のメニューからドキュメントを参照できます。Forms のカテゴリを見ると、Form control や Select、Checks & radios など、フォームに関する部品が一覧になっています。
図6 Bootstrap公式サイトのドキュメントメニュー(Forms カテゴリ)
たとえば Form control のページを開くと、こういったおしゃれな入力エリアの実装方法が紹介されています。
図7 Formsドキュメント内のフォームコントロールのページ
クラスを指定した場合としない場合の違いを実際に確認するため、いま使っているボタンをコピーしてもう1つ用意し、コピーした方は class=”btn btn-primary” の部分を削除してみます。
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button> <button @onclick="IncrementCount">Click me</button>
この状態で実行すると、左側がクラスを指定した Bootstrap のボタン、右側が何も指定していない素のボタンとなり、見た目の違いがはっきりとわかります。
図8 classを指定したボタンと指定していないボタンのコード
図9 実行結果。左がBootstrapのボタン、右が素のボタン
続けて Bootstrap の「ボタン」のドキュメントページを見てみます。ボタンはフォームやダイアログなどのアクションに使えるカスタムボタンスタイルで、サイズや状態管理にも対応していると説明されています。
図10 Bootstrapドキュメント「ボタン」のページ
ページ内の「バリエーション」の項目には、Primary、Secondary、Success、Danger、Warning、Info、Light、Dark といった、あらかじめ用意されたボタンの種類とそれぞれのHTMLコードが掲載されています。先ほど使った btn-primary は、このうちの1つを指定していたということになります。
図11 ボタンのバリエーション一覧とHTMLコード
同様に Forms の Select のページを開くと、コンボボックスのサンプルとそのHTMLコードが掲載されています。
図12 Formsドキュメント「セレクト」のページ
<select class="form-select" aria-label="Default select example"> <option selected>Open this select menu</option> <option value="1">One</option> <option value="2">Two</option> <option value="3">Three</option> </select>
このコードをコピーして、Counter.razor の見出し(h1)の下に貼り付けます。
図13 セレクトのコードをCounter.razorに貼り付けた状態
実行すると、このようにおしゃれなコンボボックスと先ほどのボタンが並んで表示されます。
図14 実行結果。コンボボックスとボタンが表示された画面
このように、Bootstrap が用意している部品をそのまま使っていくことで、一から自分でデザインしなくても一般的でおしゃれな見た目のページを作ることができます。どう書けばいいかは、Bootstrap で検索し、公式サイトのドキュメントを開けば、ボタンやフォームなど各種サンプルを確認できます。
図15 「bootstrap」の検索結果からドキュメントサイトを開く
Forms の中の Checks & radios や Input group といった項目も、基本的には同じように公式サイトを見ながら書き方を確認していけば実装できます。具体的な使い方については後々のレクチャーで改めて扱っていく予定なので、今の段階では「だいたいこんな感じで Bootstrap のパーツを使って書いていくんだな」ということを覚えておいてください。
Bootstrap を使うメリットとしては、名前を付けてスタイルをまとめておくことで、ボタンなどの見た目を全体で統一できる点が挙げられます。もし後から色や形を変更したくなった場合も、クラスの定義元(bootstrap.css)を書き換えれば、それを使っている箇所すべてに一括で反映されます。逆に、色などをその場その場で個別に指定していくと、ページによってボタンの見た目がちぐはぐになったり、変更のたびに1つ1つ直していく必要が出てきたりして大変です。
また、Warning用のボタン、決定用のボタンといったように、色そのものではなく「用途」に応じて名前を付けておくのも Bootstrap の考え方の1つです。用途ごとの名前を使う側で共通して使っておけば、あとから見た目を変えたくなったときにも定義元を書き換えるだけで済みます。基本的には、こうした Bootstrap の部品を活用しながらデザインしていく、という進め方になります。
A01_はじめに
A02_バージョンの確認
A03_プロジェクトの作成
A04_アプリの実行
A05_サンプルプログラムの構成
A06_Razorコンポーネント
A07_Razor構文
A08_@pageでURLを指定する
A09_@rendermode
A10_PageTitle
A11_HTMLの見出し
A12_pタグ
A13_単方向データバインド
A14_単方向データバインドの詳細
A15_Bootstrap
A16_ボタンクリックイベント
A17_イベント引数の受け取り方
A18_ここまでのまとめ
B01_新しいWebページを追加する方法
B02_サイドバーから画面を表示する
B03_サイドバーのアイコンを変更する方法
B04_計測値を表示する
B05_変数に置き換える
B06_最新の値でデータを更新する
B07_@usingで通常のC#コードを呼び出す
B08_画面遷移_aタグ
B09_画面遷移_aタグの見た目をボタンにする
B10_画面遷移_NavigationManagerでの遷移
B11_画面間のパラメータの受け渡し方法
B12_EscapeDataStringでエスケープする
B13_複数のパラメータを渡す
B14_任意のパラメータにする
B15_string以外の型をパラメータで使う方法
B16_DateTime型をパラメータで渡す方法
B17_引数2個のURLも型指定に変更する
B18_パラメータ属性をつけるときの注意点
B19_OnParametersSet
B20_OnInitialized
B21_OnInitializedが2回通る問題の対応
B22_ブラウザが開いている間の値を記憶する方法
B23_値の受け渡しとしてのProtectedSessionStorage
B24_非同期を想定したUIの制御
C01_一覧表示
C02_非同期での一覧表示
C03_table-striped
D01_入力エリア
D02_双方向データバインド
D03_入力データをリアルタイムで通知する方法
D04_placeholder
D05_入力エリアの横幅の調整
D06_テキストチェンジイベントを拾う方法
D07_プルダウン
D08_プルダウンのbootstrap
D09_プルダウンの選択している値をデータバインドで操作する
D10_プルダウンにリストの値を表示する
D11_プルダウンに未選択行を入れる
D12_プルダウンの入力を禁止する
D13_プルダウンのチェンジイベントを取得する
D14_チェックボックス
D15_チェックボックスにラベルを付ける
D16_複数のチェックボックスを並べる
D17_ラジオボタン
D18_ラジオボタンのデータバインド
D19_ラジオボタンのチェンジイベント
D20_ラジオボタンにbootstrapを適応する