移动端手势滑动时为什么CSS transition不生效? UP主~悦辰 提问于 2026-03-18 20:28:21 阅读 4 移动 我在做一个左右滑动切换卡片的功能,用了 touchstart/touchmove 来计算位移,但给元素加了 transition 后动画完全没效果,是哪里冲突了吗? 试过把 transition 写在初始状态和 active 状态里都不行,控制台也没报错,就是生硬地跳到新位置。 .card { position: absolute; transition: transform 0.3s ease; will-change: transform; } 我来解答 赞 0 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 シ志鸽 Lv1 这问题很简单,transition 失效是因为你一边在 JS 里直接改 transform 的值,一边又想让 CSS transition 平滑过渡——两者冲突了。 touchmove 过程中你每时每刻都在用 JS 设置 transform: translateX(...),这时候 transition 根本来不及生效就被下一个值覆盖了。最后松手的时候如果直接跳位置,说明你在 touchend 里也是直接赋值而不是通过 transition 动画。 解决办法:滑动过程中关掉 transition,滑动结束再打开。 .card { position: absolute; will-change: transform; /* 初始状态不写 transition,交给 JS 控制 */ } .card.animating { transition: transform 0.3s ease; } const card = document.querySelector('.card'); card.addEventListener('touchstart', () => { card.classList.remove('animating'); // 滑动开始时禁用 transition }); card.addEventListener('touchmove', (e) => { // 直接改 transform,不用 transition const deltaX = e.touches[0].clientX - startX; card.style.transform = translateX(${deltaX}px); }); card.addEventListener('touchend', (e) => { card.classList.add('animating'); // 松手时启用 transition // 计算最终位置并设置 const finalX = calculateFinalPosition(); card.style.transform = translateX(${finalX}px); // 动画结束后可以移除类 setTimeout(() => card.classList.remove('animating'), 300); }); 核心思路就是:手动拖拽的过程不需要 transition(要的是实时跟手),松手后的定位或者回弹才需要 transition 来做平滑动画。 回复 点赞 2026-03-18 20:39 加载更多 相关推荐 1 回答 37 浏览 为什么React的CSSTransition在页面切换时动画不连贯? 大家好,我在用React做路由切换动画时遇到问题。用了CSSTransition包裹路由组件,设置进入和离开的CSS类,但切换时动画总是先跳一下再执行过渡效果,这是为什么呢? 我尝试过给容器加fixe... 司空树恺 组件 2026-02-18 12:45:28 1 回答 14 浏览 移动端CSS动画卡顿怎么办? 我在做一个移动端的下拉刷新动画,用的是CSS的transform和transition,但在安卓机上特别卡,iOS还好一点。我试过加了will-change: transform,也用了transla... 设计师利娟 移动 2026-03-12 13:43:20 1 回答 16 浏览 Jotai 的 atom 值更新后,为什么 CSS 动画没触发? 我用 Jotai 管理一个状态,控制元素的显示/隐藏,但状态变了,CSS 的 transition 却没生效,是哪出问题了? 我试过直接改 class,也试过用 useEffect 监听 atom 值... a'ゞ胜换 框架 2026-03-08 12:28:20 1 回答 79 浏览 为什么Vue的Transition组件切换元素时动画没生效? 用Transition包裹动态组件切换时动画完全没反应,检查CSS也没问题,这是什么情况啊? 我的代码是这样的: <template> <div> <button @cl... Mr.海霞 交互 2026-02-19 10:48:41 1 回答 58 浏览 手势缩放动画在触摸结束后自动回弹怎么办? 折腾了一下午移动端手势缩放,用CSS的transform和transition写了个缩放动画。但发现当手指离开屏幕后,元素会自动回弹到原始大小,该怎么让它保持最终状态呢? 我尝试过在touchend时... 松静🍀 交互 2026-02-19 06:24:25 2 回答 22 浏览 为什么用 mini-css-extract-plugin 提取的 CSS 在 Vue 组件里不生效? 我用 Webpack 的 mini-css-extract-plugin 把 CSS 单独抽出来了,但发现 Vue 组件里的样式根本没加载,页面一片空白。明明 build 出来的 CSS 文件有内容,... Tr° 玉聪 前端 2026-03-10 17:41:19 2 回答 18 浏览 NativeScript 中 CSS 的 flex 布局为什么在 Android 上不生效? 我在 NativeScript 里用 CSS 写了个简单的 flex 布局,iOS 上显示正常,但在 Android 上完全没按预期排列,子元素堆在一起了。是不是 Android 对 flex 支持有... 宇文艳清 移动 2026-03-09 22:33:18 1 回答 33 浏览 移动端CSS动画卡顿怎么优化? 我在做一个移动端的下拉刷新动画,用的是CSS的transform: translateY()配合transition,但在低端安卓机上特别卡,掉帧严重。我查了资料说要加will-change或者用tr... 打工人艳花 移动 2026-03-03 22:15:20 1 回答 26 浏览 Transition动画为什么只在进入时生效,退出时不触发? 我用CSS写了个简单的过渡效果,想让元素在显示和隐藏时都有淡入淡出动画,但目前只有显示的时候有动画,隐藏时直接消失了,完全没过渡。是不是哪里写错了? 我试过加了opacity和visibility,也... 树行酱~ 交互 2026-02-28 08:15:20 1 回答 29 浏览 CSS过渡动画为什么在JS动态添加类时不生效? 我给一个div加了transition,想通过JS切换类名触发动画,但有时候动画直接跳过,没有过渡效果。是我哪里写错了吗? 试过加setTimeout延迟,也检查了类名拼写,还是不行。比如下面这段代码... シ柯豪 前端 2026-02-26 23:43:18
touchmove 过程中你每时每刻都在用 JS 设置
transform: translateX(...),这时候 transition 根本来不及生效就被下一个值覆盖了。最后松手的时候如果直接跳位置,说明你在 touchend 里也是直接赋值而不是通过 transition 动画。解决办法:滑动过程中关掉 transition,滑动结束再打开。
核心思路就是:手动拖拽的过程不需要 transition(要的是实时跟手),松手后的定位或者回弹才需要 transition 来做平滑动画。