実現したいこと
掲題の通りですが、以下となります。
①ハンバーガーメニューをクリック(下記ソースのid="drawerTrigger"が付与されたbutton要素)
②上記をトリガーに、id="drawerMenu"が付与されたdivタグが開く。メニューがトグルで開くような形です。
一般的なハンバーガーメニューの挙動イメージで相違ありません。
③①と同時に、背景はスクロール出来なくする。つまりメニューの中では、メニューだけがスクロールできるようにする。
Webサイトによくあるハンバーガーメニューになりますが、PCのブラウザでは動作するが、スマートフォンの実機だとうまく動作しないという状態です。
興味深い点が以下です
・スマートフォン(iphone12 / ブラウザSafari)でメニューを開いた際、メニューの中でスクロールは2本指であれば動く。
一本指で普通にスクロールすると反応しない。(Google Chromeであっても同様です)
・pcのマウスであれば問題なくスクロールできるし、背景も動かない。(Google Chrome検証ツール等では動くという意味です)
具体的なソースコード
HTML(WPのためPHP関数が含まれます、該当する部分のみになります)
html
1<div class="l-header__drawer" id="drawerMenu"> 2 <div class="l-header__drawer-inner"> 3 <?php 4 $hamburger_menu_top_args = array( 5 'theme_location' => 'hamburger_menu_top', 6 'menu_class' => 'l-header__drawer-main-list', 7 'container' => '', 8 'items_wrap' => '<ul class="%2$s">%3$s</ul>', 9 'add_li_class' => 'l-header__drawer-main-item', 10 'depth' => 1, 11 ); 12 wp_nav_menu($hamburger_menu_top_args); 13 ?> 14 15 <?php 16 $hamburger_menu_bottom_args = array( 17 'theme_location' => 'hamburger_menu_bottom', 18 'menu_class' => 'l-header__drawer-sub-list', 19 'container' => '', 20 'items_wrap' => '<ul class="%2$s">%3$s</ul>', 21 'add_li_class' => 'l-header__drawer-sub-item', 22 'depth' => 1, 23 ); 24 wp_nav_menu($hamburger_menu_bottom_args); 25 ?> 26 27 <a href="<?php echo esc_url( home_url( '/contact/' ) ); ?>" class="l-header__drawer-button"> 28 <div> 29 <img src="<?php echo get_template_directory_uri(); ?>/assets/images/icon/icon_email.jpg" class="l-header__drawer-button-icon"> 30 <p class="l-header__drawer-button-text">Contact</p> 31 </div> 32 </a> 33 </div> 34</div>
CSS
ハンバーガーメニューをクリックしたら開くメニューのcssの部分です。特に.l-header__drawer-innerのスタイルが該当するかと思います。
.l-header__drawer-innerはドロワーメニューの中のインナーの役割となります。
css
1/ * ここからがドロワーメニュー * / 2.l-header__drawer { 3 position: fixed; 4 z-index: 10; 5 top: 0; 6 left: 0; 7 opacity: 0; 8 visibility: hidden; 9 width: 100%; 10 height: 100%; 11 background: rgba(0, 0, 0, 0) linear-gradient(179deg, #009fdc 0%, #002d78 100%) 0% 0% no-repeat padding-box; 12 transition: 0.4s; 13} 14.l-header__drawer.active { 15 opacity: 1; 16 visibility: visible; 17} 18.l-header__drawer-inner { 19 overflow-y: auto; 20 max-height: 100vh; 21 padding: 90px 0; 22}
JS
JSにおいては、別途</body>の上で
を読み込んでいます。
これは背景スクロールをロックするものであり、おそらくここもスクロールロックに関わっていると思います。(というか犯人?)
参考
https://qiita.com/Naughty1029/items/a3e20a47094f6eb7bf7b
javascript
1const drawerTrigger = document.getElementById("drawerTrigger"); 2const drawerMenu = document.getElementById("drawerMenu"); 3// ドロワーメニューのトリガー 4function setupDrawerTrigger() { 5 if (drawerTrigger && drawerMenu) { 6 drawerTrigger.addEventListener("click", function () { 7 this.classList.toggle("active"); 8 drawerMenu.classList.toggle("active"); 9 if (drawerMenu.classList.contains("active")) { 10 bodyScrollLock.disableBodyScroll(drawerMenu); 11 } else { 12 bodyScrollLock.clearAllBodyScrollLocks(); 13 } 14 }); 15 } else { 16 console.warn('No element found with id "drawerTrigger" or "drawerMenu".'); 17 } 18}
試したこと
・.l-header__drawer-innerに対してoverflow-y: auto;をoverflow: scroll;に変更
・bodyScrollLock.min.jsの読み込み解除、しかしそれはそれで背景が動いてしまうし、iOS環境環境だとbodyタグに対してover-flow:hiddenをかけるハックが効かない
補足情報(FW/ツールのバージョンなど)
検証環境(スマホ実機)
・iOS(iPhone12)
・ブラウザ Safari / Google Chrome

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。