javascript - 使用 IntersectionObserver 实现粘性 header

标签 javascript html css intersection-observer

我正在执行粘性 header 实现 - 我不想使用 position: sticky; 因为我看不到适合它的 polyfill 所以我尝试使用 IntersectionObserver API反而。问题是——我不太喜欢它提供的行为,因为它的条目可能会随机延迟发出。如果您逐渐滚动,此解决方案可以很好地工作,但如果您滚动得更快,标题就会上升,并且只有在延迟响应后,它才会获得 fixed 类,并以明显的跳跃定位,尤其是在繁重的页面上。有什么方法可以实现更好的响应,或者 IntersectionObserver 不适合我的目的?

const header = document.querySelector('.header');
const headerPositionNotifier = document.createElement('div');
headerPositionNotifier.classList.add('header-position-notifier')
header.parentNode.insertBefore(headerPositionNotifier, header);

const options = {
  threshold: [0]
};
const callback = (entries) => {
  entries.forEach(({
    intersectionRatio
  }) => {
    if (intersectionRatio == 0) {
      header.classList.add('fixed')
    } else {
      header.classList.remove('fixed')
    }
  })
}
const io = new IntersectionObserver(callback, options);
io.observe(headerPositionNotifier);
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  text-align: center;
  font-family: Arial;
  color: white;
  letter-spacing: 10px;
}

.banner {
  background: orange;
  padding: 20px;
}

.parent {
  background: mediumvioletred;
  position: relative;
}

.header {
  background: salmon;
  padding: 40px 0;
}

.content {
  background: #444;
  padding: 40px 0;
  height: 2000px;
}

.fixed {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
}

.header-position-notifier {
  height: 1px;
}
<div class="banner">
  BANNER
</div>
<div class="parent">
  <div class="header">
    HEADER
  </div>
  <div class="content"></div>
</div>

最佳答案

如果您不能为此使用 CSS,那您就不走运了。延迟仅来自您无法消除的滚动事件的延迟。正如您所说,在繁重的页面上,情况会变得更糟。即使在不同的浏览器上,情况也或多或少更糟。我更愿意结合 css position sticky 和 ​​intersection observer 作为后备。

关于javascript - 使用 IntersectionObserver 实现粘性 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57253460/

相关文章:

javascript - 用于提取基于点概念的变量的动态正则表达式

javascript - 为什么 .scrollLeft 在超时函数中不起作用?

php - 多次溢出 :hidden containers with hidden content simultaneously toggled by links

html - 我在导航栏和一个部分之间有一个空间。谁能看到错误?

javascript - 无法隐藏文件附件浏览按钮

javascript - 有没有办法将来自 NodeJS Azure Function 的消息延迟放入 Azure 存储队列中?

html - 在 Pandoc 中编号和引用图像

javascript - 响应式 A4 CSS 代码

NetBeans 7.1 中的 JavaFX 2.1 CSS 样式警告

css - 在 Bootstrap 3 导航栏链接上保留事件类