使用framer-motion useScroll无法实现SVG元素fill-opacity滚动动画
问题排查与解决方案
针对你在Vite React项目中使用framer-motion实现滚动时<rect>元素fillOpacity动态变化失效的问题,以下是具体排查点和修复方案:
1. 修正SVG元素的尺寸设置
你的SVG设置了style={{ width: "0", height: "0", position: "absolute" }},该元素本身无尺寸会导致内部motion.rect无法被正确识别为可动画元素。如果这个SVG用作遮罩(配合下方img),建议保留定位但调整为实际需要的尺寸:
<svg id={`path-${index}-One`} viewBox="0 0 220 100" xmlns="http://www.w3.org/2000/svg" style={{ width: "100%", height: "100%", position: "absolute", top: 0, left: 0 }} >
2. 调整useTransform的输出值类型
你当前传入的透明度值是字符串类型(["0", "0", "1", "1"]),但fillOpacity属性需要数字类型,改为数字数组可避免类型转换导致的动画失效:
const opacityVal_One = useTransform( scrollYProgress, [0, 0.5, 0.65, 1], [0, 0, 1, 1] // 替换为数字数组 );
3. 确保滚动目标元素有足够滚动范围
useScroll的scrollYProgress变化依赖目标元素(svgTargetRef对应的styles.projectBody容器)的滚动空间。如果容器高度未超过视窗,滚动进度不会产生变化,检查并修改容器样式:
// 示例Sass样式,确保容器高度超过视窗 .projectBody { min-height: 150vh; position: relative; }
4. 验证framer-motion模块导入正确性
确认已正确导入所需模块:
import { motion, useScroll, useTransform } from "framer-motion";
5. 检查useScroll的offset配置是否匹配需求
offset: ["start end", "end start"]表示动画在目标元素顶部到达视窗底部时启动,目标元素底部到达视窗顶部时结束。如果你的滚动触发逻辑不符合这个场景,可调整offset值,比如改为["start start", "end end"](目标元素顶部进入视窗启动,底部离开视窗结束)。
内容的提问来源于stack exchange,提问作者Suryasish Paul
相关产品推荐
相关产品推荐

