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

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

ただいまの
回答率

90.47%

  • JavaScript

    20935questions

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

  • jQuery

    8339questions

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

SPで「一定スクロールされると固定される」ものが効かない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,719

KeisukeTaniai

score 10

PCでは一定距離スクロール後にヘッダーが固定されるものを実現できたのですが、SPで同じようにしようとすると、タッチの関係上カクカクした動きになってしまいます。

実現したい動きは
キナリノのヘッダーのようななめらかなものです。

jQuery(function() {
  var main = $('.l-container');
  var nav = jQuery('#js-scroll');

  // メニューのtop座標を取得する
  var offsetTop = nav.offset().top;

  var floatMenu = function() {
      // スクロール位置がメニューのtop座標を超えたら固定にする
      if (jQuery(window).scrollTop() > offsetTop) {
          main.addClass('l-container--fixed');
      } else {
          main.removeClass('l-container--fixed');
      }
  }
});

そこで

jQuery(function() {
  var main = $('.l-container');
  var nav = jQuery('#js-scroll');

  // メニューのtop座標を取得する
  var offsetTop = nav.offset().top;

  var floatMenu = function() {
      // スクロール位置がメニューのtop座標を超えたら固定にする
      if (jQuery(window).scrollTop() > offsetTop) {
          main.addClass('l-container--fixed');
      } else {
          main.removeClass('l-container--fixed');
      }
  }
  jQuery(window).scroll(floatMenu);
  jQuery('body').bind('touchmove', floatMenu);
});


jQuery('body').bind('touchmove', floatMenu);
を利用したのですが、こちらも反応なしのようで…

どのように変更または、改善したらよいでしょうか。アドバイスを頂けると幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

僕の方でも実機でテストしたところカクつきましたので色々調査したところ原因が分かったので改めて回答いたします。

 iOSのSafariでカクつく原因

iOSのSafariではスクロール中positionの変更が反映されないためカクついているようです。
それを解決するにはtransform: translate3dを使うといいようです。
ざっと見た感じtranslate3dを使うとHTML要素の処理をGPUに命令するようなので、おそらく別のスレッドで処理されるからちゃんと反映されるのかな?というのが今の理解です。

実装

JSのソースも参考サイトに合わせて修正してみました。
とりあえず適当な名前をつけてHTMLで保存して実機で確認してみてください。

<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
html,body{
    margin: 0;
    height: 200%;
}
#js-scroll{
    position: absolute;
    width: 100%;
    top:50px;
    background-color: #ff00d2;
    height: 50px;
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
}
.l-container--fixed #js-scroll{
    position: fixed;
    top:0;
}
#wrap{
    padding-top: 100px;
    min-height: 560px;
}
</style>
</head>
<body>
<header class="l-container">
<h1>TEST</h1>
<nav id="js-scroll">nav</nav>
</header>
<section id="wrap">CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS</section>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
    jQuery(function() {
        var main = $('.l-container');
         var nav = jQuery('#js-scroll');

        // メニューのtop座標を取得する
        var offsetTop = nav.offset().top;

        $(window).on("scroll",function(){
            main.toggleClass("l-container--fixed", $(this).scrollTop() > offsetTop);
        });
    });
</script>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

+1

スマホの使用の関係で
transform: translate3d(0, 0, 0);がついてないと
処理がカクカクになってしまうみたいです。

http://wp-e.org/2016/07/15/7096/

詳しく解説してくれているので参考にしました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/27 00:50

    こちらのコメント見落としてまして同じ回答しちゃいました。
    無事、解決できてよかったです。

    キャンセル

  • 2016/09/27 23:44 編集

    こちらこそありがとうございました。
    内部の仕組みをより詳しく理解できました!

    キャンセル

0

headerはabsoluteになってますか?なってなければそれが原因な気がします。

<html>
<head>
<style>
html,body{
    margin: 0;
    height: 200%;
}
#js-scroll{
    position: absolute;
    width: 100%;
    top:50px;
    left:0;
    padding: 30px;
    background-color: #ff00d2;
}
.l-container--fixed #js-scroll{
    position: fixed;
    width: 100%;
    top:0;
}
#wrap{
    padding-top: 100px;
}
</style>
</head>
<body>

<header class="l-container">
<h1>TEST</h1>
<nav id="js-scroll">nav</nav>
</header>
<section id="wrap">CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS</section>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
    jQuery(function() {
        var main = $('.l-container');
        var nav = jQuery('#js-scroll');

        // メニューのtop座標を取得する
        var offsetTop = nav.offset().top;

        var floatMenu = function() {
            // スクロール位置がメニューのtop座標を超えたら固定にする
            if (jQuery(window).scrollTop() > offsetTop) {
                main.addClass('l-container--fixed');
            } else {
                main.removeClass('l-container--fixed');
            }
        }
        $(window).scroll(floatMenu);
    });
</script>
</body>
</html>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/26 11:39

    ご回答ありがとうございます!

    headerはabsoluteで指定しております。しかし、スマホからみるとタップしている間はヘッダーが消え離した際にまたヘッダーが現れるような挙動をしております。

    またhtmlの構造も上のとおりに変更してみたのですが、それでも変わりなしと言った感じです。

    touchmoveが効いていないということでしょうか…

    キャンセル

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

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

同じタグがついた質問を見る

  • JavaScript

    20935questions

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

  • jQuery

    8339questions

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