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

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

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

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

jQuery

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

Q&A

解決済

2回答

1407閲覧

jQueryのコードが遅延して発火されてしまう

Yariii

総合スコア61

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2019/08/02 02:01

こんにちは。

今、webサイトでスクロールしたらヘッダーのデザインが変化する挙動を実現したく、javascriptとjQueryを使っています。
環境としては、gulpとwebpackを連携させて、jqueryとscriptを1つのファイル「main.js」にコンパイルしています。ローカルでしか挙動は見ていませんがheadで読み込んでいるのはmain.jsのみです。

コンパイルされる前のコードは以下の通り

jQuery

1//--------------------------- 2// 外部jsファイル読み込み 3//--------------------------- 4window.$ = window.jQuery = require('jquery'); 5require('jquery.color'); 6 7//--------------------------- 8// javascriptコード開始 9//--------------------------- 10//スクロールしたらヘッダー変形 11$(function(){ 12 window.addEventListener('scroll',() => { 13 const y = window.scrollY; 14 const header = $('.Header'); 15 const text = $('.Header_nav_li a, .Header_nav_li'); 16 const logo = $('.Header_title_logo'); 17 18 //120以上スクロールしたら発火 19 if (y > 120) { 20 header.animate({ 21 'background-color':'#fff' 22 }); 23 text.animate({ 24 'color':'#333' 25 }); 26 logo.animate({ 27 'fontSize':'26px', 28 'color':'#0c6bb0', 29 'margin-top':'0' 30 }); 31 } else{ 32 header.animate({ 33 'background-color':'transparent' 34 }); 35 text.animate({ 36 'color':'#fff' 37 }); 38 logo.animate({ 39 'fontSize':'33px', 40 'color':'#fff', 41 'margin-top':'10px' 42 }); 43 } 44 }); 45}); 46

これを踏まえて実際に動きを確認してみると、120以上スクロールしたり、また120以下にスクロールを戻しても、中身の指示が5秒後とか、遅くて10秒後とかに発火されてしまいます。
なぜこんなに遅いのでしょうか?

上記コードの書き方には自信がなく、書き方に原因があるとは思うのですが...
すみませんが、原因がわかればご教授いただきたいです。アドバイスとかもあれば是非。。。
よろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

スクロールを検知する度にwindow.addEventListener('scroll',() => { ... });が実行されているため、処理がどんどん溜まり、スクロールを止めた後5秒後、10秒後に発火しているように見えるのではないかと思います。
試しにconsole.log()などでデバッグプリントをすると大量に出力されると思います。

cssで120までのヘッダーと120以降のヘッダーを定義しておいて、jsからはclass,id等を切り替えるだけにしておくと少しは軽くなるかと思います。

投稿2019/08/02 02:21

KaiShoya

総合スコア551

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

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

Yariii

2019/08/05 06:24

やはり動作が早そうなので、こちらのクラス切り替えにしました。ご教授ありがとうございました。
guest

0

htmlのソースと、具体的な挙動の説明があったほうがよいかも

スクロールが止まってから1テンポおいて挙動するという手もあるかも

sample

animate処理なのでuiまで読み込みます

javascript

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> 3<script> 4$(function(){ 5 var timerId; 6 var pos_y=0; 7 var pre_y=1; 8 var option={ 9 "header":[ 10 {"background-color":"#ff0000"}, 11 {"background-color":"#0000ff"}, 12 ], 13 "text":[ 14 {"color":"#ffffff"}, 15 {"color":"#ff0000"}, 16 ], 17 "logo":[ 18 {"fontSize":"26px","color":"#0c6bb0","margin-top":0}, 19 {"fontSize":"33px","color":"#ffffff","margin-top":10}, 20 ], 21 }; 22 23 $( window).on('scroll',()=>{ 24 const y = window.scrollY; 25 pos_y=(y<120)?0:1; 26 clearTimeout(timerId); 27 if(pos_y!==pre_y){ 28 timerId=setTimeout(()=>{ 29 $('.header').animate(option["header"][pos_y]); 30 $('.text').animate(option["text"][pos_y]); 31 $('.logo').animate(option["logo"][pos_y]); 32 pre_y=pos_y; 33 },10); 34 } 35 }).trigger('scroll'); 36}); 37</script> 38<div class="header" style="height:9999px"> 39<br><br><br><br><br> 40<span class="text">text</span> 41<br><br><br><br><br> 42<span class="logo">logo</span> 43<br><br><br><br><br> 44<span class="text">text</span> 45<br><br><br><br><br> 46<span class="logo">logo</span> 47<br><br><br><br><br> 48<span class="text">text</span> 49<br><br><br><br><br> 50<span class="logo">logo</span> 51<br><br><br><br><br> 52</div>

投稿2019/08/02 06:22

編集2019/08/02 07:06
yambejp

総合スコア114784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問