【问题标题】:Jumpy Nav bar upon changing height (sticky property)改变高度时跳跃的导航栏(粘性属性)
【发布时间】:2018-10-31 10:48:03
【问题描述】:

我遇到了一个奇怪的问题,我不知道如何处理。

我基本上想在用户开始向下滚动页面时减小导航栏的大小,但是由于高度的这种变化,导航栏会产生跳跃效果,如果页面的高度是可用空间的 100% + 轻微滚动,导航栏有点卡在两个状态之间。问题在底部说明。

在将 scrolled 状态设置为 true 之前,我曾尝试以编程方式滚动页面,以防止导航栏调整大小,但这太可怕了。

这是我的 window.onscroll 事件:

  handleScroll = () => {
    const { scrolled } = this.state;
    console.log(window.scrollY, window.pageYOffset);
    if (window.pageYOffset >= 10 && !scrolled) {
      this.setState({ scrolled: true });
    } else if (window.pageYOffset == 0 && scrolled) {
      this.setState({ scrolled: false });
    }
  };

这是我的 CSS:

nav {
  height: 150px;
  background: black;
  color: white;
  transition: all 0.2s ease-in;
  position: sticky;
}

nav.scrolled {
  height: 80px;
}

【问题讨论】:

  • 是的,改变 y 偏移量,因为上面的元素在聆听时会改变高度,这肯定会导致错误。我认为您需要将灵活高度导航的高度锁定在顶部。此链接还将帮助您稍微清理滚动侦听器:html5rocks.com/en/tutorials/speed/animations 另外,也许不要使用元素的 y 偏移量,而是使用其上方元素的高度总和。
  • 只是一个建议。也将过渡添加到 nav.scrolled。
  • @admcfajn 我去看看

标签: javascript css reactjs sticky


【解决方案1】:

我遇到了类似的挑战,我想将导航从静态位置移动到固定位置。所以导航是在页面上的一个静态位置,一旦用户到达一个断点,导航就会变成一个固定的位置,所以它总是可见的并且在屏幕的顶部。此外,高度也发生了变化。

我对此的解决方案,因为主要问题是整体页面高度的变化,添加一个具有导航精确高度的占位符元素,并在导航变得粘滞时立即显示它。

所以解决方案是,只是为了确保整体高度不会改变。

例如,如果您将 css 更改为此,您应该不会看到这种效果(不是我建议的解决方案!),因为您不会更改整体高度,因此不会触发多次滚动和重新渲染问题:

nav {
  height: 150px;
  padding-bottom: 0;
  background: black;
  color: white;
  transition: all 0.2s ease-in;
  position: sticky;
}

nav.scrolled {
  height: 80px;
  padding-bottom: 70px;
}

如果您在切换scrolled 的状态时放置一些console.log,您可以获得更好的见解。

【讨论】:

  • 是的,该解决方案将消除跳跃效果,但关键是用户应该能够随时看到整个导航栏,因此 sticky 属性
  • 我不完全明白你的评论是什么意思?我不建议随时删除粘性或隐藏导航栏。我说,只要你改变高度,你就改变了整个文档的高度,这会导致这个错误。因此,例如,如果您要降低高度但在其他地方添加减去的值,则不会出现此错误。
  • 是的,我正在尝试添加这个占位符元素,看看它是如何工作的。我顺便用padding-bottom: 70px评论了css解决方案
  • 是的,带有填充的解决方案不应该隐藏任何东西,或者是吗?
  • 它实际上并没有隐藏任何东西,我只是错误地删除了top:0,所以粘性不起作用但现在它可以了。现在只有 50 个额外的黑色像素:P
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多