Scroll

Starter pack

HTMLでは、ページスクロールはページのコンテンツに基づいてブラウザによって処理されます。Three.jsおよびReact Three Fiberでは、Canvasがほとんどの時間で固定され、画面全体を占めます。

つまり、デフォルトではページスクロール3D シーン影響を与えないということです。

これを解決するために、スクロールイベントを監視し、3D シーンを適宜更新する必要があります。

これこそがScrollControlsが完璧に処理することです。

ScrollControls

<ScrollControls/> は、canvas の前にHTML スクロールコンテナを作成します。そのサイズはpagesプロップに基づいています。

1ページは画面の高さ(100vh)に相当します。

3D シーン<Canvas/><ScrollControls/> でラップしてみましょう:

import { ScrollControls } from "@react-three/drei";

// ...

function App() {
  return (
    <>
      <Canvas camera={{ position: [0, 4, 12], fov: 30 }}>
        <ScrollControls pages={5}>
          <Experience />
        </ScrollControls>
      </Canvas>
    </>
  );
}

export default App;

これで3D シーンの前にスクロール可能なコンテナが作成されましたが、まだスクロールしても何も起こりません。

スクロール位置に基づいてシーンを更新する2つの方法を見てみましょう。

Scroll component

要素をスクロールに追随させる最初の方法は、<Scroll/>コンポーネントを使用することです。

これはラッパーコンポーネントであり、スクロール位置に基づいて子要素の位置更新します。

Experience.jsxfoodItemsマップをラップするために追加しましょう:

import { Scroll } from "@react-three/drei";
// ...

export const Experience = () => {
  return (
    <>
      {/* ... */}
      <Scroll>
        {foodItems.map((foodItem, idx) => (
          <FoodItem key={idx} {...foodItem} />
        ))}
      </Scroll>
    </>
  );
};

// ...

これでfood items位置スクロール位置に基づいて更新されますが、1ページあたり1つのアイテムを表示したいです。 (最初の1つはイントロダクションになります)

End of lesson preview

To get access to the entire lesson, you need to purchase the course.