You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:37:35