Smooth Scroll 在 Safari 上为什么不生效? 熙然~ 提问于 2026-02-23 18:11:16 阅读 52 交互 我在项目里用了 scroll-behavior: smooth; 实现页面锚点平滑滚动,Chrome 和 Firefox 都没问题,但在 Safari 上完全没效果,还是瞬间跳转。 查了下资料说 Safari 支持需要加前缀?但我试了 -webkit-scroll-behavior: smooth; 也没用。是不是还有别的写法或者需要 JS 回退方案? html { scroll-behavior: smooth; } 滚动效果 我来解答 赞 20 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 Tr° 议谣 Lv1 Safari确实对原生的 scroll-behavior: smooth; 支持不太好,直到最近几个版本才有部分支持,但还是不太稳定。这里有个靠谱的JS回退方案: function smoothScrollTo(target) { const targetElement = document.querySelector(target); if (!targetElement) return; const targetPosition = targetElement.getBoundingClientRect().top + window.scrollY; let startPosition = window.scrollY; const distance = targetPosition - startPosition; let startTime = null; function animation(currentTime) { if (startTime === null) startTime = currentTime; const timeElapsed = currentTime - startTime; const run = ease(timeElapsed, startPosition, distance, 1000); window.scrollTo(0, run); if (timeElapsed < 1000) requestAnimationFrame(animation); } function ease(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } requestAnimationFrame(animation); } // 使用示例 document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); smoothScrollTo(this.getAttribute('href')); }); }); 这个方案用 requestAnimationFrame 来实现动画效果,兼容性更好。顺便说下,这种问题处理起来挺烦人的,不同浏览器总是有各种小差异,不过用JS回退算是比较稳妥的办法了。 回复 点赞 2026-03-26 16:10 紫萱 Lv1 应该是 Safari 对 scroll-behavior 的支持还不完整(尤其旧版本),而且加 -webkit- 前缀确实没用——这属性目前还不支持前缀。 先确认 Safari 版本(14+ 才支持),如果还要兼容旧版,直接上 JS 回退方案:document.documentElement.style.scrollBehavior = 'smooth' 或者用 scrollIntoView({ behavior: 'smooth' }) 替代锚点跳转,实测 Safari 全兼容。 回复 点赞 4 2026-02-23 18:13 加载更多 相关推荐 1 回答 66 浏览 为什么 smooth scroll 在 Vue 里有时候不生效? 我在 Vue 项目里用 scrollIntoView({ behavior: 'smooth' }) 实现平滑滚动,但有时候完全没效果,直接跳转。试过加 CSS 的 scroll-behavior: ... 闲人星宇 交互 2026-03-25 17:30:22 2 回答 83 浏览 移动端的Smooth Scroll为什么失效了? 大家好,我在给网页加平滑滚动效果时遇到个怪问题。用了scroll-behavior: smooth后,桌面端点击锚点都能平滑滚动,但手机测试直接跳转。我查了CSS优先级没问题,还试过用JavaScri... 司空子璐 交互 2026-02-04 14:01:25 2 回答 42 浏览 为什么给 scroll 事件加 passive: true 后 preventDefault 不生效了? 我在做一个自定义下拉刷新功能,需要监听 scroll 事件并阻止默认滚动,但加上 passive: true 后 preventDefault() 就报错了,说不能在 passive 事件里调用。可不... 百里春景 交互 2026-03-05 23:14:19 1 回答 65 浏览 H5页面在iOS Safari上为什么无法自动播放音频? 我做了一个H5活动页,需要进入页面就自动播放背景音乐,但在iPhone的Safari里死活播不了,安卓和PC浏览器都正常。查了说是iOS限制,但具体怎么绕过啊? 我已经试过加muted属性然后用户点击... 设计师栾诺 移动 2026-03-23 12:53:17 2 回答 59 浏览 Better Scroll滚动区域高度不生效是怎么回事? 我在用 Better Scroll 做一个下拉列表,明明设置了容器高度,但内容还是撑开了整个页面,根本没法滚动。试过给 wrapper 加 overflow: hidden 也没用。 这是我的 CSS... ___秋花 交互 2026-03-16 01:23:22 2 回答 113 浏览 为什么HLS直播流在Safari能播,Chrome却黑屏? 我在用 video.js 播 HLS 直播流,Safari 正常播放,但 Chrome 打开就黑屏没画面,控制台也没报错,这到底啥情况? 查了下说是 Chrome 不原生支持 HLS,得靠 Media... 东方素伟 交互 2026-03-11 04:32:23 2 回答 60 浏览 Safari调试时为什么无法在控制台看到console.log输出? 我在用Safari调试移动端网页时,明明写了console.log('测试'),但控制台完全没反应,折腾了一下午没解决。之前用Chrome没问题,换到Safari后: 1. 已经在设置里打开了「开发」... 慧娜 Dev 移动 2026-02-17 19:42:26 2 回答 66 浏览 React中scroll事件触发的动画为什么会有延迟和卡顿? 我用React做页面滚动动画时遇到了问题。当我用window.addEventListener('scroll')监听滚动位置,并用useState更新动画数值时,动画总会有半秒左右的延迟,滑动页面时... ♫乐佳 交互 2026-02-11 13:20:27 2 回答 80 浏览 WebP图片在Safari上不显示怎么办? 我最近把项目里的JPG和PNG都转成WebP格式了,体积小了很多,但在Safari上图片直接裂开不显示。查了下说Safari 14之前不支持WebP,但用户还在用老版本,这咋办? 试过用<pic... 仙仙 ☘︎ 优化 2026-03-30 21:55:14 1 回答 60 浏览 ScrollTrigger动画在组件中无法触发怎么办? 我在Vue组件里用GSAP的ScrollTrigger做滚动动画,但页面滚动时完全没反应,控制台也没报错。 已经按文档引入了ScrollTrigger插件,也调用了ScrollTrigger.refr... IT人钰岩 组件 2026-03-30 21:36:19
scroll-behavior: smooth;支持不太好,直到最近几个版本才有部分支持,但还是不太稳定。这里有个靠谱的JS回退方案:这个方案用 requestAnimationFrame 来实现动画效果,兼容性更好。顺便说下,这种问题处理起来挺烦人的,不同浏览器总是有各种小差异,不过用JS回退算是比较稳妥的办法了。
scroll-behavior的支持还不完整(尤其旧版本),而且加-webkit-前缀确实没用——这属性目前还不支持前缀。先确认 Safari 版本(14+ 才支持),如果还要兼容旧版,直接上 JS 回退方案:
或者用
scrollIntoView({ behavior: 'smooth' })替代锚点跳转,实测 Safari 全兼容。