前回までの回で、計測設定画面(MeasureSettingPage.razor)にInputRadioGroup/InputRadioコンポーネントを使ったラジオボタンを作成しました。しかし現時点ではブラウザー標準の見た目のままで、チェックボックスやプルダウンのようにBootstrapのスタイルは適用されていません。今回は、これまでのチェックボックス回と同じ要領で、ラジオボタンにもBootstrapを適用していきます。
図1 現状の画面。チェックボックスとプルダウンはBootstrapスタイル済みだが、ラジオボタン(一般会員/ゴールド会員)だけがブラウザー標準の見た目のまま
1. 現在のコードを確認する
現在のInputRadioGroup部分のコードは次のとおりです。labelタグの中にInputRadioコンポーネントを配置し、その直後に選択肢のテキストを並べる形になっています。
図2 変更前のコード。InputRadioにはまだclass属性が指定されていない
<InputRadioGroup @bind-Value="_memberKind"
@bind-Value:after="MemberKindChanged">
<label>
<InputRadio Value="1" /> 一般会員
</label>
<label>
<InputRadio Value="2" /> ゴールド会員
</label>
</InputRadioGroup>
2. InputRadioにform-check-inputクラスを追加する
チェックボックスのときと同じ要領で、InputRadioタグにclass=”form-check-input”を追加します。ValueとInputRadioタグの間にカーソルを置いてclass属性を入力すると、IntelliSenseの候補一覧が表示されます。
図3 InputRadioタグにclass属性を追加する際のIntelliSense候補
一般会員・ゴールド会員、両方のInputRadioにclass=”form-check-input”を追加します。
図4 両方のInputRadioにform-check-inputクラスを追加した状態
<InputRadioGroup @bind-Value="_memberKind"
@bind-Value:after="MemberKindChanged">
<label>
<InputRadio class="form-check-input" Value="1" /> 一般会員
</label>
<label>
<InputRadio class="form-check-input" Value="2" /> ゴールド会員
</label>
</InputRadioGroup>
この状態で実行すると、ラジオボタン自体はBootstrapの丸いデザインになりますが、ラジオボタンとラベル文字の間隔が詰まっており、まだ見た目が整っていません。
図5 form-check-inputを追加した直後の実行結果。丸いデザインにはなったが間隔が詰まっている
3. labelとInputRadioをdivで囲んで1セットにする
ラベルとラジオボタンを1セットとして扱うため、それぞれをclass=”form-check”のdivタグで囲みます。これもチェックボックスのときと同じ考え方で、同一コンテナにまとめることで正しい余白が適用されるようになります。両方のラジオボタンに対して同様にdivで囲みます。
図6 labelとInputRadioをclass=”form-check”のdivタグで囲む
<InputRadioGroup @bind-Value="_memberKind"
@bind-Value:after="MemberKindChanged">
<div class="form-check">
<label>
<InputRadio class="form-check-input" Value="1" /> 一般会員
</label>
</div>
<div class="form-check">
<label>
<InputRadio class="form-check-input" Value="2" /> ゴールド会員
</label>
</div>
</InputRadioGroup>
実行すると、ラジオボタンとラベルの間隔が正しく調整され、他のBootstrapフォームパーツと同じ見た目で縦に並んで表示されるようになります。
図7 divで囲んだ後の実行結果。form-checkにより適切な余白で縦に並ぶ
4. 横並びにする(form-check-inline)
チェックボックスのときと同様、横に並べたい場合はclass=”form-check”に加えてform-check-inlineを追加します。両方のdivに対して同じようにクラスを追加します。
図8 form-checkクラスにform-check-inlineを追加する
<InputRadioGroup @bind-Value="_memberKind"
@bind-Value:after="MemberKindChanged">
<div class="form-check form-check-inline">
<label>
<InputRadio class="form-check-input" Value="1" /> 一般会員
</label>
</div>
<div class="form-check form-check-inline">
<label>
<InputRadio class="form-check-input" Value="2" /> ゴールド会員
</label>
</div>
</InputRadioGroup>
実行すると、2つのラジオボタンが横並びで表示されるようになります。
図9 form-check-inlineを追加した後の実行結果。ラジオボタンが横並びになる
5. id・forを指定していない理由
ここで、チェックボックスのときの実装と見比べてみます。チェックボックス回では、input要素とlabel要素を別々に配置し、id属性とfor属性を明示的に指定することで両者を1セットとして結び付けていました。
図10 (コメントアウトされた)チェックボックス実装の例。idとforを明示的に指定して1セットにしている
一方、今回のラジオボタンの実装ではid・forを一切指定していません。それでもラベル文字をクリックするとラジオボタンが正しく反応します。これは、id・forによる紐付けではなく、label要素の中にInputRadio(input要素)そのものを配置しているためです。label内に配置されたinput要素は、そのlabelをクリックしたときに自動的に反応するというHTML標準の機能によるものです。
どちらの書き方が一般的かというと、id・forを明示的に指定する方法の方がよく使われる傾向にありますが、label内にinput要素を直接配置する今回のような書き方も、コード量が少なくシンプルに書けるという利点があります。状況に応じて使い分けるとよいでしょう。
まとめ
ラジオボタンへのBootstrap適用は、①InputRadioにform-check-inputクラスを追加する、②labelとInputRadioをclass=”form-check”のdivで囲む、③横並びにしたい場合はform-check-inlineを追加する、という3ステップで行えます。これはチェックボックスのときとほぼ同じ手順であり、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を適応する