大阪でホームページ制作ならプロットハブ

大阪で安いホームページ制作ならプロットハブ!
毎月5社限定企画実施中

プロットハブ技術ブログ

【コピペOK!】 JavaScript不要!HTMLとCSSだけで作るシンプルなハンバーガーメニュー

Ryuto Yamana

Ryuto Yamana

2024/10/30

こんにちは!株式会社プロットハブのエンジニア、山名です。
ホームページ制作をしていると、必ず必要になるものにレスポンシブ対応のハンバーガーメニューがあります。
コピペで使えるハンバーガーメニューに関しては以前にもご紹介はしているのですが、今回はコピペでそのまま使える、初心者でも安心して使えるに作ってみました。
一般的なハンバーガーメニューはJavaScriptやjQueryを使って実装しますが、実はHTMLとCSSだけでもシンプルに作成することが可能なのです。
よければ最後まで見てコピペして使ってみてください!

このハンバーガーメニューの特徴

  • JavaScriptやjQueryを一切使用していないため、初心者の方でも安心して使えます。
  • HTMLとCSSのみで構成されているので、コードの理解やカスタマイズが容易です。
  • レスポンシブ対応済みで、デバイスの画面サイズに応じて自動的にメニューが切り替わります。
  • コピペでそのまま使用可能なので、時間の節約になります。
  • 今回のコードはTailwind cssを使って生成したものを使用しています。

HTMLの記述

HTMLのコードを表示
  <header class="header">

    <div class="header-content">

      <h1 class="site-logo">
        <a href="#"></a>
      </h1>

      <input type="checkbox" id="menu-toggle" class="menu-toggle">
      <nav class="navbar">
        <!-- ハンバーガーメニュー -->
        <label for="menu-toggle" class="menu-icon">
          <span></span>
          <span></span>
          <span></span>
        </label>

      </nav>

      <!-- メニュー -->
      <div class="menu-wrap">
        <ul class="menu">
          <li>
            <a href="#">
              Home
              <svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
            </a>
          </li>
          <li>
            <a href="#">
              About
              <svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
            </a>
          </li>
          <li>
            <a href="#">
              Services
              <svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
            </a>
          </li>
          <li>
            <a href="#">
              Contact
              <svg width="10" height="14" viewBox="0 0 10 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M-0.000976562 13.1198L0 6.99982L-0.000976562 0.879822L9.99902 6.99982L0 13.5L-0.000976562 13.1198Z" fill="white"/></svg>
            </a>
          </li>
        </ul>
      </div>

    </div>

  </header>

CSSの記述

CSSのコードを表示
html{
  overflow-x: hidden; /* これが無いと.menuがはみでちゃう */
}

header {
  position: absolute;
  left: 0px;
  right: 0px;
  top: 0px;
  --tw-bg-opacity: 1;
  background-color: rgb(238 238 238 / var(--tw-bg-opacity));
}

.header-content {
  position: relative;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-pack: justify;
  -ms-flex-pack: justify;
  justify-content: space-between;
  padding-left: 5%;
  padding-right: 5%;
  padding-top: clamp(8px, 2.666666666666667vw, 30px);
  padding-bottom: clamp(8px, 2.666666666666667vw, 30px);
}

@media (min-width: 1025px) {
  .header-content {
    padding-top: clamp(10px, 1.3888888888888888vw, 30px);
    padding-bottom: clamp(10px, 1.3888888888888888vw, 30px);
    padding-right: clamp(80px, 6.944444444444445vw, 120px);
    padding-left: clamp(80px, 6.944444444444445vw, 120px);
  }
}

.site-logo {
  --tw-bg-opacity: 1;
  background-color: rgb(194 194 194 / var(--tw-bg-opacity));
  width: clamp(100px, 11.11111111111111vw, 200px);
  height: clamp(40px, 4.166666666666666vw, 80px);
}

@media (min-width: 1025px) {
  .navbar {
    display: none;
  }
}

.navbar {
  position: relative;
}

@media (max-width: 1024px) {
  .menu-wrap {
    position: absolute;
    top: 100%;
    right: 0px;
    z-index: -1;
    width: 100%;
    overflow-x: hidden;
    --tw-bg-opacity: 1;
    background-color: rgb(51 51 51 / var(--tw-bg-opacity));
    opacity: 0;
    -webkit-transition-duration: 300ms;
    transition-duration: 300ms;
  }
}

.menu {
  list-style-type: none;
  -webkit-transition-duration: 300ms;
  transition-duration: 300ms;
}

@media (min-width: 1025px) {
  .menu {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
  }

  .menu > :not([hidden]) ~ :not([hidden]) {
    --tw-divide-x-reverse: 0;
    border-right-width: calc(1px * var(--tw-divide-x-reverse));
    border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
    --tw-divide-opacity: 1;
    border-color: rgb(0 0 0 / var(--tw-divide-opacity));
  }
}

