Blazor01

BlazorでのWebアプリケーション開発手法1【C#】B03_サイドバーのアイコンを変更する方法

前回のレクチャーで、新しく追加した「計測」ページへのリンクをサイドバーのサブメニューから起動できるようになりました。ただし、そのメニュー項目のアイコンは Weather 用のリンクをコピーして作成したため、Weather と同じアイコンのままになっています。今回はこのアイコンを、計測画面にふさわしいものに差し替える手順を見ていきます。

図1 「計測」メニューのアイコンが「Weather」と同じままになっている

アイコンの設定は NavMenu.razor と同じ階層にある NavMenu.razor.css に記述されています。このファイルをダブルクリックして開き、下の方にスクロールしていくと、クラス名の語尾が「nav-menu」になっているブロックがいくつか並んでいます。これが Home・Counter・Weather それぞれのアイコンを定義している部分です。

図2 NavMenu.razor.css を開き、既存のアイコン定義(nav-menuブロック)を確認する

今回は既存のメニューにもう1つアイコン定義を追加する形で進めます。まずは一番下にある .bi-list で始まる nav-menu ブロック(Weather 用)を、先頭の .bi から末尾の } までまるごと選択してコピーし、その下に貼り付けます。

図3 コピー元となる .bi-list-nested-nav-menu ブロックを選択する

貼り付けができたら、今度は使用するアイコンを決めます。Bootstrap はデフォルトでアイコン一式を利用できるようになっているので、検索窓で「Bootstrap Icon」と入力して公式サイトを開きます。

図4 「Bootstrap Icon」で検索する

Bootstrap Icons のサイトには、あらかじめ多数のアイコンが用意されています。この一覧から好きなものを選んで使うことができます。今回は計測値を表示する画面なので、心電図のような波形の「activity」アイコンを選びました。

図5 Bootstrap Icons のアイコン一覧ページ

図6 計測画面向けに「activity」アイコンを選択する

アイコンをクリックすると、そのアイコンの詳細ページに移動します。ここではまず「アイコンフォント」欄に表示されている bi-activity という名前をコピーします。このアイコンごとに異なる名前が、CSSのクラス名部分に使われます。

図7 アイコン詳細ページでアイコン名「bi-activity」をコピーする

コピーした名前を使って、先ほど複製した nav-menu ブロックの名前部分(.bi-list から -nav-menu の手前まで)を書き換えます。今回は .bi-activity-nav-menu という名前になります。

図8 複製したブロックの名前を .bi-activity-nav-menu に書き換えた状態(中身の内容はまだ変更前)

続いてブロックの中身(アイコンの絵柄そのもの)を差し替えます。アイコン詳細ページを下にスクロールすると「HTMLをコピー」という項目があり、その右側のボタンを押すと SVG のソースコードがクリップボードにコピーされます。

図9 「HTMLをコピー」からSVGのソースコードをコピーする

コピーしたSVGは、そのままではCSSの background-image に使える形式になっていないため、別のWebページで変換します。検索窓に「url svg」と入力し、URL-encoder for SVG というサイトを開きます。

図10 「url svg」で検索する

図11 URL-encoder for SVG のページ

このページの「Insert SVG」欄に、先ほどコピーしたSVGを貼り付けます。すると右側の「Take encoded」欄に変換結果が表示されるので、さらにその下にある「Ready for CSS」の内容をコピーします。

コピーしたCSS用コードを、NavMenu.razor.css の .bi-activity-nav-menu ブロックの { から } までの中身とそっくり入れ替えます。

図12 貼り付け対象として、ブロックの中身(既存のコード)を選択した状態

図13 「Ready for CSS」の内容を貼り付けた直後(fill はまだ currentColor のまま)

貼り付けた直後は fill=’currentColor’ という記述になっていますが、他の nav-menu ブロックと合わせるため、これを white に書き換えます。書き換えるとサイドバーの背景色に合わせて白いアイコンとして表示されるようになります。

図14 fill を white に書き換えて完成した .bi-activity-nav-menu ブロック

.bi-activity-nav-menu {
    background-image: url("data:image/svg+xml,%3Csvg
    xmlns='http://www.w3.org/2000/svg' width='16' height='16'
    fill='white' class='bi bi-activity' viewBox='0 0 16
    16'%3E%3Cpath fill-rule='evenodd' d='M6 2a.5.5 0 0
    1 .47.33L10 12.036l1.53-4.208A.5.5 0 0 1 12 7.5h3.5a.5.5 0 0 1 0
    1h-3.15l-1.88 5.17a.5.5 0 0 1-.94 0L6 3.964 4.47
    8.171A.5.5 0 0 1 4 8.5H.5a.5.5 0 0 1 0-1h3.15l1.88-5.17A.5.5
    0 0 1 6 2' /%3E%3C/svg%3E");
}

CSS側の準備ができたら、最後に NavMenu.razor 側の該当する span タグの class 属性を書き換えます。「計測」メニューの span 要素は元々 Weather からコピーしたときのまま class=”bi bi-list-nested-nav-menu” になっているので、先頭の bi- は残し、続く .bi-list-nested から -nav-menu までの部分だけを、先ほど作成した bi-activity-nav-menu に置き換えます。

図15 書き換え前:「計測」メニューの span が bi-list-nested-nav-menu のままになっている

図16 書き換え後:span の class が bi-activity-nav-menu になった

<div class="nav-item px-3">
    <NavLink class="nav-link" href="measure">
        <span class="bi bi-activity-nav-menu" aria-hidden="true"></span> 計測
    </NavLink>
</div>

ここまでできたら実行して確認します。サイドバーの「計測」メニューのアイコンが、Weather と同じ横棒3本のアイコンから、心電図のような波形の activity アイコンに変わっていることが確認できます。

図17 実行結果。「計測」メニューが独自のアイコンで表示されるようになった

このように、NavMenu にメニュー項目を1つ追加するときは、①NavMenu.razor.css に新しいアイコン用のブロックを追加し、②Bootstrap Icons から使いたいアイコンを選んで名前とSVGコードを取得し、③URL-encoder for SVG でCSS用の形式に変換して貼り付け、④fill を white に統一し、⑤NavMenu.razor 側の class 属性を新しいブロック名に差し替える、という流れになります。同じ手順でメニューを増やしていくことができるので、覚えておくと便利です。

BlazorでのWebアプリケーション開発手法1【C#】

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を適応する