Reactでスクロール位置を設定する
最近の Web アプリケーションは、多くのコンテンツを表示する傾向があります。 ユーザーは、探しているものを見つけるためにページ全体をスクロールすることを余儀なくされることがよくあります。
これは悪いユーザー エクスペリエンスです。 解決策は、ユーザーがスクロールせずに特定のページ セクションにスキップできるボタンを作成することです。
この記事では、React で固定スクロール位置を設定する方法について説明します。
Reactでスクロール位置を設定する
まず、DOM 要素への参照を JavaScript 変数に格納する必要があります。 そのために、本質的にネイティブ JavaScript の getElementById() メソッドの代わりとなる useRef() フックを使用できます。
例を見てみましょう:
import { useRef } from "react";
export default function App() {
const welcome = useRef(null);
const about = useRef(null);
const terms = useRef(null);
return (
<div className="App">
<h1 ref={welcome}>Welcome to Web Application</h1>
<h1 ref={about}>About Us</h1>
<h1 ref={terms}>Terms and Conditions</h1>
</div>
);
}
ここでは、useRef() フックを使用して ref 値を生成します。 useRef() フックへの引数は、ref の初期値になります。
フックは、変数に格納できる参照も返します。 welcome、about、および terms 変数に ref 値を保存します。
JSX 内で、3つの要素の ref 属性を、ref を格納した変数に等しく設定します。 これにより、<h1> タグのような DOM 要素が JavaScript 変数に関連付けられます。
次に、これらの要素に直接移動するイベント ハンドラーを作成します。
注: JavaScript 変数への参照を中かっこで囲むことを忘れないでください。 JSX 内に JavaScript 式 (変数への参照など) を記述する必要があります。
次に、1つの引数 (ref 値) を取り、スクロール位置をその DOM 要素の上部境界に設定するイベント ハンドラーを作成しましょう。
const setScrollPosition = (ref) => {
window.scrollTo({
top: ref.current.offsetTop,
behavior: 'smooth',
});
};
このように、イベント ハンドラーは再利用可能で、特定の要素へのスクロールに使用できます。 スクロール位置を設定する必要があるのは、特定の ref 変数をイベント ハンドラーに渡すことだけです。
そのために、React を含む JavaScript ライブラリでネイティブに利用できる window インターフェイスの scrollTo() メソッドを使用します。
ref 値の current プロパティにアクセスして、DOM 要素の上部境界線を決定します。 scrollTo() メソッドを使用して、スクロール位置の上部を DOM 要素の上部境界に設定します。
スムーズなナビゲーションを設定するには、scrollTo メソッドの behavior プロパティも指定します。
次に、コンポーネントの完全なコードを見てみましょう。
import { useRef } from "react";
export default function App() {
const welcome = useRef(null);
const about = useRef(null);
const terms = useRef(null);
const setScrollPosition = (ref) => {
window.scrollTo({
top: ref.current.offsetTop,
behavior: "smooth"
});
};
return (
<div className="App">
<h1 ref={welcome}>Welcome to Web Application</h1>
<h1 ref={about}>About Us</h1>
<h1 ref={terms}>Terms and Conditions</h1>
<div className="buttons">
<button onClick={() => setScrollPosition(welcome)}>
Skip to Welcome
</button>
<button onClick={() => setScrollPosition(about)}>
Skip to 'About Us'
</button>
<button onClick={() => setScrollPosition(terms)}>Skip to terms</button>
</div>
</div>
);
}
この最終的なコードでは、3つのボタンを持つスティッキー フッターを追加します。 この ライブ CodeSandBox デモ を開いて、アプリケーションの動作を確認できます。
いずれかのボタンをクリックすると、特定の DOM 要素にフォーカスしたスクロール位置が設定されます。
これは、onClick イベント ハンドラーで、前に定義した setScrollPosition() 関数を呼び出すためです。 イベント ハンドラを設定する要素の ref 値を格納する変数である 1つの引数を指定します。
Irakli is a writer who loves computers and helping people solve their technical problems. He lives in Georgia and enjoys spending time with animals.
LinkedIn