【发布时间】:2017-11-17 22:12:25
【问题描述】:
在玩了一段时间position: sticky 之后,我开始实现它以实现粘性导航并遇到了这个有趣但令人沮丧的滚动弹跳问题。
这是在许多网站上常见的导航行为类型,您通常会使用 javascript 来计算页面中相对元素的偏移量。当元素到达窗口顶部时,将添加一个“卡住”类,使用position: fixed将该元素从文档流中取出,并在其位置添加一个相同高度的虚拟元素以阻止页面从“跳跃”。此外,通常会看到 javascript 然后缩小导航的高度以在滚动时节省空间。
CSS 现在似乎用position: sticky 处理了所有这些,除了(据我所知)检测元素何时“卡住”。相反,我使用了一些 javascript 来进行卡住检测,发现一切正常,直到 粘性元素的高度需要更改。
这很难解释,但它会在生产中造成严重破坏 - 所以这是我为尽可能简单地说明问题而制作的一个精简示例。
CSS sticky position height adjustment bug
当页面的高度恰到好处的长度时最好说明,所以我在元素上设置了一个固定的高度,以确保每个人都能看到相同的东西。您可以添加更多内容,但滚动过去时仍然存在问题。
结果是一些非常奇怪的行为。向下滚动时,导航卡住,随着导航栏缩小,浏览器自动创建的“虚拟元素”position: sticky 似乎与它保持同步。这意味着,当添加了卡住的类时,整个页面变小了,几分之一秒后,导航不再卡住,从而导致故障振动循环。
我测试过的每个浏览器的行为也完全不同。在 chrome 中,这种弹跳永远无法解决,它一直处于无限循环中,不断添加/删除卡住的类。更有趣的是,在 Safari 中,滚动位置被“推回”到不会出错的状态。然后在 Firefox 中,它会同时执行这两项操作,会出现一两秒钟的故障,然后再次强制滚动位置恢复。
我想知道是否有人遇到过这种情况并提出任何解决方案?我想出的任何 js 解决方法都没有真正奏效或非常好!当然,随着人气的增长,更多的人会喜欢这个......
欢迎天才的变通方法、技巧、见解或完美的解决方案!
【问题讨论】:
标签: javascript html css navigation sticky