ハンバーガーメニューの挙動は1回目は正常に開閉できるのですが、
2回目からは開閉イベントが同時に発生するという現象に苦戦しています。
クリックした時に、一瞬表示されてすぐに非表示になります。
その際本来ならメニュークリックのタイミングでヘッダーが非表示になるはずが残り続けるという問題もあります。
当初はハンバーガーメニューをヘッダーに、閉じるボタンはクリック後表示されるメニュー内に配置して、
2つのボタンで制御していました。
それをヘッダーのハンバーガーメニューのみで制御することに変更をしたことで、
開閉のイベントが同時に発生するようになったと考えられます。
表示用と非表示用のkeyframeを2つ作りアニメーションさせています。
クリックでclassの付け替えをして表示非表示をさせる処理にしています。
addClassやremoveClassをtoggleClassに変更して制御を試みましたが、解決には至りませんでした。
今のコードの書き方は、開く処理、閉じる処理をそれぞれ記述しています。
開く処理と閉じる処理のクリック判定に同一クラスを設定しているため同時にイベントが発火しているかと思います。
アドバイスのほど何卒よろしくお願いいたします。
gifのイメージになります。
カクカクして見にくいかもしれません・・・
jQuery
1 const $body = $('body') 2 const $navButton = $('.global-hamburger') 3 const $globalNav = $('#globalNav') 4 const $globalMenu = $('#globalMenu') 5 const $closeBtn = $('.global-hamburger') 6 const $subMenu = $globalNav.find('.sub-menu') 7 const $snsMenu = $globalNav.find('.sns-menu') 8 9 const CLASS_ACTIVE = 'active' 10 const CLASS_MOVE = 'move' 11 const CLASS_REMOVE = 'remove' 12 const CLASS_SHOW = 'show' 13 const CLASS_SLIDE_R = 'slide-r' 14 const CLASS_PREVENT = 'scroll-prevent' 15 16 $navButton.on('click', (e) => { 17 $globalNav.show(0, () => { 18 $navButton.toggleClass(CLASS_ACTIVE) 19 $('.header-logo').css('display','none'); 20 $('.header-nav').css('display','none'); 21 $('.dot').css('background-color','#fff'); 22 23 $globalNav.addClass(CLASS_MOVE) 24 25 $('.move #boxT4').on('animationend', () => { 26 $globalMenu.addClass(CLASS_SHOW) 27 28 $globalMenu.find('li > a').on('animationend', () => { 29 for (let i = 0; i < $subMenu.length; i++) { 30 $subMenu[i].classList.add(CLASS_SLIDE_R) 31 } 32 $snsMenu.addClass(CLASS_SLIDE_R) 33 $body.addClass(CLASS_PREVENT) 34 $globalNav.css('background-color', '#3b3b45') 35 }) 36 }) 37 }) 38 if ($globalNav.hasClass(CLASS_MOVE)) { 39 $navButton.on('click', () => { 40 $('.header-logo').css('display','block'); 41 $('.header-nav').css('display','block'); 42 $globalNav.css('background-color', 'transparent') 43 $body.removeClass(CLASS_PREVENT) 44 $globalNav.removeClass(CLASS_MOVE) 45 $globalNav.addClass(CLASS_REMOVE) 46 for (let i = 0; i < $subMenu.length; i++) { 47 $subMenu[i].classList.remove(CLASS_SLIDE_R) 48 } 49 $snsMenu.removeClass(CLASS_SLIDE_R) 50 $globalMenu.removeClass(CLASS_SHOW) 51 52 $globalNav.on('animationend', () => { 53 if ($globalNav.hasClass(CLASS_REMOVE)) { 54 $globalNav.hide(0, () => { 55 $globalNav.removeClass(CLASS_REMOVE) 56 }) 57 } 58 }) 59 }) 60 } 61 }) 62 63 $globalMenu.find('a[href]').on('click', () => { 64 $navButton.trigger('click') 65 })
html
1<nav id="globalNav" class="global-nav"> 2 <div class="global-nav__inner"> 3 <div id="boxT1" class="slide-box slide-box--t1"></div> 4 <div id="boxT2" class="slide-box slide-box--t2"></div> 5 <div id="boxT3" class="slide-box slide-box--t3"></div> 6 <div id="boxT4" class="slide-box slide-box--t4"></div> 7 <div id="globalMenu" class="global-menu-wrapper"> 8 <?php 9 wp_nav_menu(array( 10 'theme_location' => 'global-menu', 11 'menu_class' => 'global-menu' 12 )); 13 ?> 14 <div class="global-links"> 15 <p class="contact-link"><a href="<?php echo home_url('/contact') ?>">お問い合わせ</a></p> 16 <?php get_template_part('/template/common/sns-list'); ?> 17 </div> 18 </div> 19 </div> 20 </nav> 21 <header> 22 <div class="header__column"> 23 <div> 24 <?php getCustomLogo() ?> 25 </div> 26 <div class="column__flex"> 27 <div class="header-nav-box"> 28 <nav class="header-nav"> 29 <?php 30 wp_nav_menu(array( 31 'theme_location' => 'header-menu', 32 'menu_class' => 'header-menu' 33 )); 34 ?> 35 </nav> 36 </div> 37 <div class="global-hamburger-box"> 38 <div class="global-hamburger"> 39 <button id="navButton"> 40 <span class="dot dot--top"></span> 41 <span class="dot dot--bottom"></span> 42 </button> 43 </div> 44 </div> 45 </div> 46 </div> 47 </header>
回答1件
あなたの回答
tips
プレビュー