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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

2063閲覧

レスポンシブサイトのグローバルナビの挙動をPC・SPで変えたい

sakio6

総合スコア47

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/11/26 17:11

前提・実現したいこと

お世話になります。よろしくお願い致します。
勉強不足の為、見当違いなご質問になっておりましたら、
ご指摘頂けますと幸いです。

レスポンシブサイトを作成しておりまして、
PCとSPでグローバルナビの動きを下記のように変えたいと思っております。

 ■PCの場合
マウスオンでドロップダウンメニューが表示
マウスアウトでドロップダウンメニューが非表示

 ■SPの場合
0. ハンバーガーボタンタップでスライドダウンで表示
0. 表示されたメニュー内テキストをさらにタップでPCの時にドロップダウンで
表示されたメニューがアコーディオンで表示
0. 工程「2」でタップした部分を再度タップでアコーディオン閉じる
0. ハンバーガーボタンタップでメニュー全体閉じる

 ■PC・SP共通
ウィンドウサイズリサイズして、PCサイズからSPサイズや
SPサイズからPCサイズに変更された際にグローバルメニューは
初期状態に戻る

発生している問題・エラーメッセージ

PC画面サイズまたは、SP用画面サイズでページを読み込んだ場合は、グローバルナビの挙動は問題ありませんが、ウィンドウサイズを変更した際に下記のような挙動になってしまいます。

 ■PCサイズ→SPサイズ
- ハンバーガーボタンクリックでメニューが数回開閉を繰り返して、開く
- メニューを閉じる際も数回開閉を繰り返して閉じる
- 開いたメニュー内テキストにマウスオンでメニューが開いてしまう。

該当のソースコード

HTML

1<header> 2 <div> 3 <div class="barger"> 4 <p> 5 <span></span> 6 <span></span> 7 <span></span> 8 </p> 9 </div> 10 11 <h1>サイト名が入ります。</h1> 12 <nav> 13 14 <ul> 15 <li>大メニュー1 16 <ul> 17 <li><a href="#">大メニュー1の中1</a></li> 18 <li><a href="#">大メニュー1の中2</a></li> 19 <li><a href="#">大メニュー1の中3</a></li> 20 <li><a href="#">大メニュー1の中4</a></li> 21 <li><a href="#">大メニュー1の中5</a></li> 22 </ul> 23 </li> 24 25 26 <li>大メニュー2 27 <ul> 28 <li><a href="#">大メニュー2の中1</a></li> 29 <li><a href="#">大メニュー2の中2</a></li> 30 <li><a href="#">大メニュー2の中3</a></li> 31 </ul> 32 </li> 33 34 35 <li>大メニュー3 36 <ul> 37 <li><a href="#">大メニュー3の中1</a></li> 38 <li><a href="#">大メニュー3の中2</a></li> 39 <li><a href="#">大メニュー3の中3</a></li> 40 <li><a href="#">大メニュー3の中4</a></li> 41 </ul> 42 </li> 43 44 45 <li>大メニュー4 46 <ul> 47 <li><a href="#">大メニュー4の中1</a></li> 48 <li><a href="#">大メニュー4の中2</a></li> 49 </ul> 50 </li> 51 52 53 <li><a href="#">大メニュー5</a></li> 54 55 </ul> 56 57 58 </nav><!-- nav --> 59 </div> 60</header><!-- header -->

CSS

