如何制作可变高度的固定 header

How to make a fixed header with variable height

我正在尝试创建一个高度可变的固定 header。我会自己解释一下,假设您进入该站点并且 header 是可见的,并且它的高度为 40 像素。向下滚动后 header 现在是 30px,并且已修复。我怎样才能做到这一点?我知道我应该写一些代码,但我不知道从哪里开始。我知道如何制作固定 header 但不知道如何实现可变高度功能。非常欢迎任何建议或代码片段。

我认为这段代码可以帮到你。

window.onscroll = function() {
  var header = document.getElementsByTagName('header')
  if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) {
      header[0].classList.add('header-scroll');
  } else {
      if (header[0].classList.contains("header-scroll")) {
          header[0].classList.remove('header-scroll');
      }
  }
}
.container {
  height: 200vh;
  padding-top: 40px;
}
header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  background-color: green;
  box-shadow: 0 0 5px rgba(0, 0, 0, .3);
  height: 40px;
  transition: all .3s ease;
}
.header-scroll {
  height: 30px;
}
<div class="container">
<header>
</header>
<p>Scroll me</p>
</div>

您可以通过嵌套 position: sticky; 元素并使用纯 CSS 来做到这一点,并将导航栏作为位置 top: -10px

  1. 您将<nav>设置为固定高度40px
  2. 那你就用nav { position: sticky; top: -10px; }。这将允许导航栏从视口滚动 10 像素,使其高度保持在 30 像素可见。
  3. 要让链接或文本等内容不离开视口,您可以将它们包裹在另一个元素中,并对其应用 display: sticky;。现在使用 top: 0; 来防止这些元素离开视口。

nav {
  position: sticky;
  top: -10px;
  height: 40px;
  background-color: red;
}

nav > div {
  position: sticky;
  top: 0;
}


/* for scrolling purpose only */
body {
  min-height: 500vh;
  margin: 0;
}

/* if you want the text vertically centered */
nav {
  display: flex;
  align-items: center;
}

nav > div {
  display: flex;
  align-items: center;
  height: 30px;
}
<nav>
  <div>Test</div>
</nav>