在 Safari 中滚动时元素消失 - -webkit-transform 修复仅在第一次时有效

Elements disappear when scrolling in Safari - -webkit-transform fix only works the first time

这只发生在 iPhone 大小的 Safari 中。我知道这个问题的 "usual fix" 是应用 -webkit-transform: translate3d(0,0,0); (根据 Serge 的回答 here),这确实解决了问题,但只有一次。

当用户单击菜单按钮时打开的 "drawer" 菜单会出现此问题。菜单会正常显示,但是当手指touched/scrolled时,整个菜单从页面上消失。应用 -webkit-transform: translate3d(0,0,0) 解决了这个问题,但只是第一次。如果菜单关闭并再次打开,问题再次出现。我已经确认 -webkit-transform: translate3d(0,0,0) 属性 仍然存在(但是在 Safari 开发者工具中它是灰色的——灰色的,没有划掉一条穿过它的线)。

我在页面上添加了一些 JavaScript,这样当菜单打开时,它会应用 -webkit-transform: translate3d... 属性 到菜单,虽然这确实修复了这个问题是永久性的,我认为它还不够干净,无法真正解决。

我也尝试过在父元素、子元素等上应用 -webkit-overflow-scrolling: touch-webkit-transform: translate3d(0,0,0) 的各种组合,但无法解决超出 "first try" 的问题.

因此,由于这个众所周知的 Safari 问题只发生在具有 position: relative 的元素上,我最终通过在滚动容器元素上设置 position: fixed 来解决这个问题。无需添加 -webkit-overflow-scrolling: touch-webkit-transform: translate3d(0,0,0).

如问题部分所述,-webkit-transform: translate3d(0,0,0)解决了问题,但仅限于第一次打开菜单。一旦在没有刷新页面的情况下关闭并重新打开,就会出现问题,就好像根本没有应用任何修复一样。

如果您正在处理同样的问题,请考虑使用 position: fixed。如果您在用户显示和隐藏的元素(如汉堡菜单)中遇到此问题,您应该可以设置 position: fixed 在用户调用它时显示的父滚动容器上。

其他人的另一种选择:

如果您在 jQuery $( window ).on( "resize", function(){} ); 中有任何代码,这可以在滚动时触发。在我的例子中,我在调整 window 大小时隐藏了一个菜单,这在桌面上运行良好,但在 iOS Safari 中滚动时也会被调用。

感谢 this answer 指出了这个令人沮丧、隐藏得很好的问题。