CSSナビゲーション・ハンバーガーメニュー見本集|コピペOKな8パターン

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

メニューはサイトの「入口の案内板」です。

ここが使いにくいと、読者はすぐ離れてしまいます。

この記事では、コピペで使えるナビゲーションメニューとハンバーガーメニューを8パターンまとめました。

実際の動きを見ながら、気に入ったものを選んでコピーしてください。

ハンバーガーはCSSだけで動くものと、JavaScriptを使うものの両方を用意しました。

まずは横並びのナビゲーションから見ていきます。

ナビゲーションメニューの見本(横並び)

PCで使う、横に並ぶメニューの見本です。

HTMLはどれも同じ「navの中にul・li・a」という形です。

まず共通のHTMLを載せておきます。

各見本では、このHTMLのクラス名だけを差し替えて使います。

<nav class="cw-nav1">
 <ul>
  <li>
   <a href="#">ホーム</a>
  </li>
  <li>
   <a href="#">ブログ</a>
  </li>
  <li>
   <a href="#">プロフィール</a>
  </li>
  <li>
   <a href="#">お問い合わせ</a>
  </li>
 </ul>
</nav>

1. シンプルな横並びメニュー

迷ったらこれ、という基本形です。

ホバーで背景色がふわっと変わります。

.cw-nav1 ul {
  display: flex;
  gap: 4px;
  list-style: none;
  margin: 0;
  padding: 0;
  background: #fff;
  border-bottom: 2px solid #e4ebe4;
  flex-wrap: wrap;
}
.cw-nav1 a {
  display: block;
  padding: 12px 18px;
  color: #2b2f2b;
  text-decoration: none;
  font-weight: 600;
  transition: background .2s, color .2s;
}
.cw-nav1 a:hover {
  background: #f6faf6;
  color: #028a00;
}

2. ホバーで下線が左から伸びる

マウスを乗せると、下線がスッと伸びます。

動きの仕組みをもっと知りたい方は、ホバー効果・アニメーションの記事もあわせてどうぞ。

.cw-nav2 ul {
  display: flex;
  gap: 8px;
  list-style: none;
  margin: 0;
  padding: 0;
  flex-wrap: wrap;
}
.cw-nav2 a {
  position: relative;
  display: block;
  padding: 12px 6px;
  color: #2b2f2b;
  text-decoration: none;
  font-weight: 600;
}
.cw-nav2 a::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 6px;
  width: 100%;
  height: 2px;
  background: #37a845;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .3s ease;
}
.cw-nav2 a:hover::after {
  transform: scaleX(1);
}

3. ホバーで背景がふわっと変わる(角丸型)

角丸のボタン風メニューです。

ポップで、やわらかい印象になります。

.cw-nav3 ul {
  display: flex;
  gap: 6px;
  list-style: none;
  margin: 0;
  padding: 6px;
  background: #f6faf6;
  border-radius: 12px;
  flex-wrap: wrap;
}
.cw-nav3 a {
  display: block;
  padding: 10px 16px;
  border-radius: 8px;
  color: #2b2f2b;
  text-decoration: none;
  font-weight: 600;
  transition: background .25s, color .25s;
}
.cw-nav3 a:hover {
  background: #37a845;
  color: #fff;
}

4. 今いるページを強調する

読者が今どのページにいるかを、色と下線で示します。

強調したいリンクに is-current クラスを付けるだけです。

HTMLは、強調したいリンクにだけクラスを足します。

<nav class="cw-nav4">
 <ul>
  <li>
   <a href="#" class="is-current">ホーム</a>
  </li>
  <li>
   <a href="#">ブログ</a>
  </li>
  <li>
   <a href="#">プロフィール</a>
  </li>
  <li>
   <a href="#">お問い合わせ</a>
  </li>
 </ul>
</nav>
.cw-nav4 ul {
  display: flex;
  gap: 4px;
  list-style: none;
  margin: 0;
  padding: 0;
  border-bottom: 2px solid #e4ebe4;
  flex-wrap: wrap;
}
.cw-nav4 a {
  display: block;
  padding: 12px 18px;
  color: #2b2f2b;
  text-decoration: none;
  font-weight: 600;
  border-bottom: 3px solid transparent;
  margin-bottom: -2px;
}
.cw-nav4 a:hover {
  color: #028a00;
}
.cw-nav4 a.is-current {
  color: #028a00;
  border-bottom-color: #37a845;
}

ハンバーガーメニューをCSSだけで作る

ここからはハンバーガーメニューです。

まずはJavaScriptを使わず、CSSだけで開け閉めする方法から紹介します。

