移动端手势滑动时为什么CSS transition不生效? UP主~悦辰 提问于 2026-03-18 20:28:21 阅读 55 移动 我在做一个左右滑动切换卡片的功能,用了 touchstart/touchmove 来计算位移,但给元素加了 transition 后动画完全没效果,是哪里冲突了吗? 试过把 transition 写在初始状态和 active 状态里都不行,控制台也没报错,就是生硬地跳到新位置。 .card { position: absolute; transition: transform 0.3s ease; will-change: transform; } 我来解答 赞 11 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 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 回答 84 浏览 为什么React的CSSTransition在页面切换时动画不连贯? 大家好,我在用React做路由切换动画时遇到问题。用了CSSTransition包裹路由组件,设置进入和离开的CSS类,但切换时动画总是先跳一下再执行过渡效果,这是为什么呢? 我尝试过给容器加fixe... 司空树恺 组件 2026-02-18 12:45:28 1 回答 67 浏览 移动端CSS动画卡顿怎么办? 我在做一个移动端的下拉刷新动画,用的是CSS的transform和transition,但在安卓机上特别卡,iOS还好一点。我试过加了will-change: transform,也用了transla... 设计师利娟 移动 2026-03-12 13:43:20 1 回答 55 浏览 Jotai 的 atom 值更新后,为什么 CSS 动画没触发? 我用 Jotai 管理一个状态,控制元素的显示/隐藏,但状态变了,CSS 的 transition 却没生效,是哪出问题了? 我试过直接改 class,也试过用 useEffect 监听 atom 值... a'ゞ胜换 框架 2026-03-08 12:28:20 2 回答 114 浏览 为什么Vue的Transition组件切换元素时动画没生效? 用Transition包裹动态组件切换时动画完全没反应,检查CSS也没问题,这是什么情况啊? 我的代码是这样的: <template> <div> <button @cl... Mr.海霞 交互 2026-02-19 10:48:41 1 回答 55 浏览 为什么我的CSS动画在移动端卡顿严重? 我在做一个移动端的下拉刷新效果,用的是纯CSS动画,但真机测试时特别卡,尤其是低端安卓机。我试过加了transform: translateZ(0)开启硬件加速,还是没改善。 动画代码是这样的: @k... 若溪 移动 2026-03-28 07:46:16 2 回答 101 浏览 手势缩放动画在触摸结束后自动回弹怎么办? 折腾了一下午移动端手势缩放,用CSS的transform和transition写了个缩放动画。但发现当手指离开屏幕后,元素会自动回弹到原始大小,该怎么让它保持最终状态呢? 我尝试过在touchend时... 松静🍀 交互 2026-02-19 06:24:25 1 回答 64 浏览 为什么在Elements面板里修改CSS后样式没生效? 我在调试一个按钮的hover效果,明明在Elements面板里改了CSS,但页面上完全没反应。我检查了选择器没写错,也在正确的元素上,可就是不生效。是不是被其他样式覆盖了?但我也没看到有删除线划掉啊。... Top丶春彦 工具 2026-03-30 08:03:16 1 回答 65 浏览 CDN加载的CSS样式没生效,本地却正常? 我用CDN部署了网站的静态资源,但发现从CDN加载的CSS样式完全没生效,可本地打开index.html时样式是正常的。是不是CDN缓存的问题?还是MIME类型不对? 我的CSS文件里就写了点基础样式... 皇甫沐言 优化 2026-03-21 17:09:20 1 回答 56 浏览 PostCSS 自定义 parser 为什么没生效? 我试着用 PostCSS 写了个自定义 parser 来处理特殊的 CSS 注释语法,但配置完之后发现根本没走我写的 parser 逻辑。是不是哪里配置错了? 我的 postcss.config.js... 萌新.彦霞 工具 2026-03-19 14:14:19 2 回答 59 浏览 为什么用 mini-css-extract-plugin 提取的 CSS 在 Vue 组件里不生效? 我用 Webpack 的 mini-css-extract-plugin 把 CSS 单独抽出来了,但发现 Vue 组件里的样式根本没加载,页面一片空白。明明 build 出来的 CSS 文件有内容,... Tr° 玉聪 前端 2026-03-10 17:41:19
touchmove 过程中你每时每刻都在用 JS 设置
transform: translateX(...),这时候 transition 根本来不及生效就被下一个值覆盖了。最后松手的时候如果直接跳位置,说明你在 touchend 里也是直接赋值而不是通过 transition 动画。解决办法:滑动过程中关掉 transition,滑动结束再打开。
核心思路就是:手动拖拽的过程不需要 transition(要的是实时跟手),松手后的定位或者回弹才需要 transition 来做平滑动画。