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

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

ただいまの
回答率

89.65%

jQuery スマホでのトップボタン スクロール上下方向の挙動について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,715

kotori_00

score 44

解決したいこと

トップページボタンのスクロールに上下方向でボタンが表示したり非表示にしたりするスクリプトを実装したのですが、パソコンのブラウザでは問題なく動作するのですがiPhoneのブラウザになると挙動が不安定になり、点滅のような状態になる場合があります。iPhoneブラウザで安定させて表示するようにするにはどうしたらよいでしょうか。

jQuery

上へスクロールするとトップボタンが表示されます。(ただし500pxより小さくなると表示は消えるようにしています)
下へスクロールするとトップボタンが消えます。

<!--topボタンスクール上下の表示、非表示-->
    var topBtn = $('#top-btn');
    topBtn.hide();
    var startPos = 0;
        $(window).scroll(function(){
          var currentPos = $(this).scrollTop();
          if(currentPos > startPos){
            topBtn.fadeOut();
          } else {
            if($(window).scrollTop() < 500){
              topBtn.fadeOut();
            } else {
            topBtn.fadeIn();
            }
          }
          startPos = currentPos;
        });

追記(jQuery)

http://qiita.com/tonkotsuboy_com/items/d32ec6e7a1f6f592d415
上記のサイトにてiPhoneサファリでのios8のスクロールリサイズのキャンセルするコードを追加記述したのですが、iPhoneブラウザでのみうまく動作してくれません。トップボタンが点滅して挙動が不安定です。
上記の参考サイトで横幅、画面回転のときのみリサイズが対応するコード2つを試したのですがどちらも動作の状態は同じです。。
横幅のリサイズアラートはちゃんと動作してくれています。

おそらくこのiPhoneブラウザのスクロールリサイズが原因なのではないかと思うのですが、別の原因など考えられるところがあれば教えてください。

ちなみにサイトurlをのっけておきますので、iPhoneでどういう状態か確認できる方は見てみてください。
http://jikkyo-webdesigner.top/

<!--ウインドウの横幅を保持-->
var currentWidth = window.innerWidth;

window.addEventListener("resize", function() {
    if (currentWidth == window.innerWidth) {
        <!--ウインドウ横幅が変わっていないため処理をキャンセル。-->
        return;
    }

    <!--ウインドウ横幅が変わったのでリサイズと見なす。-->
    <!--横幅を更新-->
    currentWidth = window.innerWidth;
    alert("ウインドウがリサイズしました。");
});
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/12/07 16:14

    こちらの質問が他のユーザから広告だという指摘を受けました
    個人のサービスやプロダクトなどの広告を目的とした投稿は、質問ではないため禁止しています。
    投稿した意図に反し広告と受け取られている場合は、「質問を編集する」ボタンから編集を行い、質問内容と解決したいことを明確に記述しなおしてください。

回答 1

checkベストアンサー

+2

当方iPhone6sですが、「http://jikkyo-webdesigner.top/」では点滅、「http://qiita.com/tonkotsuboy_com/items/d32ec6e7a1f6f592d415 」ではアラート出ずで問題ありませんでした。
処理を見直されてはいかがでしょう。


追記

$(window).scroll(function(){
          var currentPos = $(this).scrollTop();
          if(currentPos > startPos){
            topBtn.fadeOut();
          } else {
            if($(window).scrollTop() < 500){
              topBtn.fadeOut();
            } else {
            topBtn.fadeIn();
            }
          }
          startPos = currentPos;
        });

上記部分を変更したところ、スクロール量500未満時非表示、それ以外は点滅せず常時表示となりました。
単純なことですので一行ずつconsole.logで確認して頂ければ分かるかと。

まずは「点滅」という”動作”とはどうしたら出来るのかを考えてみてください。
それが分かればあとは調整だけかと思います。


追記

<!--topボタンスクール上下の表示、非表示-->
var topBtn = $('#top-btn');
topBtn.hide();
var startPos = 0;
$(window).scroll(function(){
var currentPos = $(this).scrollTop();

//スクロールした時
console.log(currentPos+' > '+startPos);

//スクロールした時且つスクロール量が500の時:topBtn.fadeOut();としていた判定
console.log($(window).scrollTop()+' < 500');

if(currentPos > startPos || $(window).scrollTop() < 500){
topBtn.fadeOut();
} else {
topBtn.fadeIn();
}
startPos = currentPos;
});

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/18 20:04 編集

    時間が経っての返信ですみません。

    上記のコードを見直したのですがうまくいきませんでした。

    <!--topボタンスクール上下の表示、非表示-->
    var topBtn = $('#top-btn');
    topBtn.hide();
    var startPos = 0;
    $(window).scroll(function(){
    var currentPos = $(this).scrollTop();
    if(currentPos > startPos || $(window).scrollTop() < 500){
    topBtn.fadeOut();
    } else {
    topBtn.fadeIn();
    }
    startPos = currentPos;
    });

    上記のようにif文に||の論理演算子を使用してみたのですが、やはりiPhoneでは挙動が不安定で点滅が起こります。
    どういったところを直せばiPhoneで安定して動作するでしょうか。
    ちなみにiOS10でした。

    console.logを使用しても表示されず動作の確認ができません。どうしたらconsole.logで表示されるようになりますか?(console.log(currentPos)など試したのですがブラウザに何も表示されません。)
    代わりにalert();を使用してみたのですが、console.logとの動作確認と何か差があるのでしょうか。

    初心者なものなので、わかりやすく教えていただけると嬉しいです。m(_ _)m

    コード内容訂正しました。

    キャンセル

  • 2016/12/19 09:29

    まず、最初にお話しすべき点は「挙動が不安定」ということでなく、「記載頂いてるコードでの動き」ということです。
    つまり、意図していらっしゃらない動きだとは思いますが、「書いた通りに動いている」ということです。
    iphoneのみおかしいという事ではありません、ですので、コード実行の確実性に関してはご安心ください。

    次に、if文の条件です。記載頂いているcurrentPos > startPos のコードの結果自体はconsole.logでご確認頂いていますでしょうか?
    また、topBtn.fadeIn();とtopBtn.fadeOut();の動きや実行すべきタイミング等は把握されていらっしゃいますでしょうか。
    それらの点をご理解いただければkotori_00様のお力で解決できるかと。
    まずは追記致しましたテストコードにて意図通りの結果となっているか数値をご確認下さい。
    確認の際にはPCブラウザのデバックツール(開発ツール)がおすすめですが、スマホ画面に出力しても良いかもしれません。
    http://www.htmq.com/js/document_write.shtml

    そして、もう一度ご自身のコードと確認した数値を見比べてみて下さい。

    alertとconsole.logの差はデバックの手法としてはやり方であって、画面にダイアログで表示するかコンソール画面に出すかの違いしかありませんが、
    コンソール画面ですといろいろと細かい情報が見れるので、私はconsole.logを利用することが多いです。
    ただし、その時々ですのでキチンと使い分けされたいのであれば、お調べ頂いた方が良いと思います。

    キャンセル

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる