多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 关于 iOS 手机滚动的问题 `-webkit-overflow-scrolling` 究竟是什么鬼? 一个只有 iOS 设备支持的非标准属性。苹果自己的解释:指定是否在 overflow: scroll 的元素中使用“原生”的滚动方式 他包含两个可选值:auto 和 touch - auto:就是普通的无惯性滚动效果 - touch:原生的滚动效果。使用此效果会构造一个 stacking context 什么是 stacking context?这可以说是CSS里一个阴暗面,极其晦涩。有兴趣的朋友可以去看高人的解释 : https://segmentfault.com/a/1190000002783265 ## -webkit-overflow-scrolling 引发了那些坑? 下面列出我遇到过的坑: ### 滚动中 scrollTop 属性不会变化。 严格来说,上面的 scroll 事件不触发只是本坑的一个副作用,所以说不必考虑通过 touchmove 事件转发 scroll 事件等点子,scroll 事件触发了一样检测不到 scrollTop 属性的变化(当然检测手指的移动距离另说)。同样,检测滚动区域内部元素的 getBoundingClientRect 同样无效。 例中起了一个无限的rAF循环不停地获取 scrollTop 的值,然并卵。 ### 手势可穿过其他元素触发元素滚动 这个更奇葩。例中用一个半透明的 div 盖在了滚动区域 ul 上面(实践中可能是一个弹框的背部蒙版),甚至给 ul 自己加上了 pointer-events: none,手指在 div 上滑动仍然会触发 ul 的滚动。你可以在显示半透明蒙版时将 ul 的 -webkit-overflow-scrolling: touch 或 overflow: scroll 去掉,但是会造成屏幕明显的闪烁。如果给 body 的 touchmove事件 preventDefault() 可以防止触发滚动,但是是所有滚动区域都会失效。 ### 运行时通过 JS 动态添加元素溢出高度导致滚动失效 Google 上一搜一片,但是笔者没有遇到过,或许在新版本系统中已经修正,这里不展开讨论。 ### 滚动时暂停其他 transition ## 参考资料 [iOS 与 惯性滚动](http://www.cnblogs.com/chris-oil/p/6164966.html) [CSS Stacking Context 里那些鲜为人知的坑](https://segmentfault.com/a/1190000002783265)