仕組みはシンプルです。

目に見えないチェックボックスを1つ用意します。

そのチェックが入っているかどうかで、メニューの表示を切り替えます。

三本線のアイコンは、チェックボックスとつながった label(ラベル)です。

このやり方は「チェックボックスハック」と呼ばれています。

5. 三本線が「×」に変わるメニュー

ボタンを押すと、メニューが下に開きます。

同時に、三本線が×印に変形します。

下のボタンを押して試してみてください。

HTMLはこちらです。

<nav class="cw-ham1">
 <input type="checkbox" id="cw-ham1-check">
 <label for="cw-ham1-check" class="cw-ham1-btn">
  <span></span><span></span><span></span>
 </label>
 <ul class="cw-ham1-menu">
  <li>
   <a href="#">ホーム</a>
  </li>
  <li>
   <a href="#">ブログ</a>
  </li>
  <li>
   <a href="#">プロフィール</a>
  </li>
  <li>
   <a href="#">お問い合わせ</a>
  </li>
 </ul>
</nav>

CSSはこちらです。

.cw-ham1 {
  position: relative;
  display: inline-block;
}
.cw-ham1 input {
  display: none;
}
.cw-ham1-btn {
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  gap: 6px;
  width: 44px;
  height: 44px;
  padding: 10px;
  cursor: pointer;
}
.cw-ham1-btn span {
  display: block;
  height: 3px;
  background: #2b2f2b;
  border-radius: 2px;
  transition: transform .3s, opacity .3s;
}
.cw-ham1-menu {
  list-style: none;
  margin: 8px 0 0;
  padding: 0;
  max-height: 0;
  overflow: hidden;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 6px 20px rgba(0,0,0,.08);
  transition: max-height .3s ease;
  width: 220px;
}
.cw-ham1-menu a {
  display: block;
  padding: 12px 18px;
  color: #2b2f2b;
  text-decoration: none;
}
.cw-ham1-menu a:hover {
  background: #f6faf6;
  color: #028a00;
}
.cw-ham1 input:checked ~ .cw-ham1-menu {
  max-height: 240px;
}
.cw-ham1 input:checked + .cw-ham1-btn span:nth-child(1) {
  transform: translateY(9px) rotate(45deg);
}
.cw-ham1 input:checked + .cw-ham1-btn span:nth-child(2) {
  opacity: 0;
}
.cw-ham1 input:checked + .cw-ham1-btn span:nth-child(3) {
  transform: translateY(-9px) rotate(-45deg);
}

ポイントは input:checked の部分です。

チェックが入ったときだけ、メニューの高さを広げ、線を×に回転させています。

6. 横からスライドインして背景を暗くする

スマホでよく見る、右から出てくるタイプです。

メニューが開くと、背景がふわっと暗くなります。

この「開いたら全体を暗くする」動きは :has() を使っています。

:has() の仕組みは CSSの :has() を解説した記事で詳しく紹介しています。

下のプレビューは、枠の中だけで動くようにしています。

HTMLはこちらです。

<div class="cw-ham2">
 <input type="checkbox" id="cw-ham2-check">
 <label for="cw-ham2-check" class="cw-ham2-btn">
  <span></span>
  <span></span>
  <span></span>
 </label>
 <label for="cw-ham2-check" class="cw-ham2-overlay">
 </label>
 <ul class="cw-ham2-menu">
  <li>
   <a href="#">ホーム</a>
  </li>
  <li>
   <a href="#">ブログ</a>
  </li>
  <li>
   <a href="#">プロフィール</a>
  </li>
  <li>
   <a href="#">お問い合わせ</a>
  </li>
 </ul>
</div>

CSSはこちらです。

実際のサイトで画面全体に出したいときは、position を fixed に変えてください。

.cw-ham2 input {
  display: none;
}
.cw-ham2-btn {
  position: fixed;
  top: 16px;
  left: 16px;
  z-index: 30;
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  gap: 6px;
  width: 44px;
  height: 44px;
  padding: 10px;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 2px 6px rgba(0,0,0,.1);
  cursor: pointer;
}
.cw-ham2-btn span {
  display: block;
  height: 3px;
  background: #2b2f2b;
  border-radius: 2px;
}
.cw-ham2-overlay {
  position: fixed;
  inset: 0;
  z-index: 10;
  background: rgba(0,0,0,.45);
  opacity: 0;
  visibility: hidden;
  transition: opacity .3s;
}
.cw-ham2-menu {
  position: fixed;
  top: 0;
  right: 0;
  z-index: 20;
  width: 260px;
  height: 100%;
  margin: 0;
  padding: 72px 0 0;
  list-style: none;
  background: #fff;
  box-shadow: -6px 0 20px rgba(0,0,0,.1);
  transform: translateX(100%);
  transition: transform .3s ease;
}
.cw-ham2-menu a {
  display: block;
  padding: 14px 20px;
  color: #2b2f2b;
  text-decoration: none;
}
.cw-ham2-menu a:hover {
  background: #f6faf6;
  color: #028a00;
}
.cw-ham2:has(input:checked) .cw-ham2-menu {
  transform: translateX(0);
}
.cw-ham2:has(input:checked) .cw-ham2-overlay {
  opacity: 1;
  visibility: visible;
}

