向下滚动后的粘性标题

IT技术 javascript jquery header sticky
2021-03-08 05:06:36

我在这个网站上看到了这个粘性标题:http : //dunked.com/ (不再活跃,查看存档站点

当您向下滚动时,粘性标题从顶部向下。

我看了看代码,但看起来真的很复杂。我只明白这一点:普通的标题是用 JS 克隆的,当你向下滚动页面时,它会从顶部开始动画。

6个回答

这是一个开始基本上,我们在加载时复制标题,然后检查(使用.scrollTop()window.scrollY)以查看用户何时滚动超过一个点(例如 200 像素)。然后我们简单地切换一个类(在这种情况下.down),将原件移到视图中。

最后,我们需要做的就是将 atransition: top 0.2s ease-in应用于我们的克隆,这样当它处于该.down状态时,它就会滑入视图中。Dunked 做得更好,但稍微玩一下它很容易配置

CSS

header {
  position: relative;
  width: 100%;
  height: 60px;
}

header.clone {
  position: fixed;
  top: -65px;
  left: 0;
  right: 0;
  z-index: 999;
  transition: 0.2s top cubic-bezier(.3,.73,.3,.74);
}

body.down header.clone {
  top: 0;
}

要么是 Vanilla JS(根据需要使用 polyfill)

var sticky = {
  sticky_after: 200,
  init: function() {
    this.header = document.getElementsByTagName("header")[0];
    this.clone = this.header.cloneNode(true);
    this.clone.classList.add("clone");
    this.header.insertBefore(this.clone);
    this.scroll();
    this.events();
  },

  scroll: function() {
    if(window.scrollY > this.sticky_after) {
      document.body.classList.add("down");
    }
    else {
      document.body.classList.remove("down");
    }
  },

  events: function() {
    window.addEventListener("scroll", this.scroll.bind(this));
  }
};

document.addEventListener("DOMContentLoaded", sticky.init.bind(sticky));

jQuery

$(document).ready(function() {
  var $header = $("header"),
      $clone = $header.before($header.clone().addClass("clone"));

  $(window).on("scroll", function() {
    var fromTop = $("body").scrollTop();
    $('body').toggleClass("down", (fromTop > 200));
  });
});

较新的思考

虽然以上回答了 OP 的原始问题“Dunked 如何达到这种效果?” ,我不会推荐这种方法。对于初学者来说,复制整个顶部导航的成本可能非常高,而且我们没有真正的理由不能使用原始导航(需要做一点工作)。

此外,爱尔兰的保罗等人,都写了关于如何用动画translate()优于与动画top它不仅性能更高,而且还意味着您不需要知道元素的确切高度。将使用以下内容修改上述解决方案(参见 JSFiddle)

header.clone {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  transform: translateY(-100%);
  transition: 0.2s transform cubic-bezier(.3,.73,.3,.74);
}

body.down header.clone {
  transform: translateY(0);
}

使用转换的唯一缺点是,虽然浏览器支持非常好,但您可能希望添加供应商前缀版本以最大限度地提高兼容性。

在 Firefox 中它运行良好,但在 chrome 中不行。但是谢谢你 - 它帮了我很多。
2021-04-30 05:06:36
@user2416687 啊,看起来有点怪癖让小提琴使用 iFrame - 我已经改用 window (见这个问题
2021-05-05 05:06:36
哦,还有 - 任何时候,我都试图分解它来解释发生了什么:)
2021-05-05 05:06:36

这是一个 JS 小提琴http://jsfiddle.net/ke9kW/1/

正如其他人所说,将标题设置为固定,并以 display: none 开始

然后jQuery

$(window).scroll(function () {
  if ( $(this).scrollTop() > 200 && !$('header').hasClass('open') ) {
    $('header').addClass('open');
    $('header').slideDown();
   } else if ( $(this).scrollTop() <= 200 ) {
    $('header').removeClass('open');
    $('header').slideUp();
  }
});

其中 200 是您希望它向下移动的高度(以像素为单位)。添加 open 类是为了让我们可以运行 elseif 而不仅仅是 else,所以一些代码不会不必要地在每个滚动事件上运行,节省一点内存

啊,我可以看到在示例中重复使用了相同的标题,这适用于内联标题和下拉标题(如果您想要滚动后更简单、更小的条带,这很方便),但您明白了!
2021-05-10 05:06:36

这是一个相当多的jQuery 插件列表,它们将有助于实现类似的效果:http : //jquery-plugins.net/tag/sticky-scroll

scrollToFixed()在该列表中是非常好的一个。正是我想要的。一个保持原位的标题,直到我滚动过去它们它粘在页面的顶部。很有用!
2021-05-15 05:06:36

我使用 jQuery .scroll() 函数使用 scrollTop 跟踪工具栏滚动值的事件。然后我使用条件来确定它是否大于我想要替换的值。在下面的示例中,它是“结果”。如果该值为真,则结果标签添加一个类“fixedSimilarLabel”,然后考虑新样式。

    $('.toolbar').scroll(function (e) {
//console.info(e.currentTarget.scrollTop);
    if (e.currentTarget.scrollTop >= 130) {
        $('.results-label').addClass('fixedSimilarLabel');
    }
    else {      
        $('.results-label').removeClass('fixedSimilarLabel');
    }
});

http://codepen.io/franklynroth/pen/pjEzeK

css:

header.sticky {
  font-size: 24px;
  line-height: 48px;
  height: 48px;
  background: #efc47D;
  text-align: left;
  padding-left: 20px;
}

JS:

$(window).scroll(function() {
 if ($(this).scrollTop() > 100){  
    $('header').addClass("sticky");
  }
  else{
    $('header').removeClass("sticky");
  }
});
我相信你的意思是“固定”,因为这不是粘性的工作方式。
2021-04-18 05:06:36