windowリサイズ時に1000px以上だった時の度にスクロールのイベントがbindされてしまっているので余計に不思議な挙動になってしまっているものと思います。
x方向の動きとy方向の動きを同時に考えてしまっているので混乱してしまっているのかなと思いました。
x方向のルール
- ブラウザサイズが__1000px__未満の時
- navi1 常に表示
- navi2 常に非表示
- navi3 常に非表示
- ブラウザサイズが__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/08/01 03:30
2015/08/01 04:19 編集
2015/08/03 01:21