价格对比表在 iPhone 13 上横向滑动,冻结的套餐名列突然离开原位,压在第二列价格上,松手又弹回去。控制台没有报错。乍看像缓存或者权限的锅,追下去往往不是。
.price-table td:first-child {
position: sticky;
left: 0;
z-index: 2;
background: #fff; }
追下去是这么回事:sticky 元素在 iOS Safari 的合成层里会跟着滚动容器重算位置,祖先只要有一层 overflow: hidden 或 transform,吸附参照就换成了那一层。表头和首列同时 sticky 时又共用层级,后渲染的会盖住先渲染的。
「价格表 sticky 首列」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,给横向滚动容器写 overflow-x: auto 和 position: relative,中间别再套 overflow: hidden;首列用 position: sticky 和 left: 0,单独给 z-index,表头另算一层,别和首列共用;逐个检查祖先的 transform、filter、will-change,这些属性会新建包含块,sticky 的参照就不再是滚动容器。
验收就看一点,iOS 上横向滑到最右,套餐名列仍贴着左边,价格列完整露出,松手不再跳动。
