【问题标题】:Sticky Header - buggy jumping on scrollSticky Header - 在滚动条上跳跃
【发布时间】:2013-05-13 01:36:19
【问题描述】:

我在使用 jQuery 制作粘性标题时遇到了一个特定问题。我尝试了网络上常用的 sn-ps,但我发现到处都是同样的错误。

在特定的文档高度(可滚动直到比调用粘性效果多一点),粘性标题在position: fixedposition: static 之间跳转。

HTML:

<header>
  <div id="not-sticky"></div>
  <div id="sticky"></div>
</header>
<div id="content"> ...


jQuery:

var $sticky = $("#sticky");
var offset = $sticky.offset();
var stickyTop = offset.top;
var windowTop = $(window).scrollTop();
$(window).scroll(function() {
  windowTop = $(window).scrollTop();
  if (windowTop > stickyTop) {
    $sticky.css({
      position: 'fixed',
      top: 0
    });
  }
  else {
    $sticky.css({
      position: '',
      top: ''
    });
  }
});


CSS:

header {
  width: 100%;
}

#not-sticky {
  padding: 50px 0;
  width: 100%;
}

#sticky {
  padding: 24px 0;
  position: relative;
  width: 100%;
  z-index: 25;
}


我还在#not-sticky 上尝试了一个与#sticky 相同高度的margin-bottom,以保持恒定的文档高度,但出现了同样的跳跃粘性效果。

有办法解决这个问题吗?

【问题讨论】:

    标签: javascript jquery css sticky


    【解决方案1】:

    滚动触发次数过多,尝试设置元素 style 总是会不可避免地产生跳跃(即使几乎看不到但仍然锯齿状)。

    我发现最好的方法是

    1. 克隆我们的元素,
    2. 克隆fixed
    3. 玩克隆的visibility 风格。

    纯 JS:

    ;(function(){ /* STICKY */
    
      var sticky  = document.getElementById("sticky"),
          sticky2 = sticky.cloneNode(true);
    
      sticky2.style.position = "fixed";
      document.body.appendChild(sticky2);
    
      function stickIt(){
        sticky2.style.visibility = sticky.getBoundingClientRect().top<0 ? "visible" : "hidden";
      }
    
      stickIt();
      window.addEventListener("scroll", stickIt, false );
    }());
    #sticky{
      height:100px;
      background:#ada;
      height:50px;
      position:relative;
      /* needed for clone: */
      top:0; 
      width:100%;
    }
    
    
    /* Just for this demo: */
    *{margin:0;padding:0;}
    #content{height:2000px; border:3px dashed #444;}
    h1{padding:40px; background:#888;}
    <h1>Logo</h1>
    <div id="sticky">Sticky header</div>
    <div id="content">Lorem ipsum...<br>bla bla</div>

    所以当你看到“标题”fix时,这实际上是我们的固定克隆在顶部可见。

    【讨论】:

    • 谢谢大佬,效果很好!我希望没有包装 div 来保持干净的标记是可能的,但我会承担这一点。
    • @TimoM 不客气!我创建了一个可重复使用的函数,因此您也可以在 DOM readywindow load 上使用它,无论您需要什么。您知道,图像加载缓慢,可能有助于重新检查滚动值,因为页面有时可能在访问时已经滚动。
    • 是的,谢谢!我已经将 jQuery 封装到了DOM ready 中,但是这个sticky()-function 真的很简洁!
    • @Roko C. Buljan 我如何设置粘性元素以在顶部下方粘贴 x 个像素?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多