IOS 微信 webview 中 overflow 值 auto 不能正常工作
在 IOS 系统中,微信 webview 中有时候页面加载完成,但是 overflow: auto
属性失效。
问题描述
Safari 浏览器的渲染流程
- 构建 DOM Tree
- 构建 CSS Rule Tree
- 根据 DOM 和 CSS Tree 来构建 Render Tree
- 根据 Render Tree 计算页面的 Layout
- Render 页面
在第三步和第四部的时候,Safari 浏览器在构建 Render Tree 的时候,会预先找到相应的 overflow: scroll
元素,在计算页面 Layout
的时候,会计算父元素的高度与子元素的高度,若子元素高于父元素,则在 Render 页面时为其建立一个原生的 ScrollView。 也就是说在计算页面 Layout
的时候,子元素高度小于父元素高度则不会建立 ScrollView,也就不会有滚动条。
解决方法
根据上述原理,得出解决方案,即在计算页面 Layout
时让子元素的高度大于父元素的高度,使其建立 ScrollView。
Layout
.index
.inner
...
div(style="height: calc(.5rem)")
由于我的 .inner
元素高度为 100%
,内部有许多异步渲染组件,由于数据返回延迟导致计算页面 Layout
时子元素高度小于等于父元素高度,无法建立 ScrollView。因此我在最后面加入一个临时元素设置一个高度,使其在组件渲染前将 .inner
的高度撑开并建立 ScrollView。
参考资料
许可协议:署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
本文链接:https://tanglj.cn/2018/11/29/ios-webview-overflow-auto-is-not-work/