暗くなった背景をタップすると、メニューが閉じます。

背景の暗い部分も、同じチェックボックスにつながった label だからです。

JavaScriptを使うハンバーガーメニュー

CSSだけの方法は手軽ですが、弱点もあります。

キーボード操作や読み上げソフトへの対応が、少し不十分になりがちです。

サイトの本番メニューとしてしっかり作るなら、JavaScript版がおすすめです。

ボタンを押したらクラスを付け外しする、という素直な作りです。

7. クラスの付け外しで開閉する基本形

下のボタンで開閉できます。

Escキーを押すか、メニューの外側をクリックしても閉じます。

HTMLはこちらです。

aria-expanded を付けておくと、読み上げソフトに「開いているか閉じているか」が伝わります。

<nav class="cw-gnav">
 <button class="cw-gnav-toggle" aria-expanded="false" aria-controls="cw-gnav-menu">
 <span class="cw-gnav-bar"></span>
 <span class="cw-gnav-bar"></span>
 <span class="cw-gnav-bar"></span>
 </button>
 <ul class="cw-gnav-menu" id="cw-gnav-menu">
  <li>
   <a href="#">ホーム</a>
  </li>
  <li>
   <a href="#">ブログ</a>
  </li>
  <li>
   <a href="#">プロフィール</a>
  </li>
  <li>
   <a href="#">お問い合わせ</a>
  </li>
 </ul>
</nav>

CSSはこちらです。

.cw-gnav {
  position: relative;
  display: inline-block;
}
.cw-gnav-toggle {
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  gap: 6px;
  width: 44px;
  height: 44px;
  padding: 10px;
  background: #fff;
  border: 1px solid #e4ebe4;
  border-radius: 8px;
  cursor: pointer;
}
.cw-gnav-bar {
  display: block;
  width: 100%;
  height: 3px;
  background: #2b2f2b;
  border-radius: 2px;
}
.cw-gnav-menu {
  list-style: none;
  margin: 8px 0 0;
  padding: 0;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 6px 20px rgba(0,0,0,.08);
  width: 220px;
  display: none;
}
.cw-gnav-menu.is-open {
  display: block;
}
.cw-gnav-menu a {
  display: block;
  padding: 12px 18px;
  color: #2b2f2b;
  text-decoration: none;
}
.cw-gnav-menu a:hover {
  background: #f6faf6;
  color: #028a00;
}

JavaScriptはこちらです。

(function () {
  var nav = document.querySelector('.cw-gnav');
  if (!nav) return;
  var toggle = nav.querySelector('.cw-gnav-toggle');
  var menu = nav.querySelector('.cw-gnav-menu');
 
  function close() {
    toggle.setAttribute('aria-expanded', 'false');
    menu.classList.remove('is-open');
  }
 
  toggle.addEventListener('click', function (e) {
    e.stopPropagation();
    var open = toggle.getAttribute('aria-expanded') === 'true';
    toggle.setAttribute('aria-expanded', String(!open));
    menu.classList.toggle('is-open');
  });
 
  document.addEventListener('keydown', function (e) {
    if (e.key === 'Escape') close();
  });
 
  document.addEventListener('click', function (e) {
    if (!nav.contains(e.target)) close();
  });
})();

JavaScriptは、外観のCSSとは別の場所に貼ります。

WordPressテーマ(SANGO)なら、カスタマイズ画面の「headやbodyにコードを追加」できる欄や、フッター用のコード欄が使えます。

貼るときは、前後を script タグで囲むのを忘れないでください。

スマホはハンバーガー、PCは横並びにする

実際のサイトでは、画面の幅で切り替えたい場面が多いです。

PCでは横並び、スマホではハンバーガー、という形です。

この切り替えはメディアクエリで作れます。

下のプレビューは、ブラウザの幅を狭くすると表示が変わります。

HTMLはこちらです。

