質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1169閲覧

ハンバーガーメニューを開くと背景を固定し、メニューの中だけはスクロール可能にする

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2023/08/08 09:23

実現したいこと

掲題の通りですが、以下となります。
①ハンバーガーメニューをクリック(下記ソースの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>の上で

<script src="https://cdnjs.cloudflare.com/ajax/libs/body-scroll-lock/3.1.5/bodyScrollLock.min.js"></script>

を読み込んでいます。
これは背景スクロールをロックするものであり、おそらくここもスクロールロックに関わっていると思います。(というか犯人?)

参考
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

大変申し訳ございませんでした。結論から言うと上記のJSは謎に関数化されていたこと、そして関数が実行されていなかったこと。

あとおそらくここが問題で、以下のようにJSを書き換えました。つまり最初はbodyScrollLock.disableBodyScroll(drawerMenu);と書いてましたがスクロールさせたいのはそのインナーだったので、新たにIDを取得し、再度書き直すことでうまくいきました。

正しくは以下が正解↓
bodyScrollLock.disableBodyScroll(drawerMenuInner);

javascript

1// ドロワーメニューのトリガー 2const drawerTrigger = document.getElementById("drawerTrigger"); 3const drawerMenu = document.getElementById("drawerMenu"); 4const drawerMenuInner = document.getElementById("drawerMenuInner"); 5 6if (drawerTrigger && drawerMenu) { 7 drawerTrigger.addEventListener("click", function () { 8 this.classList.toggle("active"); 9 drawerMenu.classList.toggle("active"); 10 if (drawerMenu.classList.contains("active")) { 11 bodyScrollLock.disableBodyScroll(drawerMenuInner); 12 } else { 13 bodyScrollLock.clearAllBodyScrollLocks(); 14 } 15 }); 16}

投稿2023/08/08 09:58

編集2023/08/08 09:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問