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

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

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

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

jQuery

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

Q&A

解決済

3回答

6277閲覧

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

KeisukeTaniai

総合スコア16

JavaScript

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

jQuery

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

0グッド

2クリップ

投稿2016/09/21 11:26

編集2016/09/21 11:35

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

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

Javascript

1jQuery(function() { 2 var main = $('.l-container'); 3 var nav = jQuery('#js-scroll'); 4 5 // メニューのtop座標を取得する 6 var offsetTop = nav.offset().top; 7 8 var floatMenu = function() { 9 // スクロール位置がメニューのtop座標を超えたら固定にする 10 if (jQuery(window).scrollTop() > offsetTop) { 11 main.addClass('l-container--fixed'); 12 } else { 13 main.removeClass('l-container--fixed'); 14 } 15 } 16});

そこで

javascript

1jQuery(function() { 2 var main = $('.l-container'); 3 var nav = jQuery('#js-scroll'); 4 5 // メニューのtop座標を取得する 6 var offsetTop = nav.offset().top; 7 8 var floatMenu = function() { 9 // スクロール位置がメニューのtop座標を超えたら固定にする 10 if (jQuery(window).scrollTop() > offsetTop) { 11 main.addClass('l-container--fixed'); 12 } else { 13 main.removeClass('l-container--fixed'); 14 } 15 } 16 jQuery(window).scroll(floatMenu); 17 jQuery('body').bind('touchmove', floatMenu); 18});

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

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

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

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

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

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

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

guest

回答3

0

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

iOSのSafariでカクつく原因

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

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

HTML

1<html> 2<head> 3<meta name="viewport" content="width=device-width,initial-scale=1"> 4<style> 5html,body{ 6 margin: 0; 7 height: 200%; 8} 9#js-scroll{ 10 position: absolute; 11 width: 100%; 12 top:50px; 13 background-color: #ff00d2; 14 height: 50px; 15 -webkit-transform: translate3d(0, 0, 0); 16 transform: translate3d(0, 0, 0); 17} 18.l-container--fixed #js-scroll{ 19 position: fixed; 20 top:0; 21} 22#wrap{ 23 padding-top: 100px; 24 min-height: 560px; 25} 26</style> 27</head> 28<body> 29<header class="l-container"> 30<h1>TEST</h1> 31<nav id="js-scroll">nav</nav> 32</header> 33<section id="wrap">CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS</section> 34<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 35<script> 36 jQuery(function() { 37 var main = $('.l-container'); 38 var nav = jQuery('#js-scroll'); 39 40 // メニューのtop座標を取得する 41 var offsetTop = nav.offset().top; 42 43 $(window).on("scroll",function(){ 44 main.toggleClass("l-container--fixed", $(this).scrollTop() > offsetTop); 45 }); 46 }); 47</script> 48</body> 49</html>

投稿2016/09/26 15:44

編集2016/09/26 15:46
IShix

総合スコア1724

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

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

0

自己解決

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

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

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

投稿2016/09/26 15:26

KeisukeTaniai

総合スコア16

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

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

IShix

2016/09/26 15:50

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

2016/09/27 14:44 編集

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

0

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

HTML

1<html> 2<head> 3<style> 4html,body{ 5 margin: 0; 6 height: 200%; 7} 8#js-scroll{ 9 position: absolute; 10 width: 100%; 11 top:50px; 12 left:0; 13 padding: 30px; 14 background-color: #ff00d2; 15} 16.l-container--fixed #js-scroll{ 17 position: fixed; 18 width: 100%; 19 top:0; 20} 21#wrap{ 22 padding-top: 100px; 23} 24</style> 25</head> 26<body> 27 28<header class="l-container"> 29<h1>TEST</h1> 30<nav id="js-scroll">nav</nav> 31</header> 32<section id="wrap">CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS<br>CONTENTS</section> 33<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 34<script> 35 jQuery(function() { 36 var main = $('.l-container'); 37 var nav = jQuery('#js-scroll'); 38 39 // メニューのtop座標を取得する 40 var offsetTop = nav.offset().top; 41 42 var floatMenu = function() { 43 // スクロール位置がメニューのtop座標を超えたら固定にする 44 if (jQuery(window).scrollTop() > offsetTop) { 45 main.addClass('l-container--fixed'); 46 } else { 47 main.removeClass('l-container--fixed'); 48 } 49 } 50 $(window).scroll(floatMenu); 51 }); 52</script> 53</body> 54</html>

投稿2016/09/22 08:42

IShix

総合スコア1724

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

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

KeisukeTaniai

2016/09/26 02:39

ご回答ありがとうございます! headerはabsoluteで指定しております。しかし、スマホからみるとタップしている間はヘッダーが消え離した際にまたヘッダーが現れるような挙動をしております。 またhtmlの構造も上のとおりに変更してみたのですが、それでも変わりなしと言った感じです。 touchmoveが効いていないということでしょうか…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問