HTML/CSS位置粘性工作不正常

HTML/CSS Position sticky is not working properly

我正在尝试制作 div position: sticky; 但它不起作用,这是我的代码:

body {
  height: 1000px;
}

header {
  position: absolute;
  width: 100%;
  z-index: 100;
}

.top-navbar {
  height: 100px;
  background-color: green;
}

nav {
  position: -webkit-sticky !important;
  position: sticky;
  top: 0;
  align-self: flex-start;
  background-color: orange;
}
<header>
  <div class="top-navbar">
    <h2>top navbar</h2>
  </div>
  <nav>
    <h1>My navbar</h1>
  </nav>
</header>

您似乎只想让 nav 在滚动条上可见。在这种情况下,请按以下方式进行。将 sticky 移动到 header 并考虑 top 的负值等于 top-navbar

的高度

body {
  height: 1000px;
}

header {
  position: sticky;
  top: -100px;
}

.top-navbar {
  height: 100px;
  background-color: green;
}

nav {
  background-color: orange;
}


h1,h2 {
  margin:0;
}
<header>
  <div class="top-navbar">
    <h2>top navbar</h2>
  </div>
  <nav>
    <h1>My navbar</h1>
  </nav>
</header>

假设您想让第二个导航固定。

w3schools 上有一个很好的教程:https://www.w3schools.com/howto/howto_js_navbar_sticky.asp

将此应用到您的代码将类似于:

// When the user scrolls the page, execute myFunction
window.onscroll = function() {myFunction()};

// Get the navbar
var navbar = document.getElementById("navbar");

// Get the offset position of the navbar
var sticky = navbar.offsetTop;

// Add the sticky class to the navbar when you reach its scroll position. Remove "sticky" when you leave the scroll position
function myFunction() {
  if (window.pageYOffset >= sticky) {
    navbar.classList.add("sticky")
  } else {
    navbar.classList.remove("sticky");
  }
}
body {
  height: 1000px;
}

header {
  position: absolute;
  width: 100%;
  z-index: 100;
}

.top-navbar {
  height: 100px;
  background-color: green;
}

nav {
  position: -webkit-sticky !important;
  position: sticky;
  top: 0;
  align-self: flex-start;
  background-color: orange;
}
  
.sticky {
  position: fixed;
  top: 0;
  width: 100%;
}
<header>
  <div class="top-navbar">
    <h2>top navbar</h2>
  </div>
  <nav id="navbar">
    <h1>My navbar</h1>
  </nav>
</header>

当然,您可以在没有 JavaScript 的情况下执行此操作,但为了与旧版浏览器兼容,您可能需要考虑此选项。

Temani 有一个很好的解决方案,但我想指出您的解决方案不起作用的原因。位置 sticky 是“相对于其最近的滚动祖先和包含块(最近的 block-level 祖先)”。在你的例子中,那是 header,导航已经固定在上面了。但是,如果将导航移动到 header 下方(如下例所示),您会看到它有效:

body {
  height: 1000px;
}

.top-navbar {
  height: 100px;
  background-color: green;
}

nav {
  position: sticky;
  top: 0;
  background-color: orange;
}
<header>
  <div class="top-navbar">
    <h2>top navbar</h2>
  </div>
</header>

<nav>
  <h1>My navbar</h1>
</nav>