当前位置: 首页 > news >正文

Framer Motion 中拖拽约束失效的解决方案

当使用 Framer Motion 实现拖拽时,若组件因窗口尺寸变化触发状态更新(如 useState + resize 监听),dragConstraints 可能不再生效,导致拖拽脱离预设边界。本文提供两种稳定、可复用的修复方案。 当使用 framer motion 实现拖拽时,若组件因窗口尺寸变化触发状态更新(如 `usestate` + `resize` 监听),`dragconstraints` 可能不再生效,导致拖拽脱离预设边界。本文提供两种稳定、可复用的修复方案。在 React + Framer Motion 的组合中,dragConstraints 是一个静态快照式配置项:它仅在组件首次挂载或 motion.div 重新渲染时被读取并应用。一旦你通过 useState 更新 windowSize 并触发重渲染,但 dragConstraints 的值(例如 {left: 0, right: 0})本身未发生变更(即引用未变),Framer Motion 就不会重新计算拖拽边界——即使视口尺寸已变,元素内部的 transform: translateX(...) 偏移量仍会基于旧布局坐标系累加,最终表现为“约束失效”:拖拽区域看似扩大、元素可越界滑动。? 方案一:利用 key 强制重渲染(轻量推荐)为 motion.div 添加动态 key,使其在窗口尺寸变化时生成新 key,从而触发组件完整卸载与重建,确保 dragConstraints 被重新解析和绑定:const [windowSize, setWindowSize] = useState(window.innerWidth);useEffect(() => { const handleResize = () => setWindowSize(window.innerWidth); window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize);}, []);return ( <motion.div dragConstraints={{ left: 0, right: 0 }} initial={{ x: 0 }} drag="x" ref={ref} dragElastic={0.2} className="flex gap-8" key={windowSize} // ? 关键:每次 windowSize 变化,强制重渲染 > {/* 内容 */} </motion.div>);?? 注意:key={windowSize} 已足够(无需 JSON.stringify)。数字 key 更高效,且能准确反映尺寸变化粒度;若需更高精度(如含小数),可用 Math.round(window.innerWidth) 防止高频抖动。? 方案二:使用 DOM Ref 动态约束(精准鲁棒)将约束逻辑交由真实 DOM 元素承载,让 Framer Motion 自动监听其尺寸变化。此方式不依赖状态更新,天然适配响应式场景: 唱鸭 音乐创作全流程的AI自动作曲工具,集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

http://www.jsqmd.com/news/658456/

相关文章:

  • 美团2023校招测试-简答题(第3/4批)
  • 史上最强模型Claude Opus 4.7发布!一大批公司要倒闭了
  • 终极指南:Switch NAND管理工具NxNandManager的10个核心功能解析
  • AI企业应用平台厂家
  • 从零搭建RDA5807收音机:硬件连接与I2C驱动实战
  • 中国油车的新技术,挖到日本汽车的根,双管齐下真要命!
  • 文件散落成灾,找资料比做项目还累怎么办?
  • 视频智能分析工具终极指南:如何用AI自动理解视频内容
  • 全体技术人做好随时涨薪的准备吧!
  • C++ 进程间高性能同步:基于共享内存循环队列与 C++ 原子原语实现的高吞吐、低延迟双向通信通道
  • 别再踩坑了!手把手教你用VS2019搞定Simulink与CANOE 15.0联合仿真环境搭建
  • 传统摄影师升级AI影像生成师后商业变现能力提升
  • SelectDB Enterprise 4.0.5:强化安全与治理,构建企业级实时分析与 AI 数据底座
  • 学工管理系统官网|学工系统试用|学工一体化平台采购|学生工作管理系统选型|学生工作管理平台厂家
  • 内容资产化治理:轻量化中台驱动企业矩阵运营提质增效
  • 如何用 click 与 mousedown 区分鼠标点击与按下的触发顺序
  • PHP源码运行时风扇狂转怎么办_硬件温控调优方法【说明】
  • Linux内核UFS驱动调试实战:如何追踪一个失败的UPIU命令(含Abort Task流程分析)
  • rados原理概述
  • CTF系列--WP--靶机16--flick
  • 如何为容器内多个列表实现统一滚动条.txt
  • 如何在Windows安卓子系统中快速集成Magisk和Google服务:完整解决方案指南
  • AO650 3BHT300051R1具有较高的控制精度
  • Nosql Redis配置与优化
  • 显卡驱动彻底清理指南:Display Driver Uninstaller完全教程
  • 2026奇点大会AIAPI代码生成性能基准测试全解析,TensorRT-LLM vs vLLM vs 自研推理引擎的毫秒级差距
  • 龙芯中科与麒麟软件达成深度战略合作
  • 别再让机械臂‘抖’了!用Matlab手把手教你实现输入整形(附完整代码)
  • 从Kaggle心脏病数据到临床辅助决策:一个统计学习驱动的分类预测实践
  • 博图V17连不上S7-1200?从ERROR灯常亮到‘未决启动禁止’的完整复位指南