概要
HTMLのheader
要素内に固定メニューを配置する。左端にロゴ画像を置き、メニューは右寄せで配置する例。
HTML/CSS
HTML
ヘッダーにdiv
要素によるロゴ画像とul
によるメニューを配置し、スタイルはCSSで設定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>ヘッダーメニュー</title> <link rel="stylesheet" href="header_menu.css"> </head> <body> <header> <div class="header_logo"></div> <ul class="header_menu"> <li>新規作成</li> <li>編 集</li> <li>プロフィール</li> <li>ログアウト</li> </ul> </header> </body> </html> |
CSS
header
内のロゴとメニューブロックをFlex-boxで配置し、左右に寄せている。メニューリストの水平配置にもFlex-boxを使っている。
なおheaderを固定してbodyのみをスクロールさせることもできる。
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 |
/* CSS内共通のカスタムプロパティー:ヘッダーの高さ */ :root { --header-height: 50px; } /* スタイルをリセット */ * { margin: 0; padding: 0; } header { display: flex; justify-content: space-between; height: var(--header-height); background-color: #8ef } .header_logo { background-image: url('logo_org_simple_transparent.png'); background-repeat: no-repeat; background-size: contain; width: calc(var(--header-height) * 2); height: var(--header-height); } .header_menu { display: flex; list-style: none; } .header_menu li { display: flex; align-items: center; justify-content: center; margin: 10px 0px 10px 5px; width: 90px; font-size: 14px; color: #c00; } .header_menu li + li { padding-left: 5px; border-left: 1px solid black; } |
- 最初のブロックでスタイルをリセット。
header
要素display: flex
指定でコンテンツ(ロゴ、メニューブロック)をフロートさせて配置justify-content
で2つのコンテンツを左端と右端に寄せる- 高さを指定
.header_logo
div
要素に背景画像を指定
.header_menu
- Flex-boxによりリストを横並びにしている
.header_menu li
- 最初の3行はリストの中の文字を縦横センタリングする設定
.header_menu li + li
- 隣接セレクターによってリストアイテムの間に境界線を描いている
ロゴのサイズについて
- div要素で背景画像のみを表示させるときは
width/height
を明示的に設定しなければならない - 当初は
height: 100%
でheader
の高さに合わせ、width: auto
で表示されていた - ところがそこで親の
header
にdisplay: flex
を設定すると表示が消えてしまった - そこでここでは、グローバルなカスタムプロパティーを使っている
Rails/SCSS
HTML
- 通常すべてのレンダリング時に使われる共通レイアウト
app/views/layouts/application.html.erb
- これとは別にヘッダーメニューが必要な場合の共通レイアウトファイルを作成
app/views/layouts/application_with_header.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE html> <html> <head> <title>Styles</title> <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <header> <div class="header_logo"></div> <ul class="header_menu"> <li>新規作成</li> <li>編 集</li> <li>プロフィール</li> <li>ログアウト</li> </ul> </header> <body> <%= yield %> </body> </html> |
ヘッダーメニューが必要なアクションのみこのレイアウトを使うため、コントローラーでレイアウトファイルを指定。
1 2 3 4 5 6 7 |
class PagesController < ApplicationController ..... def header_menu render layout: "application_with_header" end ..... end |
レイアウトファイルが読み込むスタイルシートは標準と同じapplication.css
1 |
*= require layout.scss |
requireされるlayout.scss
で、ヘッダーメニュー用のSCSSを読み込む(ヘッダーメニューがない場合も読み込む)。
1 2 3 4 5 |
@import "reset.scss"; @import "header_menu.scss"; @import "pages.scss"; |
SCSS
以下のSCSSファイルを作成して読み込ませる。リセット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 |
/* CSS内共通のカスタムプロパティー:ヘッダーの高さ */ :root { --header-height: 50px; } header { display: flex; justify-content: space-between; height: var(--header-height); background-color: #8ef } .header_logo { background-image: image-url('logo_org_simple_transparent'); background-repeat: no-repeat; background-size: contain; width: calc(var(--header-height) * 2); height: var(--header-height); } .header_menu { display: flex; list-style: none; li { display: flex; align-items: center; justify-content: center; margin: 10px 0px 10px 5px; width: 90px; font-size: 14px; color: #c00; &+li { padding-left: 5px; border-left: 1px solid black; } } } |