WordPress

WordPressにjQueryでアコーディオンメニューを追加する

Accordion

WordPressのヘッダーメニューを、スマホとPCで別々にデザインしました。

作り方を忘れないように、備忘録としてメモしておきます。

ヘッダーメニューのデザイン

PC版(768px以上)

一般的なシンプルなヘッダーメニュー。
項目は6つまで追加できる。

ヘッダーメニュー,PC

スマホ版(768px未満)

スマホではアコーディオンメニューに表示が切り替わる。
MENUをタップすると開閉する。

ヘッダーメニュー,スマホ,非表示

アコーディオンメニューを開いたイメージ。
jQueryのslideToggleを使って項目の表示と非表示を切り替えている。

ヘッダーメニュー,スマホ,表示

ヘッダーメニューのデザイン

スマホ用のメニューバーを作る

header.phpのヘッダーメニューに関するコードの下に、メニューバーに関するコードを追加します。
<div>で囲ってidをつけておきます。

<!--ヘッダーメニュー-->
  <?php wp_nav_menu( array(
    'theme_location' => 'header-nav',
    'container' => 'nav',
    'container_class' => 'header-nav cb',
    'container_id' => 'header-nav',
    'fallback_cb' => ''
  ) ); ?>
  <!--スマホ用メニューバー-->
  <div id="navbar" class="cb">
    <i class="fas fa-list-ul"> MENU</i>
  </div>

style.cssに、スマホでのみ表示されるようにメディアクエリを書きます。
僕はSassで書いているので、CSSで書いている方は各自で読み替えてください。
/*スマホ用のメニューバー*/
#navbar {
  background-color: $accentColor;
  color: #fff;
  text-align: center;
  padding: 4px 0;
  cursor: pointer;
  @include md {
    display: none;
  }
}

includeを使って、下のmixinを呼び出しています。
768px以上でdisplay: noneが有効になるため、PCではメニューバーが非表示になります。
$sm: 576px;
$md: 768px;
$lg: 992px;
$xl: 1200px;

@mixin sm {
  @media (min-width: ($sm)) {
    @content;
  }
}
@mixin md {
  @media (min-width: ($md)) {
    @content;
  }
}
@mixin lg {
  @media (min-width: ($lg)) {
    @content;
  }
}
@mixin xl {
  @media (min-width: ($xl)) {
    @content;
  }
}

項目の表示切り替え

メニューの項目はメニューバーがクリックされるまでは非表示にしておきます。
ただし、PCでは最初から表示するようにメディアクエリで分けます。

#header-nav {
  display: none;
  background: $mainColor;
  @include md {
    display: block!important;
  }
}

項目部分のデザイン

項目部分をデザインしていきます。
スマホ用の記述をしたあとに、includeで768pxを超えたときの記述をしています。

.header-nav {
  padding: 0 10px;
  @include md {
    margin: 0 auto;
    box-sizing: border-box;
  }
  ul {
    margin: 0 auto;
    padding: 0;
    letter-spacing: -.4em;
    max-width: $xl;
    list-style: none;
    @include md {
      text-align: center;
    }
  }
  li {
    border-top: 1px solid $baseColor;
    padding: 5px 0;
    letter-spacing: 0em;
    &:first-child {
      border-top: none;
    }
    @include md {
      display: inline-block;
      border-top: none;
      width: calc(100% / 6 - 7px);
      border-left: 1px solid #fff;
      &:last-child {
        border-right: 1px solid #fff;
      }
      transition: background 0.2s ease-in-out;
      &:hover {
        background: $accentColor;
      }
    }
    a {
      display: block;
      padding: 15px 5px;
      color: #fff;
      font-weight: bold;
      font-size: 1em;
      text-decoration: none;
      @include md{
        font-size: 1.1em;
        padding: 0 10px;
        margin-bottom: 3px;
      }
    }
  }
}

myImg
Yuta

li要素が768px以上になるとdisplay: inline-blockが適用されるので、横並びに切り替わります。

jQueryでタップしたら開閉する処理を作る

Accordion

メニューバーをタップ(クリック)すると、メニューの項目に対してslideToggleが実行されます。

jQuery(function(){
  jQuery('#navbar').click(function() {
    jQuery('#header-nav').slideToggle();
  });
});

myImg
Yuta

WordPressではjQueryを省略して$で記述すると動かない点に注意しましょう。