react-indiana-drag-scroll – npm
React Indiana Drag Scroll はマウスによるドラッグでスクロールを行う機能を React 内で HTML やコンポーネントに持たせるためのライブラリです。使い方は React Indiana Drag Scroll から渡されるコンポーネントでスクロール範囲を括るのみです。具体的には次です。
import React from "react"; import "./styles.css"; import ScrollContainer from "react-indiana-drag-scroll"; /** min から max までの数字の入った配列を生成する関数 */ const range = (min, max, step = 1) => { return Array.from( { length: (max - min + step) / step }, (v, k) => min + k * step ); }; export default function App() { return ( <div className="App"> <h1>React Indiana Drag Scrollデモ</h1> <p>↓の箱の上でドラッグをするとスクロールが起きます</p> <div style={{ position: "relative", overflow: "hidden", border: "solid" }} > {/** ScrollContainer でドラッグ範囲を括ります */} {/** ignoreElements にドラッグしない部分を指すセレクタを入れると、その上からスクロールできません */} <ScrollContainer ignoreElements={"#not-work-drag"}> <div id="not-work-drag" style={{ height: "100%", background: "rgba(0, 208, 255, 0.8)", position: "absolute", display: "flex", flexDirection: "column", justifyContent: "space-between", left: "12%" }} > <div>この上では</div> <div>ドラッグしてもスクロールしません</div> </div> <div style={{ display: "flex" }}> {range(0, 100).map((i) => ( <div style={{ margin: "1em .25em" }}>{i}</div> ))} </div> </ScrollContainer> </div> </div> ); }
便利ながら分かりにくい props に ignoreElements があります。これに渡すと渡されたセレクタに該当する HTML 要素の上からはドラッグによるスクロールが働かなくなります。
基本的な設定は props から渡せますが内部の HTML 要素にアクセスすることも可能です。外から命令的にスクロール状態を制御するには次のコードの様に HTML 要素から素のJavaScript 的に色々するのがよいです。
export default function App() { const scrollRef = React.createRef(); // scrollRef が変化したら適当な場所に向かってスクロールを実行 React.useEffect(() => { if (!scrollRef.current) { return; } const scrollRefElement = scrollRef.current?.getElement(); scrollRefElement.scrollTo( Math.random() * scrollRefElement.getBoundingClientRect().width, 0 ); }, [scrollRef]); return ( <ScrollContainer ref={scrollRef}> {/* スクロール内容 */} </ScrollContainer> ); }