Fundamentals
Core
Master
Shaders
Scroll
En HTML el desplazamiento de la p谩gina es manejado por el navegador basado en el contenido de la p谩gina. En Three.js y React Three Fiber, el Canvas est谩 la mayor parte del tiempo fijo tomando toda la pantalla.
Esto significa que por defecto el desplazamiento de la p谩gina no tiene ning煤n efecto en la escena 3D.
Para remediar esto, necesitamos escuchar el evento de desplazamiento y actualizar nuestra escena 3D en consecuencia.
Eso es exactamente lo que ScrollControls de Drei hace a la perfecci贸n.
ScrollControls
<ScrollControls/>
crea un contenedor de desplazamiento HTML frente al canvas. Su tama帽o se basa en la prop de pages.
Una p谩gina equivale a la altura de la pantalla (100vh).
Envolvamos nuestra escena 3D en el <Canvas/>
con <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;
Ahora tenemos un contenedor desplazable frente a nuestra escena 3D, pero a煤n no pasa nada cuando nos desplazamos.
Vamos a descubrir dos maneras de actualizar la escena basada en la posici贸n del desplazamiento.
Componente Scroll
La primera manera de hacer que los elementos sigan el desplazamiento es usar el componente <Scroll/>
.
Es un componente contenedor que actualiza la posici贸n de sus hijos en funci贸n de la posici贸n de desplazamiento.
Vamos a a帽adirlo para envolver nuestro mapa foodItems
en Experience.jsx
:
import { Scroll } from "@react-three/drei"; // ... export const Experience = () => { return ( <> {/* ... */} <Scroll> {foodItems.map((foodItem, idx) => ( <FoodItem key={idx} {...foodItem} /> ))} </Scroll> </> ); }; // ...
Ahora la posici贸n de los food items se actualiza en funci贸n de la posici贸n del scroll, pero queremos un elemento por p谩gina. (Empezando desde el segundo ya que el primero ser谩 una introducci贸n)
End of lesson preview
To get access to the entire lesson, you need to purchase the course.