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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

JavaScript

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

jQuery

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2641閲覧

スマートフォンでslideDownとslideUpが2回効いてしまうのを直したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

JavaScript

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

jQuery

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/08/08 07:05

JS初心者のものです。
スマートフォンでのslideDownとslideUpに関して質問させてください。

現在スクロールすると途中からナビゲーションがslideDownで出てくるサイトを作っています。 ( minedenim.jp のようなサイトです。 )
基本的に1ページで、ナビゲーションにアンカーリンクをつけてその指定場所にスムーススクロールするといったよくあるサイトです。

一部下層ページがあり、下層ページのナビゲーションをTOPトップページのアンカーリンクを指定したところにすると、
PCだとアンカーリンクも効いてナビゲーションがきちんとslideDownで表示されるのですが、
SPから確認するとナビゲーションがslideDownで表示され、slideUpでナビゲーションが戻り、それから再度slideDownでナビゲーションが表示されることが結構あります。(ならないときもあります。)

ここで詰まってしまい解決できないため質問させていただきました。
おそらく書き方が悪いと思いますので、皆様のお力を貸していただきたく思います。

JSは</body>直前で読み込ませております。

ソースコード一式を下記に記載させていただきますので、お力添えをいただけますと非常に助かります。
何卒宜しくお願い致します。

// ===================================================================== // ============================== PC/SP 共通 ============================== // ===================================================================== $(function(){ // biggerlink $('#projects .article').biggerlink(); // matchHeight $('.js-matchHeight').matchHeight(); // smooth scroll $('a[href^=#]').click(function(){ var speed = 1000; var href= $(this).attr("href"); var target = $(href == "#" || href == "" ? 'html' : href); var position = target.offset().top; $("html, body").animate({scrollTop:position}, speed, "easeInOutQuad"); return false; }); }); // PC/SP条件分岐 var windowWidth = $(window).width(); var windowSm = 824; if (windowWidth <= windowSm) { // ========================================= // ========== 横幅824px以下に行う処理を書く ========= // ========================================= $(function(){ // 途中ヘッダー出現 $(window).on("load scroll", function () { if ($(this).scrollTop() > 35) { $(".cb-header").slideDown(); } else { $(".cb-header").slideUp(); } }); }); } else { // ============================================= // ========== 横幅825px超のときに行う処理を書く ========== // ============================================= $(function(){ // 途中ヘッダー出現 $(window).on("load scroll", function () { if ($(this).scrollTop() > 92) { $(".cb-header").slideDown(); } else { $(".cb-header").slideUp(); } }); // firefox用 ヘッダー固定 $(window).load(function (){ if(top.location.href.match(/\#projects$/)){ top.location.href = "index.html#projects", $(".cb-header").slideDown(); } else if(top.location.href.match(/\#people$/)){ top.location.href = "index.html#people" } else if(top.location.href.match(/\#company$/)){ top.location.href = "index.html#company" } }); }); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ヘッダ出現の判定がよくないようです。
質問のコードでは、scrollイベントが呼び出されるたびにslideUpなどの処理がされています。
scrollイベントはちょっとスクロールされる間に何十回と呼び出されるものですので、何十回とslideUpを実行しようとして、結果的におかしくなるのです。
slideUp,slideDownを呼び出すのは、scrollTopの値が、ある閾値(しきいち)を超えた瞬間だけにすれば、おかしな挙動をしなくなります。
具体的にいうと、こんな感じのコードです。

javascript

1var s_old = $(window).scrollTop();// ここに「前回のスクロール位置」を常に保存します 2$(window).on("load scroll", function () { 3 var t = 35; 4 var s = $(this).scrollTop();// 今回のスクロール位置 5 if ((s_old < t)&&(t <= s)){ 6 $(".cb-header").slideDown(); 7 } else if ((s < t)&&(t <= s_old)){ 8 $(".cb-header").slideUp(); 9 } 10 s_old = s; 11});

##追記
iPhoneではscrollTopが前後することがあるのがわかりましたので、スライド中はスライドなうでフラグ管理して、過敏な反応をしないようにしておけば、うまく行くかと思います。

javascript

1var slide_now = false; 2var s_old = $(window).scrollTop();// ここに「前回のスクロール位置」を常に保存します 3$(window).on("load scroll", function () { 4 if (slide_now) return true; 5 var t = 35; 6 var s = $(this).scrollTop();// 今回のスクロール位置 7 if ((s_old < t)&&(t <= s)){ 8 slide_now = true; 9 $(".cb-header").slideDown("slow",function(){ 10 slide_now = false; 11 }); 12 } else if ((s < t)&&(t <= s_old)){ 13 slide_now = true; 14 $(".cb-header").slideUp("slow",function(){ 15 slide_now = false; 16 }); 17 } 18 s_old = s; 19});

投稿2017/08/08 07:36

編集2017/08/08 09:23
zohnam

総合スコア1441

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

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

退会済みユーザー

退会済みユーザー

2017/08/08 08:00

zohnamさま 早速のご回答ありがとうございます。 何度も処理が起こってしまっていたんですね。 とても勉強になります! ですが、いただきましたソースコードを貼ったあと、キャッシュクリアして確認してみましたが、直りませんでした。。
zohnam

2017/08/08 08:06

・横幅825px超用の、92pxをしきい値にしてるほうも同様のコードに変えてみる。 ・smooth scroll処理部分をいったんコメントアウトしてみる(scrollTop関係でいじってるようなので、これはけっこう怪しいです) この2点をやってみてください。
退会済みユーザー

退会済みユーザー

2017/08/08 08:22

頂いた情報でやってみたのですが、やはり直りませんでした。。 せっかくご回答頂いているのにすみません(泣) 直接テストサイト見ていただけたら解決できるかもしれませんが。。
zohnam

2017/08/08 08:31

そうですね。可能ならテストサイトのURLを追記してください。
退会済みユーザー

退会済みユーザー

2017/08/08 09:27 編集

一時的に共有させていただきます。 サイトがご確認いただけたら編集で削除しますので、宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2017/08/08 08:40

PROJECTのサムネイル1つ目から下層ページにいけますので、ご確認をお願い致します。 サイトにアクセスできましたら、ご連絡宜しくお願い致します。
zohnam

2017/08/08 09:07

確認しました。Androidではscrollイベント頻度が少なめなのか、問題が起きてるのは見受けられませんでした。 iPhoneでは、scrollイベントが頻繁におきてるので、多少scrollTopの位置取得のタイミングが前後することがあるようですね。1回のスクロール操作でscrollTopが0,3,2,7,5,9のような取れ方をすることがあります。
退会済みユーザー

退会済みユーザー

2017/08/08 09:26

ご確認ありがとうございます! 追記していただいたものを実行してみます。
退会済みユーザー

退会済みユーザー

2017/08/08 09:34 編集

zohnamさま 追記いただいたところをアップして確認したところ、症状が直り、正常に動作しました! zohnamさまの方でも大丈夫そうでしたら、ベストアンサーに選定させていただきます!
zohnam

2017/08/08 09:38

確認しました。問題なさそうですね。
退会済みユーザー

退会済みユーザー

2017/08/08 10:04

zohnamさま ご確認いただきましてありがとうございました!
退会済みユーザー

退会済みユーザー

2017/08/24 05:04

@zohnamさま 以前こちら解決したのですが、新たに作り直すことになりまた不具合が出てしまいました。 解決したいので、どうかお力お貸しいただけないでしょうか。 よろしくお願いいたします。 https://teratail.com/questions/89586
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問