<nav class="cw-resp">
 <input type="checkbox" id="cw-resp-check">
 <label for="cw-resp-check" class="cw-resp-btn">
  <span></span>
  <span></span>
  <span></span>
 </label>
 <ul class="cw-resp-menu">
  <li>
   <a href="#">ホーム</a>
  </li>
  <li>
   <a href="#">ブログ</a>
  </li>
  <li>
   <a href="#">プロフィール</a>
  </li>
  <li>
   <a href="#">お問い合わせ</a>
  </li>
 </ul>
</nav>

CSSはこちらです。

幅600pxを境に、横並びとハンバーガーを切り替えています。

.cw-resp input {
  display: none;
}
.cw-resp-btn {
  display: none;
}
.cw-resp-menu {
  display: flex;
  gap: 4px;
  list-style: none;
  margin: 0;
  padding: 0;
  flex-wrap: wrap;
}
.cw-resp-menu a {
  display: block;
  padding: 12px 18px;
  color: #2b2f2b;
  text-decoration: none;
  font-weight: 600;
}
.cw-resp-menu a:hover {
  color: #028a00;
}
 
@media (max-width: 600px) {
  .cw-resp {
    position: relative;
  }
  .cw-resp-btn {
    display: inline-flex;
    flex-direction: column;
    justify-content: center;
    gap: 6px;
    width: 44px;
    height: 44px;
    padding: 10px;
    cursor: pointer;
  }
  .cw-resp-btn span {
    display: block;
    height: 3px;
    background: #2b2f2b;
    border-radius: 2px;
  }
  .cw-resp-menu {
    flex-direction: column;
    gap: 0;
    max-height: 0;
    overflow: hidden;
    background: #fff;
    border-radius: 8px;
    box-shadow: 0 6px 20px rgba(0,0,0,.08);
    transition: max-height .3s ease;
  }
  .cw-resp input:checked ~ .cw-resp-menu {
    max-height: 280px;
  }
}

使うときの注意点とアクセシビリティ

メニューは、見た目だけでなく「使いやすさ」も大切です。

作るときに気をつけたいポイントをまとめます。

CSSだけの方法には限界がある

チェックボックスハックは、JavaScriptを書かずに開閉を作れるのが魅力です。

ただしキーボードだけで操作する人や、読み上げソフトを使う人には少し不親切です。

「見て試す用」や「記事内のちょっとしたメニュー」ならCSS版で十分です。

サイトの本番メニューには、JavaScript版を使うのがおすすめです。

押せる範囲は広めにする

リンクの当たり判定は、文字だけでなくブロック全体に広げましょう。

a に display: block を付けて、padding で余白を持たせると押しやすくなります。

既存WordPressテーマのメニューと役割がかぶらないか確認する

既存WordPressテーマには、最初からスマホ用のメニューが用意されていることが多いです。

なので、ヘッダーのメニューを丸ごと置き換える目的では、無理に自作しなくて大丈夫です。

この記事の見本は、記事の中に置くメニューや、自分でデザインを作り込みたいときに向いています。

SANGOで使うときの注意点

SANGOは、リンクやボタンに元からスタイルが当たっています。

そのため、色や余白が思いどおりに変わらないことがあります。

そのときは、変えたい指定のうしろに !important を足してみてください。

他のテーマでは必要ないことも多いので、SANGOで効かないときの対処と考えてもらえれば大丈夫です。

メニューに点(・)が付くとき

SANGOでは、記事内のリストに自動で点が付きます。

この点は list-style ではなく、疑似要素(li の :before)で付いています。

そのため、メニューのCSSに list-style: none を書いても消えません。

今回紹介したコードの点を消したいときは、次のCSSを追加CSSに足してください。

.entry-content .cw-ham1-menu,
.entry-content .cw-ham2-menu,
.entry-content .cw-gnav-menu,
.entry-content .cw-resp-menu {
  list-style: none !important;
}
.entry-content .cw-ham1-menu li::before,
.entry-content .cw-ham2-menu li::before,
.entry-content .cw-gnav-menu li::before,
.entry-content .cw-resp-menu li::before {
  display: none !important;
}

使うメニューのクラス名だけ残して、あとは削っても大丈夫です。

先頭に .entry-content を付けているのは、SANGOの点より指定を強くして、確実に上書きするためです。

CSSの追加方法

この記事のCSSは、外観 → カスタマイズ → 追加CSS に貼るだけで使えます。

貼り方をくわしく知りたい方は、こちらの記事を先に読んでおくと安心です。

WordPressにCSSを追加する方法

気に入ったメニューが見つかったら、そのままコピーして使ってくださいね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



reCaptcha の認証期間が終了しました。ページを再読み込みしてください。