iOS 9 Safari:在滚动时将元素更改为固定位置直到滚动停止才会绘制


68

我一直在开发网站,并从相当不错的jQuery Sticky Kit插件中受益。通过在适当的时候在position属性之间fixed来回切换来进行操作。在桌面上运行非常流畅,在移动设备上也可以接受。

或至少它曾经如此。iOS 9具有新的行为:如果position元素的元素从static/ relative/absolute变为fixed滚动动画进行中,则元素将不可见,直到滚动停止为止。奇怪的是,执行相反的更改(从fixed其他更改)没有问题。

一个有效的示例可以在插件的主页上找到。黑色导航栏(“示例参考”)应该是粘性的。最初它static位于页面中间。向下滚动时,它变成fixed和(在iOS 9中)消失,直到滚动停止。在桌面浏览器和iOS 8中的行为是正确的。

我有点希望采用典型的CSS解决方法:强制进行3D转换,禁用背面可见性等,使专有属性晦涩难懂,但是似乎没有任何效果。

既然它正在起作用,我们是否会完全忘记“可粘”元素?


2
如果您正在为iOS开发,则应该position: sticky在CSS中使用更好的解决方案,尽管它要放在前缀后面。您可以将jQuery插件用于其他所有功能,并在支持该插件的地方使用适用于iOS的本地CSS解决方案(如果我没记错的话,为7+)。
TylerH's

1
好吧,我正在为所有内容进行开发,但这允许使用混合方法。谢谢!
instanceofnull

1
经过数小时的反复试验,我可以得出结论,iOS对粘性标头的支持非常好,但是当您进入粘性列时,一切都会变得很麻烦。还是有点绿色。
instanceofnull

Answers:


78

我遇到了同样的问题,并且能够使用旧的“强制3D转换”技巧来解决它。只需将要切换位置的元素设置为具有的transform属性translate3d(0px,0px,0px)。确保在更改position属性之前完成此操作。


14
translate3d()给我造成了一些布局问题,但translateZ(0)
发挥

3
我在同一个CSS类上使用了translation3d(),诀窍是在更改位置或添加新类之前,应该在该位置。感谢那!
安德烈·吉尔

2
在iOS 10上,这似乎对我不起作用...很好,但是我可以通过拖动(例如固定元素“ sticks”)然后在另一个方向上更改拖动方向来打破它:-(
Simon_Weaver

不幸的是,在Safari 9.0上,这似乎对我不起作用。没事 隐藏/显示,添加元素,添加CSS动画,访问offsetHeight。我尝试了所有可以找到的技巧,但直到我从屏幕上移开滚动手指,标题栏才不会在固定位置重新
粉刷

我花了几天的时间试图找出如何解决粘滞标头中样式更改的问题,直到滚动完全停止为止才生效,这使整个事情显得笨拙而奇怪。添加transform: translateZ(0);到默认元素样式后,此问题已得到解决,现在在滚动过程中样式过渡很平稳。精彩!谢谢大家!(在装有iOS 10.0.2的iPad Mini上的Chrome和Safari中进行了测试)
Katrin


4

我用一个额外的固定元件解决了这个问题。经过一番测试,我发现这是第一个被修复的元素存在此问题。第二,第三等在iOS设备上可以正常工作。

因此,在您的身体开口后贴上div.fixed-fix:

.fixed-fix {
    position:fixed;
    top:-1px; 
    height:1px; 
    width:100%; 
    background:white;
}

现在可以了!固定分辨率div必须具有backgroundcolor,否则将无法工作...


3
这似乎不适用于iOS10。也许他们“固定”了吗?我真的很希望这样做,因为我发现该translate选项非常
故障

3

jQuery Sticky Kit和其他类似的插件,即使编写得很好,也正在iOS 9上表现出这种行为,这并不是第一次发生这种情况。这里的要点是Firefox Safari和Safari Mobile支持实验性功能position: sticky;,谷歌(Chromium)也支持实验性功能,但是由于集成问题,不得不暂时禁用它,您可以在此处阅读更多信息。话虽如此,我的猜测是很快position: sticky;将成为CSS规范的一部分,并得到所有主要浏览器的支持,因此,我认为解决此问题的最佳方法是使用polyfill而不是插件。当然,polyfill不会涵盖这些插件提供的所有功能。不过,在许多情况下,使用polyfill可以完成所有主要浏览器支持的强大而有效的解决方案。我认为这是目前的路要走。我个人使用stickyfill,尽管我确信野外的其他polyfills可以解决问题。我只能说,由于我开始使用polyfill而不是插件,因此我没有任何浏览器兼容性问题。


0


使用混合: 使用CSS将其添加到固定元素中@include transform(translate3d(0px,0px,0px))
translate3d(0px,0px,0px)


4
使用“ SCSS”是错误的。您建议使用的是mixin,可能是来自指南针...
yckart

1
使用SCSS并没有错,它只是一种避免必须输入每个浏览器前缀的麻烦的方式。
赞德利

2
.... urm ....除了[可能]只是一个iOS'.issue',因此您不必担心任何前缀
Simon_Weaver
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.