1.barger { 2 display: none; 3} 4 5header { 6 width: 100%; 7 background: #FFF; 8} 9 10header > div { 11 max-width: 1120px; 12 margin: 0 auto; 13 display:-webkit-box; 14 display:-ms-flexbox; 15 display:flex; 16 -webkit-box-pack:justify; 17 -ms-flex-pack:justify; 18 justify-content:space-between; 19 padding: 40px 20px; 20} 21 22header h1 { 23 font-size: 20px; 24 font-weight: bold; 25 width: 50% 26} 27 28header nav { 29 width: 50%; 30 31} 32 33header nav > ul { 34 display:-webkit-box; 35 display:-ms-flexbox; 36 display:flex; 37 -webkit-box-pack:justify; 38 -ms-flex-pack:justify; 39 justify-content:space-between; 40} 41 42header nav > ul > li { 43 position: relative; 44 font-size: 18px; 45 cursor: pointer; 46} 47 48header nav > ul > li ul { 49 background: rgba(237, 237, 232, 0.7); 50 padding: 15px; 51 position: absolute; 52 left: 0; 53 top: 20px; 54 z-index: 100; 55 display: none; 56} 57 58header nav > ul > li ul li { 59 margin: 0 0 15px 0; 60 font-size: 16px; 61} 62 63header nav > ul > li ul li:last-child { 64 margin: 0; 65} 66 67header nav > ul > li:nth-of-type(1) ul { 68 width: 305px; 69} 70 71header nav > ul > li:nth-of-type(2) ul { 72 width: 190px; 73} 74 75header nav > ul > li:nth-of-type(3) ul { 76 width: 190px; 77} 78 79header nav > ul > li:nth-of-type(4) ul { 80 width: 140px; 81} 82 83header nav dd { 84 font-size: 16px; 85 position: absolute; 86 top: 20px; 87 left: 0; 88 z-index: 100; 89 display: none; 90} 91 92@media screen and (max-width:700px) { 93 94.barger { 95 display: block; 96 width: 40px; 97 height: 30px; 98 left: 5px; 99 top: 12px; 100 position: absolute; 101 cursor: pointer; 102} 103 104.barger p, 105.barger p span { 106 display: inline-block; 107 transition: all .4s; 108 box-sizing: border-box; 109} 110 111.barger p { 112 position: relative; 113 width: 100%; 114 height: 100%; 115} 116 117.barger p span { 118 position: absolute; 119 left: 0; 120 width: 100%; 121 height: 4px; 122 background-color: #666; 123 border-radius: 4px; 124} 125.barger p span:nth-of-type(1) { 126 top: 0; 127} 128.barger p span:nth-of-type(2) { 129 top: 0; 130 bottom: 0; 131 margin: auto 0; 132} 133.barger p span:nth-of-type(3) { 134 bottom: 0; 135} 136 137.barger.active p span:nth-of-type(1) { 138 -webkit-transform: translateY(10px) rotate(-315deg); 139 transform: translateY(10px) rotate(-315deg); 140} 141.barger.active p span:nth-of-type(2) { 142 opacity: 0; 143} 144.barger.active p span:nth-of-type(3) { 145 -webkit-transform: translateY(-17px) rotate(315deg); 146 transform: translateY(-17px) rotate(315deg); 147} 148 149header > div { 150 max-width: 1120px; 151 margin: 0 auto; 152 display: block; 153 padding: 20px 0 0 0; 154 position: relative; 155} 156 157header h1 { 158 font-size: 3.8vw; 159 font-weight: bold; 160 width: 100%; 161 margin: 0; 162 text-align: center; 163 border-bottom: 1px solid #000; 164 padding: 0 0 20px 0; 165} 166 167header nav { 168 width: 100%; 169 margin: 0 auto; 170 padding: 15px 0; 171 background: #F2F2F2; 172 display: none; 173} 174 175header nav > ul { 176 display: block; 177 padding: 0 20px; 178} 179 180header nav > ul > li { 181 position: relative; 182 font-size: 18px; 183 cursor: pointer; 184 border-bottom: 1px solid #000; 185 margin: 0 0 20px 0; 186 padding: 0 0 20px 0; 187} 188 189header nav > ul > li:after { 190 content: ""; 191 display: block; 192 width: 10px; 193 height: 10px; 194 position: absolute; 195 right: 5px; 196 top: 10px; 197 border-top: 2px solid #000; 198 border-right: 2px solid #000; 199 -webkit-transform: rotate(135deg); 200 transform: rotate(135deg); 201} 202 203header nav > ul > li.open:after { 204 content: ""; 205 display: block; 206 width: 10px; 207 height: 10px; 208 position: absolute; 209 right: 5px; 210 top: 10px; 211 border-top: 2px solid #000; 212 border-right: 2px solid #000; 213 -webkit-transform: rotate(-45deg); 214 transform: rotate(-45deg); 215} 216 217header nav > ul > li ul { 218 background: none; 219 padding: 15px 0; 220 position: initial; 221 left: 0; 222 top: 20px; 223 z-index: 100; 224 display: none; 225} 226}

Javascript

1$(document).ready(function() { 2 var checkResize; 3 $(window).on('load resize', function() { 4 clearTimeout( checkResize ); 5 checkResize = setTimeout( resizing, 100 ); 6 }); 7 8 function resizing() { 9 var w = $(window).width(); 10 11 12 if( w > 700 ) { 13 $(function() { 14 var nav = $('nav > ul'); 15 $('li', nav).mouseover(function() { 16 $('ul', this).stop().slideDown('fast'); 17 }) 18 .mouseout(function() { 19 $('ul', this).stop().slideUp('fast'); 20 }); 21 22 }); 23 24 25 } else { 26 $(function(){ 27 $(".barger").click(function(){ 28 $("header nav").slideToggle(); 29 $(this).toggleClass("active"); 30 }); 31 32 $("header nav > ul > li").click(function(){ 33 $(this).children("ul").slideToggle(); 34 $(this).toggleClass("open"); 35 36 }); 37 }); 38 } 39 40 } 41});

試したこと

単純に考えて、リサイズする度にリロードするようにしました。
結果として、グローバルナビの挙動は正常に動きましたが、
リサイズの度にリロードされるのが見た目的にも宜しくないので、辞めました。

次に、クリックされた時に追加されるクラスやスタイルを700px以上にリサイズされた時に削除するようにしました。
クラスやスタイルは削除されたのですが、SP時の不具合は解消されませんでした。

補足情報(FW/ツールのバージョンなど)

クラスやスタイルを削除する記述を追加したソースが下記になります。

Javascript

1$(document).ready(function() { 2 var checkResize; 3 $(window).on('load resize', function() { 4 clearTimeout( checkResize ); 5 checkResize = setTimeout( resizing, 100 ); 6 }); 7 8 function resizing() { 9 var w = $(window).width(); 10 11 12 if( w > 700 ) { 13 $(function() { 14 var nav = $('nav > ul'); 15 $('li', nav).mouseover(function() { 16 $('ul', this).stop().slideDown('fast'); 17 }) 18 .mouseout(function() { 19 $('ul', this).stop().slideUp('fast'); 20 }); 21 22 }); 23 24 $("header div").removeClass("active"); 25 $("nav").removeAttr("style",""); 26 $("nav li").removeClass("open"); 27 $("nav ul").removeAttr("style",""); 28 29 30 } else { 31 $(function(){ 32 $(".barger").click(function(){ 33 $("header nav").slideToggle(); 34 $(this).toggleClass("active"); 35 }); 36 37 $("header nav > ul > li").click(function(){ 38 $(this).children("ul").slideToggle(); 39 $(this).toggleClass("open"); 40 41 }); 42 }); 43 } 44 45 } 46});

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. resizeイベントなど複数回呼ばれるイベントの中で別のイベントを登録しない。

(登録するなら、適切にイベントを除去する)
0. $(document).ready(function() {});$(function(){});に置き換える。
0. そして$(function(){});の中に$(function(){});を置かない(意味が無いので)。

resizeイベントでは現在の幅(というか判定)を変数に保存し、clickイベントやmouseoverイベントの「閉じる処理」を行う。
で、clickイベントやmouseoverイベントは必要な箇所に付けた上で、関数内で先ほどの変数を確認し、必要なら動き、必要でないなら処理をしない、という設計のほうがよいと思います。

js

1$( function() { 2 var checkResize, size; 3 $( window ).on( 'load resize', function() { 4 clearTimeout( checkResize ); 5 checkResize = setTimeout( resizing, 100 ); 6 } ); 7 function resizing() { 8 size = ( $( window ).width() > 700 ); 9 // 適当リセット(未検証) 10 $( 'nav > ul ul, header nav, header nav > ul > li > ul' ).stop().slideUp( 'fast' ); 11 $( '.active' ).removeClass( 'active' ); 12 $( '.open' ).removeClass( 'open' ); 13 } 14 var nav = $( 'nav > ul' ); 15 $('li', nav ).mouseover( function() { 16 if ( !size ) return; 17 $( 'ul', this ).stop().slideDown( 'fast' ); 18 } ) 19 .mouseout( function() { 20 if ( !size ) return; 21 $( 'ul', this ).stop().slideUp( 'fast' ); 22 } ); 23 $( '.barger' ).click( function() { 24 if ( size ) return; 25 $( 'header nav' ).slideToggle(); 26 $( this ).toggleClass( 'active' ); 27 } ); 28 $( 'header nav > ul > li' ).click( function() { 29 if ( size ) return; 30 $( this ).children( 'ul' ).slideToggle(); 31 $( this ).toggleClass( 'open' ); 32 } ); 33} ); // 未検証

投稿2018/11/26 17:35

kei344

総合スコア69398

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

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

sakio6

2018/11/27 05:54

kei344様 ご回答頂きありがとうございます。 基本的な部分もご教示頂き大変勉強になりました。 まだまだ勉強不足なのを痛感しております。基本的な部分などもこれからも勉強していきたいと思います。 また、機会がありましたら是非ご指導頂けますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問