reactjs #scroll #next.js
#reactjs #прокрутка #next.js
Вопрос:
Я искал везде и не могу понять, как сделать этот эффект с помощью react! https://codepen.io/j-v-w/pen/ZEbGzyv
У меня есть сложное решение с использованием framer motion, но я не могу понять, как заставить его работать хорошо. Я продолжаю читать, что я должен отображать на холсте. Я не уверен, как это сделать, используя react / next. Также я думаю, что мне следует предварительно загрузить изображения. Я тоже не совсем уверен, как это сделать.
Помощь приветствуется 🙂
Мое текущее решение, которое заикается:
import Head from "next/head";
import {
motion,
useMotionValue,
useTransform,
useViewportScroll,
} from "framer-motion";
import { useEffect, useState, useRef } from "react";
export default function Home() {
const [Frame, setFrame] = useState("00");
const [checkFrame, setCheckFrame] = useState();
const { scrollY } = useViewportScroll();
const opacityHero = useTransform(scrollY, [400, 700], [1, 0]);
const opacitySecondary = useTransform(scrollY, [700, 1000], [0, 1]);
const xSecondary = useTransform(scrollY, [700, 1000], [-150, -50]);
const refImage = useRef(null);
useEffect(() => {
let currentFrame = parseInt(scrollY.current * 0.1);
setCheckFrame(currentFrame);
}, [scrollY]);
useEffect(() => {
return scrollY.onChange((v) => {
let frame = parseInt(scrollY.current * 0.1).toString();
if (frame.length === 1) {
frame = "0" frame;
}
if (frame > 37) {
frame = 37;
}
setFrame(frame);
});
}, [checkFrame]);
return (
<div>
<div style={{ height: 2400 }} className="bg-white">
<Head>
<title>Avatar</title>
<link rel="icon" href="/favicon.ico" />
<link
rel="preconnect"
href="https://fonts.googleapis.com"
/>
<link
rel="preconnect"
href="https://fonts.gstatic.com"
crossorigin
/>
<link
href="https://fonts.googleapis.com/css2?family=Roboto Mono:wght@400;700amp;display=swap"
rel="stylesheet"
/>
</Head>
<div className="sticky top-0">
<motion.img
src={`/images/testAssets-website/Hero_asset_test${Frame}.webp`}
alt=""
ref={refImage}
style={{ opacity: opacityHero }}
className={`w-screen h-full z-10 ${
opacityHero === 0 ? "hidden" : null
}`}
/>
<motion.div
style={{
opacity: opacitySecondary,
x: xSecondary,
}}
className="text-primary z-0 fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2"
>
Yes, we move.
</motion.div>
</div>
</div>
</div>
);
}
Комментарии:
1. для меня это выглядит довольно гладко. интересно, что вы видите по-другому
2. @imjared На локальном хостинге все гладко, но когда он размещен в netlify, это не так :/