Next.js + React でページ内のスムーススクロールを実装する


こんにちは。Gaji-Labo 横田です。今日は Next.js + React でページ内のスムーススクロールを実装する方法について考えます。

CSS のみで実装する

CSS のみでスムーススクロールを実装するには、html要素に scroll-behavior プロパティを指定します。

html {
    scroll-behavior: smooth;
}

scroll-behavior プロパティの初期値 autosmooth に指定するだけなので、簡単ですね。 Next.js ならグローバルCSSファイル(例えば styles/global.css )の中で指定し、pages/_app.tsx でインポートするだけです。
が、この方法だと特定のページだけでなく全ページのスクロールの挙動に影響してしまいます。

プラグインを利用する

react-anchor-link-smooth-scroll-v2 のようなプラグインを導入することもできます。使い方は簡単で、パッケージをインストール後、特定のページに import して以下のように AnchorLink で id を指定します。

import AnchorLink from 'react-anchor-link-smooth-scroll'


<AnchorLink href="#hoge">Hoge</AnchorLink>
...
<div id="hoge">
 <h2>Hoge</h2>
</div>

が、この方法では AnchorLink を使う必要があるため、スクロール先を指定したいコンポーネントの自由度は下がります。

useRefとscrollIntoView で実装する

特定のページにのみスムーススクロールを実装するには、useRefscrollIntoView を組み合わせるやり方があります。スクロール先を指定したいコンポーネントのカスタマイズがしやすい実装方法です。

実装環境:React 17.0.2

const Page = () => {
    // seRef で要素を参照する
    const refElement = useRef();

    // useCallback を使い、refElement.current まで scrollIntoView() でスクロールする
    const scrollToSection = useCallback(() => {
        refElement.current.scrollIntoView({
          behavior: 'smooth',
        })
      }, [])

    return (
        // スクロール先を指定したいコンポーネントに onClick でセット
        <HogeComponent 
         onClick={scrollToContactSection}
         buttonLabel="hoge"
        />
        ...

        // スクロール先の div 要素に ref 属性で useRef の値を渡し要素を参照する
        <div ref={refElement}>
        ...
        </div>
    )
}

終わりに

ページ内のスムーススクロールの実装も、環境や状況に合わせて複数の実装方法がありますので、適材適所で使い分けできるとよさそうです。
参考になれば幸いです。

Gaji-Laboでは、React経験が豊富なフロントエンドエンジニアを募集しています

弊社ではReactの知見で事業作りに貢献したいフロントエンドエンジニアを募集しています。大きな制作会社や事業会社とはひと味もふた味も違うGaji-Laboを味わいに来ませんか?

もちろん、一緒にお仕事をしてくださるパートナーさんも随時募集中です。まずはお気軽に声をかけてください。お仕事お問い合わせや採用への応募、共に大歓迎です!

求人応募してみる!

投稿者 Yokota Tomoko

運用やアクセシビリティに配慮したHTML/CSSの設計やコンポーネント作成、スタイルガイドの構築、コードレビュー、組み込み、要件の整理、社内進行管理、顧客とのコミュニケーションまで、ジョインしたチームを前に進めるためにあれこれ担当しています。子育てと仕事のバランスを楽しめるよう、日々模索しています。