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

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

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

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

JavaScript

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

TypeScript

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

React.js

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

Q&A

解決済

1回答

7798閲覧

React + TypeScript | スクロール位置に応じたclass追加・削除

kerry

総合スコア2

Gatsby

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

JavaScript

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

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2020/07/12 01:26

やりたい事

下記のコンポーネントを、ページトップの時だけclassName={s.scroll}を外し、スクロール量(例えば40px)に応じて前述のclassを戻したいです。(付け直す)

MobileNav.tsx

tsx

1import React, { ReactNode } from 'react'; 2 3import { Link } from 'components/link/Link'; 4 5import s from './Nav.scss'; 6 7interface MobileNavProps { 8 children: ReactNode; 9} 10 11export const MobileNav = ({ children }: MobileNavProps) => { 12 <nav id={s.mobile__nav} className={s.scroll}> 13 {children} 14 </nav> 15);

パッケージ(Headroom.jsなど)を使えば実現できるのですが、
このくらいの実装であれば、自分で書いた方がいいのでは?と考え今に至ります。(結局、Teratailに頼っていますが...)

React + TypeScriptでこの実装を実現するのに、一番スマートな方法をご教授できれば幸いです。
一方的な質問で大変恐縮ですが、何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

scrollの監視はuseEffectを使って windowのscroll監視を行なうと良さそうです。

demo

  1. scroll 判定用のフラグを用意する
  2. scrollイベント監視のセット関数を用意する
  3. 高さが超えているか判定する関数を用意する
  4. scrollイベント監視
  5. コンポーネントが消えたときに監視を停止する

javascript

1// scroll が高さを超えているとき trueになるstate 2const [isHeightOver, setIsHeightOver] = React.useState(false); //1. 3 4useEffect(() => { // 2. 5 const scrollAction = () => { // 3. 6 if (150 > window.scrollY) { // 150の値は 判定したい高さに変更する 7 setIsHeightOver(true); 8 } else { 9 setIsHeightOver(false); 10 } 11 }; 12 window.addEventListener("scroll", scrollAction, { 13 capture: false, 14 passive: true, 15 }); // 4. 16 scrollAction(); // 初期描画時に一度だけ判定する 17 18 return () => { // 5. 19 window.removeEventListener("scroll", scrollAction); 20 }; 21}, []); 22 23return <div className={isHeightOver ? 'isHeightOver' : ''}>classを変更したいhtml</div> 24

投稿2020/07/12 02:27

編集2020/07/12 03:03
wilf

総合スコア300

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

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

kerry

2020/07/12 10:31

ご丁寧な回答ありがとうございます。 また、CodeSandboxでのデモまで作成した頂き、大変恐縮です! 無事動きました。 デモをフォークして、理解を深めようと思います! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問