daigo01090118
@daigo01090118 (daigo ikeda)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

スクロールで出てくる要素について

解決したいこと

現在webサイトを作成しており、下記codepenに記述しているようにスクロールで「○」が出てくるようにしています。
動きとしては上手くいっているのですが、スクロールが早い場合中途半端な位置で「○」が止まってしまいます。
よく見るサイトではどんなに早くスクロールしても表示が中途半端になることはないので気になりました。

今回はJSのスクロールイベントでtop値を変化させているのですが、そもそもスクロールイベントで実装するのは間違っていますでしょうか?

See the Pen Untitled by dai (@dai0102344) on CodePen.

0

2Answer

推測で申し訳ありませんが失礼します……
「スクロール速度によって○の出方が変わる」という現象は、「実のところscrollイベントは、思った以上に疎らに発火している」というのが原因だと言えそうです。
window.scrollY <= rowHeight(縦スクロール幅が.row(○)の縦幅より小さい)の時に、○の上端位置を変更する処理が動いていますが、勢いよくスクロールすると、if内の条件が満たされない=ifブロック内の処理が行われない、となるので、中途半端な位置になります。
中途半端に○が出てくる状態をどうにかしようとするならば、条件分岐なしで処理を必ず発火させるようにすれば良いです。

document.addEventListener('scroll', () => {
  row.style.top = `-${window.scrollY}px`;
});

で、中途半端に○が出てくる状態は解決されるものの、○が無制限で上に飛んでいってしまいます。
ここで、複数の数値を入力すると最小値を出力してくれるMath.min関数でそれっぽく仕上げまして、

document.addEventListener('scroll', () => {;
  row.style.top = `-${Math.min(rowHeight, window.scrollY)}px`;
})

で、それらしい動きをするようにできます。

2Like

Comments

  1. @daigo01090118

    Questioner

    返信が遅くなり大変申し訳ありません。
    ご回答いただいた方法で、不具合が解決いたしました!
    ありがとうございます。

スクロールイベントは、スクロールするたびに処理が走ってしまい、パフォーマンスが悪くなる可能性があります。
軽い処理だと問題ないとは思いますが、パフォーマンスを気にするのであれば「Intersection Observer」を利用することをおすすめします。

若干動きが異なりますが、似たような動きを「Intersection Observer」を用いて再現してみました。
ご参考になれば幸いです。

See the Pen Untitled by yotty (@yotty) on CodePen.

1Like

Comments

  1. @daigo01090118

    Questioner

    なるほど。。。。。
    そういった方法もあるのですね、
    大変勉強になります!
    ご回答いただきありがとうございます!

Your answer might help someone💌