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

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

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

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

jQuery

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

Q&A

解決済

2回答

3238閲覧

画面幅によって処理分けしているヘッダーメニューを画面リサイズ後も動作させたい

nilgiri

総合スコア12

JavaScript

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

jQuery

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

0グッド

2クリップ

投稿2017/05/12 02:10

###前提・実現したいこと
jQueryで、画面幅によって処理分けしているヘッダーメニューがあります。
1025px以上でドロップダウン型、かつスクロール時に縮小版ヘッダーに切り替えます。
1024px以下でドロワー型、縮小版ヘッダーを表示します。

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

画面をリサイズして1024pxをまたいだとき、不具合が生じます。
(ページ読み込み時の画面幅の処理のまま変わらない)

###該当のソースコード

javascript

1if ($(window).width() > 1024) { 2 $('#main_header_nav li, #lower_header_nav li').hover(function() { 3 $('>ul', this).stop(true, true).slideDown('fast'); 4 }, function() { 5 $('>ul', this).stop(true, true).slideUp('fast'); 6 }); 7} 8 9$('#sp_menu_open, #sp_menu_close').click(function() { 10 $('#lower_header_nav').animate({ width: 'toggle' }); 11}); 12 13if ($(window).width() > 1024) { 14 changeHeader(); 15 $(window).scroll(changeHeader); 16} 17 18function changeHeader() { 19 var headerChangeHeight = 200; // 切り替わるタイミング 20 if ($(window).scrollTop() >= headerChangeHeight) { 21 $('#lower_header').slideDown('fast'); 22 } else { 23 $('#lower_header').slideUp('fast'); 24 } 25}

###試したこと
resizeを使って以下の通り書きかえました。

javascript

1dropDownMenu(); 2$(window).resize(dropDownMenu); 3 4function dropDownMenu() { 5 if ($(window).width() > 1024) { 6 $('#main_header_nav li, #lower_header_nav li').hover(function() { 7 $('>ul', this).stop(true, true).slideDown('fast'); 8 }, function() { 9 $('>ul', this).stop(true, true).slideUp('fast'); 10 }); 11 } 12} 13 14drawerMenu(); 15$(window).resize(drawerMenu); 16 17function drawerMenu() { 18 if ($(window).width() <= 1024) { 19 $('#sp_menu_open, #sp_menu_close').click(function() { 20 $('#lower_header_nav').animate({ width: 'toggle' }); 21 }); 22 } 23} 24 25changeHeader(); 26$(window).scroll(changeHeader); 27 28function changeHeader() { 29 if ($(window).width() > 1024) { 30 var headerChangeHeight = 200; // 切り替わるタイミング 31 if ($(window).scrollTop() >= headerChangeHeight) { 32 $('#lower_header').slideDown('fast'); 33 } else { 34 $('#lower_header').slideUp('fast'); 35 } 36 } 37}

ですが、思うような結果が得られません。

1024px以下にリサイズすると、#lower_headerが表示されません。
1025px以上にリサイズすると、#lower_header_navが表示されません。
また、発生条件がわからないのですが、1024px以下にリサイズした後、ドロップダウンしてしまうことがあります。
また同様に、1025px以上にリサイズした後、ドロップダウンが一瞬になる(スライドしない)ことがあります。

調べたり試したり、思いつく限りのことをしましたが、自力では解決できませんでした。
だいぶ混乱しており恐縮ですが、どなたかご教示いただければ幸いです。
よろしくお願いいたします。

###補足情報(言語/FW/ツール等のバージョンなど)
Google CDN jQuery 3.1.0 を利用しています。
回答を得やすくするため、他サイトでも同様の質問をしています。

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

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

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

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

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

guest

回答2

0

こんな感じでどうでしょう。

JavaScript

1$('#main_header_nav li, #lower_header_nav li').hover(function() { 2 if ($(window).width() > 1024) { 3 $('>ul', this).stop(true, true).slideDown('fast'); 4 } else { 5 $('>ul', this).stop(true, true).slideDown('fast'); // とりあえず表示させています。 6 } 7}, function() { 8 if ($(window).width() > 1024) { 9 $('>ul', this).stop(true, true).slideUp('fast'); 10 } else { 11 $('>ul', this).stop(true, true).slideDown('fast'); // とりあえず表示させています。 12 } 13}); 14 15$('#sp_menu_open, #sp_menu_close').click(function() { 16 $('#lower_header_nav').animate({ width: 'toggle' }); 17}); 18 19changeHeader(); 20$(window).scroll(changeHeader); 21 22function changeHeader() { 23 if ($(window).width() > 1024) { 24 var headerChangeHeight = 200; // 切り替わるタイミング 25 if ($(window).scrollTop() >= headerChangeHeight) { 26 $('#lower_header').slideDown('fast'); 27 } else { 28 $('#lower_header').slideUp('fast'); 29 } 30 } else { 31 $('#lower_header').slideDown('fast'); // とりあえず表示させています。 32 } 33}

投稿2017/05/12 02:43

kei344

総合スコア69407

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

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

nilgiri

2017/05/12 03:29

早速の回答ありがとうございます! いただいたコードを試してみたところ、不具合が起こる条件がかなり限定的になってきました。 ●1024px以下で#lower_header_navを一度表示し、再び非表示にした状態で、1025px以上にリサイズ → #lower_header_navが表示されない ●1025px以上で#lower_headerを一度表示し、再び非表示にした状態で、1024px以下にリサイズ → #lower_headerが表示されない コードを読んで、確かにそうなるかも、というところまでは理解できたのですが、解決する方法がわからず… もしよろしければヒントなどご教示いただけないでしょうか。
kei344

2017/05/12 05:44

「どの場合にどうするか」を質問文から正しく追っているわけではない & HTMLが提示されていないので、ちょっとわかりません。 イベントが発生する段階で必要な要素を表示し、必要でない要素を非表示にするなどする必要があると思います。 ひとまずリサイズイベント時に changeHeader(); は必要そうですね。
nilgiri

2017/05/12 13:37

遅くなりました。 アドバイスありがとうございます! 「イベントが発生する段階で必要なものを表示、そうでないものは非表示」というところに注目して、もう一度じっくり見直してみます。 解決次第、ベストアンサー等の対応をさせていただきます。
guest

0

自己解決

質問者です。
下記のコードで解決しました!

JavaScript

1// メニューにホバーしたとき 2$('#main_header_nav li, #lower_header_nav li').hover(function() { 3 // カーソルがのったら開く 4 $('>ul', this).stop(true, true).slideDown('fast'); 5}, function() { 6 // カーソルが外れたら、PCでは閉じ、タブレット・スマホでは開いたまま 7 if ($(window).width() > 1024) { 8 $('>ul', this).stop(true, true).slideUp('fast'); 9 } else { 10 $('>ul', this).stop(true, true).slideDown(0); 11 } 12}); 13 14// ハンバーガーボタン・閉じるボタンをタップしたとき 15$('#sp_menu_open, #sp_menu_close').click(function() { 16 $('#lower_header_nav').animate({ width: 'toggle' }); 17}); 18 19// 画面をリサイズしたとき 20$(window).resize(function() { 21 showLowerHeader(); // #lower_header の表示/非表示 22 if ($(window).width() > 1024) { 23 // PCの場合 24 // #lower_header_nav を表示 25 $('#lower_header_nav').animate({ width: 'show' }, 0); 26 // 上記だけだと display:block になってしまうので、本来の値を再指定 27 $('#lower_header_nav').css({ display: 'inline-block' }); 28 // 子メニューを非表示 (ホバーで表示) 29 $('#main_header_nav li > ul, #lower_header_nav li > ul').slideUp(0); 30 } else { 31 // タブレット・スマホの場合 32 // #lower_header_nav を非表示 (ハンバーガーボタンタップで表示) 33 $('#lower_header_nav').animate({ width: 'hide' }, 0); 34 // 子メニューを表示 35 $('#main_header_nav li > ul, #lower_header_nav li > ul').slideDown(0); 36 } 37}); 38 39// ページを読み込んだとき 40showLowerHeader(); 41 42// スクロールしたとき 43$(window).scroll(showLowerHeader); 44 45// PCのみ、スクロール量に応じて #lower_header を表示/非表示 46function showLowerHeader() { 47 if ($(window).width() > 1024) { 48 var h = 200; // 切り替わるタイミング 49 if ($(window).scrollTop() >= h) { 50 $('#lower_header').slideDown('fast'); 51 } else { 52 $('#lower_header').slideUp('fast'); 53 } 54 } else { 55 $('#lower_header').slideDown(0); 56 } 57}

ポイントは下記の三点でした。

  1. イベントハンドラを1回だけ登録するよう記述する(resizeの中にclickやhoverを書かない)
  2. ifの分岐は各イベントハンドラ内に記述する
  3. 操作対象の要素を条件ごとに確実に表示・非表示する

kei344さん、的確なコードとアドバイスをいただき本当にありがとうございます!

投稿2017/05/29 07:05

nilgiri

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問