【问题标题】:Sticky header with Javascript - issues with resize带有 Javascript 的粘性标题 - 调整大小的问题
【发布时间】:2022-02-05 15:50:32
【问题描述】:

我正在尝试制作一个粘性标题。我在正文中添加了一个等于标题高度的 padding-top 值,以防止跳跃(因为从相对于固定的位置开始)。但是由于汉堡图标在断点 992 之后标题高度发生了变化,因此我需要相应地更新此填充值。但我无法做到。不确定我应该在哪里以及如何添加调整大小事件侦听器。请注意,固定的标题高度也不同,但它不应该影响这个 body padding-top 值。到目前为止,这是我的代码:https://codepen.io/penplaycode/pen/YzEWJGB

为了理解这个问题,在codepen示例中,首先检查桌面视图,向下滚动一点,你会注意到标题在滚动100px后固定在顶部,没有跳转,一切正常。但是如果你调整窗口大小直到看到汉堡图标,然后滚动 100px 以启用固定标题,你会看到内容有轻微的跳跃。因为标题高度是根据桌面视图计算的,因此正在添加的正文填充值就是这个值,但是我需要它在调整大小后重新计算标题高度并将这个新值应用到正文作为填充顶部。

var navbar = document.querySelector(".navbar");
var navbarClass = navbar.classList;
var navbarH = navbar.offsetHeight;
var scrollOffset = 500;
function setPadding(e) {
  if (e.currentTarget.pageYOffset > scrollOffset) {
    document.body.style.paddingTop = navbarH + "px";
  } else {
    document.body.style.paddingTop = "";
  }
}
window.addEventListener("scroll", (e) => {
  if (
    navbarClass.contains("transparent") &&
    navbarClass.contains("navbar-light")
  ) {
    if (e.currentTarget.pageYOffset > scrollOffset) {
      navbar.classList.add("fixed");
    } else {
      navbar.classList.remove("fixed");
    }
    if (!navbarClass.contains("position-absolute")) {
      setPadding(e);
    }
  } else {
    if (e.currentTarget.pageYOffset > scrollOffset) {
      navbar.classList.add("fixed");
    } else {
      navbar.classList.remove("fixed");
    }
    setPadding(e);
  }
});

【问题讨论】:

  • 你的导航栏没有粘性,应该有 .navbar { 只有这样导航栏才会粘性
  • @Vaibhavv 是的。我在滚动到某个点后添加 .fixed 类,这使它通过 CSS 变得粘/固定。你检查过我的 codepen 示例了吗?
  • 是的,我检查了你的 codepen。当我删除 .fixed 导航栏时,固定在顶部。
  • @Vaibhavv 我不明白你的建议。这不能回答我的问题。在将窗口大小调整到某个断点后,我需要帮助计算新的标题高度

标签: javascript html css scroll resize


【解决方案1】:

您可以将此代码用于简单的粘性标题。
这段代码很容易理解。

 window.onscroll = function () { myFunction() };

var header = document.getElementById("header");

function myFunction() {
  if (window.pageYOffset >= 30) {
    header.classList.add("sticky")
  } else {
    header.classList.remove("sticky");
  }
}
*{
margin:0;
padding:0;
}
body{
height:1500px;
width:800px;
background:Black;
}
header{
    position: fixed;
    width: 100%;
    padding: 20px 100px;
    z-index: 1000;
    display: flex;
    justify-content: space-between;
    align-items: center;
    transition: 0.75s;
}
header .logo{
    color: rgb(255, 255, 255);
    font-weight: 700;
    font-size: 2.5rem;
    text-decoration: none;
}
header .nav{
    position: relative;
    display: flex;
}
header .nav li{
    list-style: none;
    margin-left: 50px;
    height:100%;
}
header .nav li a{
    text-decoration: none;
    color: #fff;
    font-weight: 300;
    font-size: 1.5rem;
}
header.sticky{
    background: rgba(255,255,255,0.85);
    padding-top:0px;
    padding-bottom:0px;
    box-shadow: 0 5px 20px rgba(0,0,0,0,0.5);
    height:3.75rem;
}
header.sticky .logo{
    color: rgb(0, 0, 0);
}
header.sticky ul{
    height:100%;
}
header.sticky ul li{
    height:100%;
    display:flex;
    align-items: center;
}
header.sticky ul li a{
    color:rgb(204, 34, 34);
}
header.sticky .nav li:hover{
    border-bottom: 5px solid #ff0157;
}

@media only screen and (max-width:600px){
  body{
  width:600px;
  }
}
<header id="header">
  <a href="#ban" class="logo">Avenger</a>
  <ul class="nav">
    <li><a href="#ban">Home</a></li>
    <li><a href="#about">About</a></li>
    <li><a href="#menu">Menu</a></li>
    <li><a href="#expert">Expert</a></li>
    <li><a href="#contact">contact</a></li>
  </ul>
</header>

【讨论】:

  • 感谢您的建议。但是我已经在使用这种方法。但是在您的示例中,标题在滚动之前已经固定,因此当您向下滚动以启用粘性标题时,页面高度不会改变并且不会导致跳转。我的问题不是如何使标题变粘。我在问如果您的标题高度在调整大小后发生变化,如何防止这种跳跃。无论如何,我最终使用了 headhesive.js,它克隆了防止跳转的标题,因为滚动之前的标题仍然保留在顶部。
  • 你可以再做一件事,从一开始就将标题设置为粘性,并为正文容器提供与标题高度相同的填充量。
  • 是的,我与帖子共享的代码已经做到了这一点,但问题是,调整我的标题高度会发生变化,我希望这个正文填充也相应地改变。我无法动态计算新的标题大小并将其添加为新的正文填充。我已经在我的第一篇文章中解释了这一点,codepen 示例也显示了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2012-10-17
  • 2015-03-05
  • 1970-01-01
相关资源
最近更新 更多