Next.js + React でページ内のスムーススクロールを実装する
こんにちは。Gaji-Labo 横田です。今日は Next.js + React でページ内のスムーススクロールを実装する方法について考えます。
CSS のみで実装する
CSS のみでスムーススクロールを実装するには、html要素に scroll-behavior
プロパティを指定します。
html {
scroll-behavior: smooth;
}
scroll-behavior
プロパティの初期値 auto
を smooth
に指定するだけなので、簡単ですね。 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 で実装する
特定のページにのみスムーススクロールを実装するには、useRef
とscrollIntoView
を組み合わせるやり方があります。スクロール先を指定したいコンポーネントのカスタマイズがしやすい実装方法です。
実装環境: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を味わいに来ませんか?
もちろん、一緒にお仕事をしてくださるパートナーさんも随時募集中です。まずはお気軽に声をかけてください。お仕事お問い合わせや採用への応募、共に大歓迎です!
求人応募してみる!