横並びのヘッダーメニューはCSSでflexboxを利用することで実現でき、ヘッダーメニューにカーソルが当たったときのレイアウトも、CSSでデザインできる。
今回は、Spring BootのWeb画面上で、CSSで横並びのヘッダーメニューを表示するサンプルプログラムを作成してみたので、共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、今回変更したプログラムである。
index.htmlの内容は以下の通りで、ヘッダーメニューを追加し、テーブルの上に選択されたヘッダー名を表示する領域を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ヘッダーメニューの追加</title> <!-- CSSファイルを読み込む --> <link th:href="@{/css/demo.css}" rel="stylesheet" type="text/css" /> <!-- タイトル左のfavicon画像を設定する --> <link rel="icon" th:href="@{/img/purin.jpg}"> </head> <body> <header> ここにヘッダーを書きます。 <ul> <!-- 選択されたヘッダーの色を変えるようにth:classappendタグで設定 --> <li th:classappend="${!#strings.isEmpty(select_header) && select_header.equals('header1')} ? now_header : ''"> <a th:href="@{/header1}">ヘッダー1</a> </li> <li th:classappend="${!#strings.isEmpty(select_header) && select_header.equals('header2')} ? now_header : ''"> <a th:href="@{/header2}">少し長いヘッダー2</a> </li> <li th:classappend="${!#strings.isEmpty(select_header) && select_header.equals('header3')} ? now_header : ''"> <a th:href="@{/header3}">ヘッダー3</a> </li> <li th:classappend="${!#strings.isEmpty(select_header) && select_header.equals('header4')} ? now_header : ''"> <a th:href="@{/header4}">もう少し長いヘッダー4</a> </li> <li th:classappend="${!#strings.isEmpty(select_header) && select_header.equals('header5')} ? now_header : ''"> <a th:href="@{/header5}">ヘッダー5</a> </li> </ul> </header> <main> <div class="container"> <div class="menu"> ここにメニューを書きます。幅は30%です。 </div> <div class="main"> <div th:if="!${#strings.isEmpty(select_header_name)}"> <div class="show_select_header"> 選択されたヘッダーは<span th:text="${select_header_name}"> (選択されたヘッダー名)</span>です。 </div> <br/> </div> ここに本文を書きます。テーブルを縦横スクロールできるようにします。 <div class="scroll_table"> <table> <thead> <tr> <th>タイトル1</th> <th>タイトル2</th> <th>少し長いタイトル3</th> <th>タイトル4</th> <th>もう少し長いタイトル5</th> <th>タイトル6</th> <th>さらにもう少し長いタイトル7</th> </tr> </thead> <tbody> <tr> <td>カラム1</td> <td>少し長いカラム2</td> <td>カラム3</td> <td>もう少し長いカラム4</td> <td>カラム5</td> <td>カラム6</td> <td>さらにもう少し長いカラム7</td> </tr> <tr> <td>少し長いカラム1</td> <td>カラム2</td> <td>少し長いカラム3</td> <td>もう少し長いカラム4</td> <td>カラム5</td> <td>少し長いカラム6</td> <td>さらにもう少し長いカラム7</td> </tr> <tr> <td>少し長いカラム1</td> <td>少し長いカラム2</td> <td>カラム3</td> <td>もう少し長いカラム4</td> <td>カラム5</td> <td>カラム6</td> <td>さらにもう少し長いカラム7</td> </tr> </tbody> </table> </div> </div> </div> </main> <footer> ここにフッターを書きます。 </footer> </body> </html> |
また、CSSファイルで追加した内容は以下の通りで、ヘッダーメニューを横並びにしカーソルが当たったときや選択された場合に色を変える設定(追加内容①)と、選択されたヘッダー名を表示する領域のレイアウトの設定(追加内容②)を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | /* ヘッダーのulタグのレイアウト */ header ul { /* ulタグ内のliを横方向に設定するための指定 */ display: flex; /* ulタグ内のliを右寄せに設定するための指定 */ justify-content: flex-end; /* ulタグの子要素(liタグ)で改行を許可しないための設定 */ flex-wrap: no-wrap; /* ulタグの子要素(liタグ)をベースラインに配置するための設定 */ align-items: baseline; /* ヘッダーの右余白(ボックス内)を30pxに設定 */ padding-right: 30px; } /* ヘッダーのliタグのレイアウト */ header li { /* liタグの先頭のデフォルトの黒丸を削除 */ list-style: none; /* liタグ内の文字サイズを15px、中央寄せに設定 */ font-size: 15px; text-align: center; /* liタグの上下余白(ボックス内)を10px、左右余白(ボックス内)を15pxに設定 */ padding: 10px 15px; min-width: 50px; /* liタグの背景色:薄紅色、枠線:黒に設定 */ background: #ffa07a; outline: 1px solid black; } /* ヘッダーのliタグにカーソルが当たったときのレイアウト */ header li:hover { /* liタグの背景色:暗紅色に設定 */ background: #e9967a; } /* ヘッダーのliタグ下、aリンクのレイアウト */ header li>a { /* 下線を無くし、文字色を黒に設定 */ text-decoration: none; color: black; } /* now_headerクラス(選択されたヘッダーを指定)のレイアウト */ .now_header { background: #deb887; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* 選択されたヘッダー名を表示する領域のレイアウト */ .show_select_header { /* 高さを60pxに指定 */ height: 60px; line-height:60px; /* テキストの位置を上下中央揃えに設定 */ text-align: center; vertical-align: center; /* 背景色を薄暗青に設定 */ background: #add8e6; } .show_select_header span { /* 選択されたヘッダー名を赤字で表示 */ color: red; } |
さらに、コントローラクラスの内容は以下の通りで、ヘッダーメニュー(1~5)が選択された場合の処理を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class DemoController { @GetMapping("/") public String index(){ return "index"; } @GetMapping("/header1") public String header1(Model model){ model.addAttribute("select_header", "header1"); model.addAttribute("select_header_name", "ヘッダー1"); return "index"; } @GetMapping("/header2") public String header2(Model model){ model.addAttribute("select_header", "header2"); model.addAttribute("select_header_name", "少し長いヘッダー2"); return "index"; } @GetMapping("/header3") public String header3(Model model){ model.addAttribute("select_header", "header3"); model.addAttribute("select_header_name", "ヘッダー3"); return "index"; } @GetMapping("/header4") public String header4(Model model){ model.addAttribute("select_header", "header4"); model.addAttribute("select_header_name", "もう少し長いヘッダー4"); return "index"; } @GetMapping("/header5") public String header5(Model model){ model.addAttribute("select_header", "header5"); model.addAttribute("select_header_name", "ヘッダー5"); return "index"; } } |
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-header-menu/demo
サンプルプログラムの実行結果
Spring Bootアプリケーションを起動し、Edge(バージョン:94.0.992.38)で「http:// (ホスト名):(ポート番号)」とアクセスした結果は、以下の通り。
1) 一般的なサイズ(下図では幅:1369px)の場合に初期表示した結果は、以下の通り。
ヘッダーメニュー(下図では「少し長いヘッダー2」)にカーソルをあてると、以下のように、マウスポインターが表示されヘッダーの色が変わることが確認できる。
ヘッダーメニュー(下図では「少し長いヘッダー2」)を選択すると、以下のように、ヘッダーの色が(カーソルを当てたときと)別の色に変わり、テーブルの上に選択されたヘッダー名が表示されることが確認できる。
さらに「ヘッダー3」にカーソルをあてると、以下のように、「少し長いヘッダー2」はそのままで、「ヘッダー3」マウスポインターが表示されヘッダーの色が変わることが確認できる。
2) 最大サイズ(下図では幅:1920px)の場合に初期表示した結果は、以下の通り。
3) 最小サイズ(下図では幅:500px)の場合の実行結果は、以下の通り。
要点まとめ
- 横並びのヘッダーメニューはCSSでflexboxを利用することで実現でき、ヘッダーメニューにカーソルが当たったときのレイアウトも、CSSでデザインできる。