@media (max-width: 1024px) {
  .menu {
    --tw-translate-x: 100%;
    -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
    transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  }

  .menu > :not([hidden]) ~ :not([hidden]) {
    --tw-divide-y-reverse: 0;
    border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
    border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
    --tw-divide-opacity: 1;
    border-color: rgb(255 255 255 / var(--tw-divide-opacity));
  }
}

.menu li a {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  font-weight: 700;
  -webkit-transition-duration: 300ms;
  transition-duration: 300ms;
  font-size: clamp(14px, 4.266666666666667vw, 18px);
  padding-right: clamp(10px, 5.333333333333334vw, 30px);
  padding-left: clamp(10px, 5.333333333333334vw, 30px);
}

.menu li a:hover {
  opacity: 0.6;
}

@media (min-width: 1025px) {
  .menu li a {
    font-size: clamp(14px, 1.1111111111111112vw, 18px);
    padding-right: clamp(10px, 1.3888888888888888vw, 30px);
    padding-left: clamp(10px, 1.3888888888888888vw, 30px);
  }
}

@media (max-width: 1024px) {
  .menu li a {
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
    -webkit-box-pack: justify;
    -ms-flex-pack: justify;
    justify-content: space-between;
    --tw-text-opacity: 1;
    color: rgb(255 255 255 / var(--tw-text-opacity));
    padding-top: clamp(10px, 5.333333333333334vw, 30px);
    padding-bottom: clamp(10px, 5.333333333333334vw, 30px);
  }
}

@media (min-width: 1025px) {
  .menu li a svg {
    display: none !important;
  }
}

/* ハンバーガーアイコン */

.menu-icon {
  position: relative;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  cursor: pointer;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
  -webkit-box-pack: justify;
  -ms-flex-pack: justify;
  justify-content: space-between;
  width: clamp(30px, 10.666666666666668vw, 60px);
  height: clamp(18px, 5.866666666666666vw, 30px);
}

.menu-icon span {
  position: absolute;
  display: block;
  width: 100%;
  -webkit-transform-origin: center;
  transform-origin: center;
  --tw-bg-opacity: 1;
  background-color: rgb(0 0 0 / var(--tw-bg-opacity));
  -webkit-transition-duration: 300ms;
  transition-duration: 300ms;
  height: clamp(1px, 0.5333333333333333vw, 4px);
}

.menu-icon span:nth-child(1) {
  top: 0px;
}

.menu-icon span:nth-child(2) {
  top: 0px;
  bottom: 0px;
  margin-top: auto;
  margin-bottom: auto;
}

.menu-icon span:nth-child(3) {
  bottom: 0px;
}

/* トグルのチェック状態に応じた変化 */

.menu-toggle {
  display: none;
}

.menu-toggle:checked ~ .navbar .menu-icon span:nth-child(1) {
  top: 0px;
  bottom: 0px;
  margin-top: auto;
  margin-bottom: auto;
  --tw-rotate: -45deg;
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.menu-toggle:checked ~ .navbar .menu-icon span:nth-child(2) {
  opacity: 0;
}

.menu-toggle:checked ~ .navbar .menu-icon span:nth-child(3) {
  top: 0px;
  bottom: 0px;
  margin-top: auto;
  margin-bottom: auto;
  --tw-rotate: 45deg;
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

.menu-toggle:checked ~ .menu-wrap {
  z-index: 10;
  opacity: 1;
}

.menu-toggle:checked ~ .menu-wrap .menu {
  --tw-translate-x: 0%;
  -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}

デモ

デモはコチラ
※デモではPCサイズの見た目から作成しているので、ハンバーガーメニューの表示を見たい方は検証モードやウィンドウサイズの縮小をして1024px以下でご確認ください!

いかがでしたか?
私が紹介するコードは、いずれもレスポンシブ対応やクロスブラウザの互換性を考慮してベンダープレフィックスなども付けているのでどうしても記述が長くなります…。
ただ、その分汎用性は高くなっているはず!多分、きっと…。
コードはご自由に変更してもらって構わないので、皆さんなりのカスタマイズで使ってみていただいて、もっと使い勝手のいいものがあればぜひ教えてください!

それではまた!

プロットハブはホームページ制作を
支援しています。
ご興味のある方はぜひお気軽に
ご相談ください。

ホームページ制作の一覧へ戻る

全カテゴリ一覧

全タグ一覧

関連記事

コメント

コメントを残す

コメントが承認されると公開されます。※の入力欄は必須項目です

ホームページ制作が毎月5社限定5万5千円から!ご依頼の方はコチラ!