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

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

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

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

Q&A

2回答

996閲覧

特定のスクロール量ごとに色を変化させるスクリプト

waon

総合スコア17

JavaScript

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

0グッド

0クリップ

投稿2021/09/23 09:47

編集2021/09/24 00:36

javascriptを使って、一定のスクロール量(300px)ごとに、固定ヘッダーのロゴの文字が、七色に変化するようなアクションをさせたいです。

スクロール量が

・初期状態 赤
・300pxで 橙
・600pxで 黃
・900pxで 緑
・1200pxで 青
・1500pxで 藍
・1800pxで 紫

で、1800pxスクロールすると7色目に到達、次の300px(=2100px目)では最初の「赤」に戻って、スクロール出来る限り「七色の変化が永久ループする」といった具合です。

ググってみても、特定のスクロール量ごとに色を変化させる方法が見つからなかったので、自分でも考えてみたのですが、例えば、

.color_1~.color_7の7つのクラスを用意して、スクロール量100pxごとに、クラス末尾の数字を1つカウントアップさせて、それをロゴ要素に付与する、という感じです。これを踏まえて、以下のようなコードを書きました。

HTML

1<div style="height:20000px;"> 2 <div id="logo" class="color_1">test</div> 3</div>

CSS

1#logo { position: fixed; left: 0; top: 0;} 2.color_1 { color: #c00;} 3.color_2 { color: #FF8E00;} 4.color_3 { color: #F0FF00;} 5.color_4 { color: #00FF05;} 6.color_5 { color: #1015FF;} 7.color_6 { color: #214A4E;} 8.color_7 { color: #8C15FF;}

JS

