スマホサイトってもう当たり前のように作成してますけど、意外とメニューまわりってどういったJS使うのかとか決まったなかったりするんですよね。
私自身もいろんなJSを実装してスマホ用メニューを作成するんですけど、今回の方法が割と気に入っているので
備忘録としてブログに残しておこうと思います。
たぶんコピペだけで実装できるはず!たぶん笑
では早速。
HTML
HTMLは以下のように記載します。
私の場合はWPに記載するときにheaderに記載します。(大体の方はそうだと思いますが)
今回はPC用とSP用のメニューを完全にわけて作成します。(PCのナビゲーションをスマホに引用しません)
またスマホ用のメニューについてはWPで作成します。
作成方法としては以下です。
①管理画面にログインする
②サイドメニューより「外観」>「カスタマイズ」を選択する
③左メニューにある「メニュー」を選択し、「メニュー新規作成」を選択する
④メニュー名(任意)を入力する(今回は『spNavi』としています)
⑤次へのボタンをクリックし、「項目を追加+」ボタンをクリック
⑥固定ページや投稿から「プラスボタン」が付いている項目をクリックしてスマホ用メニューを作成
⑦階層がある場合は、選択済みの子ページをすこし右にずらせば階層を作成可能
⑧最後に公開ボタンを押して完了
<header> <h1 class="logo"><a href="<?php echo home_url(); ?>"><?php get_template_part( 'h_logo' ); ?></a></h1> <!--.logo--> <!--PC用のナビゲーション--> <nav class="gnav"> <ul class="flexbox fw"> <li><a href="<?php echo home_url(); ?>/test1">PC用メニュー1</a></li> <li><a href="<?php echo home_url(); ?>/test2">PC用メニュー2</a></li> <li><a href="<?php echo home_url(); ?>/test3">PC用メニュー3</a></li> </ul> </nav> <!--.gnav--> <!--SP用のナビゲーション開くためのボタン--> <button class="sp iconMenu"><span class="humburger"></span></button> <!--SP用のナビゲーション--> <?php wp_nav_menu(array( theme_location' => $spNavi, 'container' => 'nav', 'container_id' => 'menu', 'container_class' => 'sp', 'menu' => $spNavi, 'depth' => 0, )); ?> </header> <main id="mainContent"> //これ重要!フッターにも閉じタグかいてね!</body></html>の直前です。
スマホ用のメニューは上記のようにWPで指定してしまいます。
theme_location’ => $spNaviのところは「スマホ用のメニュー」をWPで作成したときのメニュー名を設定してください。
IDやクラスも任意なので好きな名前を付けていただいてOKですが、下記のcssも修正してくださいね笑
ちなみに上記のようなWPの指示をだすとHTMLは以下のように吐き出されます。
<nav id="menu" class="sp"> <ul id="menu-spnavi" class="menu"> <li id="menu-item-10511" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-10511"><a href="URL" aria-current="page">SP用メニュー1</a></li> <li id="menu-item-10512" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-10512"><a href="URL">SP用メニュー2</a></li> <li id="menu-item-10519" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10519"><a href="URL">SP用メニュー3</a></li> <li id="menu-item-10520" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10520"><a href="URL">SP用メニュー4</a></li> </ul> </nav>
CSS
SCSSで先に変数設定を行います。
$siteColor:#039e3e; $subColor:#0d25c2; $set-prefix: '' , -moz- , -webkit- , -ms- , -o-; @mixin PropertySetPrefix($name, $value) { @each $prefix in $set-prefix { #{$prefix}#{$name}: $value; } } @mixin ValueSetPrefix($name, $value) { @each $prefix in $set-prefix { #{$name}: #{$prefix}$value; } }
.pc { display: block; @media screen and (min-width: 800px) { display: none; } } .sp { display: none; @media screen and (max-width: 800px) { display: block; } } /*=================================================================================== スマホ用メニュー ===================================================================================*/ @media screen and (max-width: 800px) { .slideout-menu { position: fixed; top: 0; bottom: 0; width: 300px; min-height: 100vh; overflow-y: scroll; z-index: 0; padding-bottom: 100px; margin-top: 60px; right: 0; //@include PropertySetPrefix(transition, all 0.2s ease-in-out ); display: block; transform: translateX(100%); @media screen and (max-width: 414px) { min-height: inherit; } } .slideout-panel { position: relative; z-index: 1; will-change: transform; min-height: 100vh; } .humburger { position: relative; display: block; width: 100%; height: 2px; @include PropertySetPrefix(transition, all 0.2s ease-in-out ); background-color: #ffffff; &:before, &:after { content: ""; width: 100%; height: 2px; display: block; background-color: #ffffff; position: absolute; @include PropertySetPrefix(transition, all 0.2s ease-in-out ); } &:before { top: -10px; left: 0; } &:after { left: 0; top: 10px; } } /* icon opened */ .slideout-open{ .humburger { background-color: transparent; &:before, &:after{ top: 0; } &:before{ @include PropertySetPrefix(transform, rotate(45deg) ); } &:after{ @include PropertySetPrefix(transform, rotate(-45deg) ); } } .slideout-menu { transform: translateX(0px); } } .slideout-open, .slideout-open body, .slideout-open .slideout-panel { overflow: hidden; //transform: translateX(0px)!important; } .slideout-open .slideout-menu { @include PropertySetPrefix(box-shadow, -1vh 0 5vh 1vh rgba(255,255,255,0.05) ); } .iconMenu { display: block; width: 60px; height: 60px; padding: 12px; @include PropertySetPrefix(transition, all 0.2s ease-in-out ); -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); border: 0; outline: 0; border-left: 1px solid rgba(#ffffff,.25); background: $siteColor; } .slideout-open{ .humburger { background-color: transparent; &:before, &:after{ top: 0; } &:before{ @include PropertySetPrefix(transform, rotate(45deg) ); } &:after{ @include PropertySetPrefix(transform, rotate(-45deg) ); } } .slideout-menu { transform: translateX(0px); } } .slideout-open, .slideout-open body, .slideout-open .slideout-panel { overflow: hidden; } .slideout-open .slideout-menu { @include PropertySetPrefix(box-shadow, -1vh 0 5vh 1vh rgba(255,255,255,0.05) ); } #menu { background: #ffffff; ul { li { width: 100%; text-align: center; position: relative; font-size: 15px; letter-spacing: normal; a { width: calc(100% - 20px); text-decoration: none; color: #000; font-size: 13px; position: relative; padding: 10px; border-bottom: 1px solid #ddd; font-weight: 700; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; &:after { content: ""; width: 3px; height: 0; position: absolute; top: 0; left: 0; display: block; background: linear-gradient(to bottom, $siteColor, #4CAF50); } } &.current_menu_item, &.current_page_item, &.current-page-parent { & > a { background-color: rgba($siteColor,.1); } } ul{ padding-left: 1em; li{ a{ font-weight: 400; &:before{ font-family: "Font Awesome 5 Free"; content: "\f054"; font-weight: 900; z-index: 2; font-size: 11px; color: #333; margin-right: .8em; } &.current_menu_item, &.current_page_item, &.current-page-parent { & > a { background-color: rgba($siteColor,.1); } } } } } .sub-menu{ li{ &.current_menu_item, &.current_page_item, &.current-page-parent { & > a { background-color: rgba($siteColor,.1); } } } } } } } }
slideout.js
slideout.jsをCDNで読み込ませる。
閉じタグのbody直前が不具合なく動くのでおすすめです。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/slideout/1.0.1/slideout.min.js"></script>
jQuery(document).ready(function(){ html = jQuery('html'); dBtn = jQuery('.iconMenu'); dPane = jQuery('#menu'); dBtn.on('click', function () { $(this).toggleClass('opened'); if($(this).hasClass('opened')){ dPane.css('display','block'); }else{ dPane.css('display','none'); } }); var slideout = new Slideout({ 'panel': document.getElementById('mainContent'), 'menu': document.getElementById('menu'), 'padding': 300, 'tolerance': 70, 'duration': 100, 'side': 'right', 'touch': false }); document.querySelector('.iconMenu').addEventListener('click', function () { slideout.toggle(); }); });
これでOKです!スマホメニューどうしようー?と悩んでいる方一度ぜひ実装してみてください!