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

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

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

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

レスポンシブWebデザイン

レスポンシブWebデザイン(RWD)は、スクリーンのサイズ、プラットフォーム、オリエンテーションに基づいて様々なデバイスで最適のサイトを生成するのウェブデザインとその開発のアプローチ方法を呼びます。

jQuery

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

Q&A

解決済

2回答

4335閲覧

レスポンシブサイトでスクロールすると現れるナビゲーションについて

gab

総合スコア9

JavaScript

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

レスポンシブWebデザイン

レスポンシブWebデザイン(RWD)は、スクリーンのサイズ、プラットフォーム、オリエンテーションに基づいて様々なデバイスで最適のサイトを生成するのウェブデザインとその開発のアプローチ方法を呼びます。

jQuery

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

0グッド

0クリップ

投稿2015/07/31 13:34

レスポンシブサイトを作成中です。
ナビゲーションが3つあり、ブレークポイントでそれぞれ表示を切り替えるということをしたいのですが、うまくいきません。

1000px以上では、navi1 と navi2 が最初に表示されています。
100pxスクロールするとnavi1 と navi2 が非表示になり、navi3 が表示されます。

1000px未満では、navi1 だけが表示されます。

各ウィンドウサイズでブラウザを更新すると望み通りの動きになりますが、ウィンドウを縮めたり広げたりすると、1000px未満で navi2 と navi3 が表示されてしまうのです。

次のようなコードですが、ウィンドウサイズを変更しても動くようにするにはどうしたらよいでしょうか。

javaScript

1 $(window).on('load resize', function(){ 2 var w = $(window).width(); 3 var x = 1000; 4 var navi1 = $('#pNav'); 5 var navi2 = $('#large-navi'); 6 var navi3 = $('#barNav'); 7 navi3.hide(); 8 9 if (w >= x) { 10 //スクロールが100に達したらボタン表示 11 $(window).scroll(function () { 12 if ($(this).scrollTop() > 100) { 13 navi1.fadeOut(); 14 navi2.fadeOut(); 15 navi3.fadeIn(); 16 } else { 17 navi1.fadeIn(); 18 navi2.fadeIn(); 19 navi3.fadeOut(); 20 } 21 }); 22 } 23

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

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

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

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

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

guest

回答2

0

ベストアンサー

windowリサイズ時に1000px以上だった時の度にスクロールのイベントがbindされてしまっているので余計に不思議な挙動になってしまっているものと思います。
x方向の動きとy方向の動きを同時に考えてしまっているので混乱してしまっているのかなと思いました。

x方向のルール

  1. ブラウザサイズが__1000px__未満の時
  • navi1 常に表示
  • navi2 常に非表示
  • navi3 常に非表示
  1. ブラウザサイズが__1000px__以上の時
  • スクロール量に応じてnavi1, navi2, navi3 の表示方法が変わる

y方向のルール

1, スクロール量が__100px__ 以下の時

  • navi1 表示
  • navi2 表示
  • navi3 非表示

2, スクロール量が__100px__ より大きい時

  • navi1 非表示
  • navi2 非表示
  • navi3 表示

と言う感じになるかと思います。
ですので、下記のような感じにウィンドウ幅が変更された時の処理スクロールの処理を分けて考えると良いかと思います。
A. ウィンドウ幅が変更された時に__1000__px未満かどうか調べて表示を切り替える処理
B. スクロールがあった時にウィンドウ幅が__1000px__以上なら、スクロール量に応じて表示を切り替える処理

レスポンシブWebデザインのタグも付いておりますので、
__A.__の1000px未満の場合の表示切替はCSSのメディアクエリを使うのが良いかと思います。

CSS

1@media screen and (max-width: 999px) { 2 #pNav { 3 display: block !important; 4 } 5 #large-navi, #barNav { 6 display: none !important; 7 } 8}

後は__B__の方法の実装を考えれば良いかと思います。
テキトーに作ったものも載せておきます。動作保証はしていませんので処理を考える参考までに、

javascript

1$(function() { 2 var $w = $(window), 3 overMinWidthFlg = false, 4 timer, 5 $navi1 = $('#pNav'), 6 $navi2 = $('#large-navi'), 7 $navi3 = $('#barNav'); 8 9 $w.on('scroll', function(evt) { 10 clearTimeout(timer); 11 timer = setTimeout(function() { 12 var sT = 0, 13 y = 100; 14 if( overMinWidthFlg ) { 15 sT = $w.scrollTop(); 16 if( sT > y ) { 17 $navi1.fadeOut(); 18 $navi2.fadeOut(); 19 $navi3.fadeIn(); 20 } else { 21 $navi1.fadeIn(); 22 $navi2.fadeIn(); 23 $navi3.fadeOut(); 24 } 25 } 26 }, 100); 27 }) 28 .on('load resize', function(evt) { 29 var w = $w.width(), 30 x = 1000; 31 if( w >= x ) { 32 overMinWidthFlg = true; 33 /* 34 ウィンドウ幅が1000px以上になった時 既に100px以上のスクロールがある可能性があるので 35 スクロール時のイベントを実効してあげる 36 ※load時にウィンドウ幅1000ox以上かるスクロール量が100px以上あると 37 fadeIn, fadeOutの処理になるのでチラつくはずなので、 38 気になるならhide/showなどの別の処理にする必要がある 39 */ 40 $w.trigger('scroll'); 41 } else { 42 overMinWidthFlg = false; 43 /* CSS使わないならここでウィンドウ幅1000px未満の時の表示切替の処理を書いてしまってもOK */ 44 } 45 }); 46});

投稿2015/07/31 16:29

編集2015/08/01 01:39
KiKiKi_KiKi

総合スコア596

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

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

Cf_cwd

2015/08/01 03:30

!importantはよほどのことがない限り使わない方がいいように思えるのですがどうでしょうか?
KiKiKi_KiKi

2015/08/01 04:19 編集

はい。!importantは個人的に邪悪な技だと思っていますのでよほどのことがない限り使わない方が良いと考えています。 ただ、jsの処理とかでなにかしらスタイルを付けてしまう処理とかを書いちゃって、どーなってるのか解らない!ってなる可能性があるのであれば`!important`を書いていたほうが確実かなと考えた程度です。(jsで!important付きのスタイル与えるのメンドーですからw) スタイルの当たる強さのルールとjsでどんな時に何をしているのかが理解しているのであれば!importantを付ける必要性は全くないと考えています。
gab

2015/08/03 01:21

わかりやすく教えていただきありがとうございます。 ご提示いただいたコードで目的の表示になりました。
guest

0

X座標の判定とY座標の判定が混在しています。情報の整理が必要かと思いますがいかがでしょうか。

投稿2015/07/31 15:28

yu-ri

総合スコア634

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

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

gab

2015/08/03 01:18

ご回答ありがとうございます。 x座標とy座標を分けて考えなければ行けなかったのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問