teratail header banner
teratail header banner
質問するログイン新規登録

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

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

新規登録して質問してみよう
ただいま回答率
85.30%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

1098閲覧

[Next.js]スクロール量に応じた要素移動を軽量に行う

2001Y

総合スコア83

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/07/03 15:32

編集2022/07/03 15:33

0

0

Next.jsでスクロール量に応じた要素移動を行おうとしたところ、以下のコードで実装はできたのですが、処理が重すぎるため、何か軽量化する方法はないでしょうか。ご教授よろしくお願いいたします。PCだと普通に動きますが、スマホだと本当にカクカクになってしまいます。

throttleと呼ばれるものも試したのですが、うまく動作させられてないのか、効果はほとんどありませんでした。というか、間引きすぎても飛び飛びの移動になってしまうため、あまり間引けてないというのもあるかもしれません。あと、will-changeは指定してます。

TypeScript

1useEffect(() => { 2 resize() 3 window.onresize = resize; 4 return () => window.removeEventListener("scroll", resize); 5}); 6function resize() { 7 window.removeEventListener("scroll", resize); 8 let boxElm = document.querySelector("#box_") as HTMLElement; 9 let bodyHeight = document.documentElement.scrollHeight; 10 let boxHeight = boxElm.offsetHeight; 11 onscroll(); 12 window.onscroll = onscroll; 13 function onscroll() { 14 let scrollRate = document.documentElement.scrollTop / bodyHeight; 15 let position = -1 * scrollRate * boxHeight; 16 boxElm.style.transform = `translate3d(0, ${position}px, 0)`; 17 } 18}

カクツキ感はGIFでは表現できなかったため、動作の様子です。
イメージ説明

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

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

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

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

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

guest

回答1

0

直接的な原因かはわかりませんが、useEffectの第二引数が指定されていないのが気になりました。第二引数が指定されていない場合、useEffect内の処理がレンダーごとに毎回呼ばれてしまいます。

今回のケースでは、useEffect内で他のstateを利用していることはないので、空配列を指定すれば良いかと思います。空配列を指定すると、初回のみ呼び出されます。(厳密には複数回呼び出される場合もあります)

https://qiita.com/k-penguin-sato/items/9373d87c57da3b74a9e6

投稿2022/07/14 02:47

yuta_22

総合スコア181

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問