1var scroll; 2var current; 3var count = 1; 4 5$(window).scroll(function(){ 6 scroll = $(window).scrollTop(); 7 current = (scroll % 300); 8 9 // もし、スクロール量が300pxになったらクラスのカウントを1つアップさせて、ロゴ要素に(現在のクラスを削除後に)カウントアップさせたクラスを付与。※クラスのカウントが7だった場合は、1に戻す 10 if (current == 0) { 11 if (count < 7) { 12 count++; 13 $('#logo').removeClass().addClass('color_' + count); 14 } 15 else if(count == 7) { 16 count = 1; 17 $('#logo').removeClass().addClass('color_' + count); 18 19 } 20 } 21});

上記コードで、思っていた通りの動きは出来たのですが、3つの課題が出てきました。
それは、

・スクロールが止まるまで、スクリプトが実行されない
・スクロールが止まった時点で、300で割り切れないスクロール量の位置だと、スクリプトが実行されない
・スクロールを上に戻していく場合は、color_のクラス名をカウントダウンして戻していきたいが出来ない

です。

これをどう解決すればいいのか、ご教示いただけると幸いです。
よろしくお願いいたします。

●追記

上記の確認方法についてですが、

・chomeで上記コードを記述したページを表示
・Windows環境で、F12ボタン→開発者ツールを開いてコードが変わる様子を監視
・スクリプトに、$('p').text(scroll); を追加して、スクロール量を画面にリアルタイムで表示させるようにした

という環境でおこないました。

スクロール中もスクロール量の値は随時変動しているのは見れたのですが、.color_のクラスが付与、切り替わるタイミングは、スクロールが止まった時に「300で割り切れた場合のみ」でした。要は、自分が書いているスクリプトが「スクロールが止まった時点で行われる」ということは認識しております。

なので、リアルタイムにそれを処理する方法があるのかと思い、その解決策があればご教示いただきたい次第です。

●追記 21/09/24 09:24
m.ts10806さんにご教示いただいた内容を元に、「直前のscrollTopの位置」と「現在のスクロールの位置」を比較して、上下の判定を行い、カウントをアップ/ダウンさせるスクリプトを書いてみました。

javascript

1var posBefore; 2var posAfter; 3var current; 4var count = 1; 5var color = 1; 6 7posBefore = $(window).scrollTop(); 8 9$(document).on("scroll",$(window),function(){ 10 posAfter = $(this).scrollTop(); 11 12 // スクロール開始位置がスクロール後より大きい 13 if (posAfter < posBefore) { 14 console.log('うえ'); /* チェック用 */ 15 current = (posAfter * 300); 16 17 if (color > 1) { 18 $('#logo').removeClass().addClass('color_' + color); 19 color--; 20 } 21 else if(color == 1) { 22 $('#logo').removeClass().addClass('color_' + color); 23 color=7; 24 } 25 // スクロール開始位置がスクロール後より小さい 26 }else{ 27 console.log('した'); /* チェック用 */ 28 current = (posAfter * 300); 29 30 if (color < 7) { 31 $('#logo').removeClass().addClass('color_' + color); 32 color++; 33 } 34 else if(color == 7) { 35 $('#logo').removeClass().addClass('color_' + color); 36 color=1; 37 } 38 39 } 40 41 //開始位置をスクロール後の位置に書き換える 42 posBefore = posAfter; 43});

ただし、ご教示いただいた内容のうち、以下部分が理解できておらず、

javascript

1current = (count * 300);

上下にスクロールさせる際、スクロール量の増減、color_の増減は出来ているっぽいのですが、300pxごとの変化が出来ず、もっと狭いスパンでcolor_の値が変化していってる状態でした。。

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

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

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

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

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

m.ts10806

2021/09/23 09:55 編集

1つ目と2つ目は原因同じでは。 実行されないわけではなく、そういう仕様なのでは?(割り切れないと何も処理が書いてない) 「実行されない」はどのように確認したのですか?
waon

2021/09/23 10:02 編集

ありがとうございます。 >「実行されない」はどのように確認したのですか? ・chomeで上記コードを記述したページを表示 ・Windows環境で、F12ボタン→開発者ツールを開いてコードが変わる様子を監視 ・スクリプトに、$('p').text(scroll); を追加して、スクロール量を画面にリアルタイムで表示させるようにした です。 スクロール中もスクロール量の値は随時変動しているのは見れたのですが、.color_のクラスが付与、切り替わるタイミングは、スクロールが止まった時に「300で割り切れた場合のみ」でした。 要は、自分が書いているスクリプトが、スクロールが止まった時点で行われる、ということなんですよね。なので、リアルタイムにそれを処理する方法があるのかなぁ、と思い、その解決策があればご教示いただきたかった、という次第です。
m.ts10806

2021/09/23 10:03

質問は編集できるので適宜追記してください。
waon

2021/09/23 10:07

なるほど、ありがとうございます。 理解不足でお手数をお掛けしました。
guest

回答2

0

計算で色番号を算出して前回と異なれば書き換えるでいいんじゃないの?

javascript

1 let precolor = 0; 2 $(window).scroll(function () { 3 scroll = $(window).scrollTop(); 4 color = (Math.floor(scroll / 300) % 7) + 1; 5 6 //デバッグ用 7 $('#logo').text('test:' + scroll + '(' + color + ')'); 8 9 if (precolor !== color) { 10 $('#logo').removeClass().removeClass('color_' + precolor); 11 $('#logo').removeClass().addClass('color_' + color); 12 precolor = color; 13 } 14 });

投稿2022/08/12 10:19

RiaFeed

総合スコア2701

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

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

0

スクロール量って1回で結構行くので、その点だけを判定とすると難しいと思います。
「~以降」くらいで幅を持たせた方が良いでしょうね。

例えば

js

1 current = (count * 300); 2 3 if (scroll > current) {

ただこれだけだと2100以降は300単位じゃなくても変わり続けるので微妙なところはあるのですけど。
カウント用とカラー用を分けた方がいいかもしれません。

js

1var scroll; 2var current; 3var count = 1; 4var color = 1; 5 6$(document).on("scroll",$(window),function(){ 7 scroll = $(window).scrollTop(); 8 current = (count * 300); 9 if (scroll > current) { 10 count++; 11 if (color < 7) { 12 $('#logo').removeClass().addClass('color_' + color); 13 color++; 14 } 15 else if(color == 7) { 16 $('#logo').removeClass().addClass('color_' + color); 17 color=1; 18 } 19 } 20}); 21 22

あとは、「直前のscrollTopの位置」と「現在のスクロールの位置」を比較すれば上がってるか下がってるか判定できますので、カウントを戻していく。
ただ「上げるとき」はscroll > currentの判定条件を逆にする必要があります。

投稿2021/09/23 11:42

編集2021/09/23 14:41
m.ts10806

総合スコア80861

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

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

waon

2021/09/24 00:44

回答ありがとうございます! スクリプトを記述したら、下スクロールの動きがほぼ希望通りの動きになりました。 ご教示いただいた内容をしっかり理解できていないのですが、「直前のscrollTopの位置」と「現在のスクロールの位置」を比較して、上下の判定をする方法を取り入れたスクリプトを追記しました。 ただ、追記に記載しておりますが、一部コードの理解が足りず、、中途半端な感じになっていますよね。。 current = (count * 300)というのは、どういった動きになるのでしょうか? 試しに、countの値を$('p').text(count);などで表示させてみたのですが、count自体は何も値を持っていない??ようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問