Getting a sticky header to “push up”, like in Instagram's iPhone app using CSS and jQuery

前端 未结 8 1374
[愿得一人]
[愿得一人] 2020-11-30 16:12

The Instagram app has a nice sticky header that pushes the current one up in place of the new one. I found a great tutorial on how to do this natively for Android, but I\'m

8条回答
  •  时光取名叫无心
    2020-11-30 16:59

    There's not a quick or easy answer to this but with a bit of creative cajoling we can emulate the same functionality.

    What we need is a series of elements we can identify, loop over and then set up so that when we hit their position on the page the previous item is pushed up and the new item becomes fixed. We will need to retrieve the element's initial position using jQuery's offset().top method and store it in a data tag so we can reference it later. Then the rest will be calculated as we scroll.

    This should do the trick:

    var stickyHeaders = (function() {
    
      var $window = $(window),
          $stickies;
    
      var load = function(stickies) {
    
        if (typeof stickies === "object" && stickies instanceof jQuery && stickies.length > 0) {
    
          $stickies = stickies.each(function() {
    
            var $thisSticky = $(this).wrap('
    '); $thisSticky .data('originalPosition', $thisSticky.offset().top) .data('originalHeight', $thisSticky.outerHeight()) .parent() .height($thisSticky.outerHeight()); }); $window.off("scroll.stickies").on("scroll.stickies", function() { _whenScrolling(); }); } }; var _whenScrolling = function() { $stickies.each(function(i) { var $thisSticky = $(this), $stickyPosition = $thisSticky.data('originalPosition'); if ($stickyPosition <= $window.scrollTop()) { var $nextSticky = $stickies.eq(i + 1), $nextStickyPosition = $nextSticky.data('originalPosition') - $thisSticky.data('originalHeight'); $thisSticky.addClass("fixed"); if ($nextSticky.length > 0 && $thisSticky.offset().top >= $nextStickyPosition) { $thisSticky.addClass("absolute").css("top", $nextStickyPosition); } } else { var $prevSticky = $stickies.eq(i - 1); $thisSticky.removeClass("fixed"); if ($prevSticky.length > 0 && $window.scrollTop() <= $thisSticky.data('originalPosition') - $thisSticky.data('originalHeight')) { $prevSticky.removeClass("absolute").removeAttr("style"); } } }); }; return { load: load }; })(); $(function() { stickyHeaders.load($(".followMeBar")); });
    .followMeBar {
      background: #999;
      padding: 10px 20px;
      position: relative;
      z-index: 1;
      color: #fff;
    }
    .followMeBar.fixed {
      position: fixed;
      top: 0;
      width: 100%;
      box-sizing: border-box;
      z-index: 0;
    }
    .followMeBar.fixed.absolute {
      position: absolute;
    }
    /* For aesthetics only */
    
    body {
      margin: 0;
      font-family: Segoe, "Segoe UI", "DejaVu Sans", "Trebuchet MS", Verdana, sans-serif;
    }
    
    
    A










    B










    C










    D










    E










    F










    G










    H










    I










    J










    K










    L










    M










    N










    O










    P










    Q










    R










    S










    T










    U










    V










    W










    X










    Y










    Z










    Here's the CSS only version:

    Before you say "What?! I just went through all of that when there's a CSS only version?!" It only works in a couple of browsers. Try this in firefox for example:

    .sticky {
      position: -webkit-sticky;
      position: -moz-sticky;
      position: -o-sticky;
      position: -ms-sticky;
      position: sticky;
      top: 0;
      left: 0;
      right: 0;
      display: block;
      z-index: 1;
      background: #999;
      color: #fff;
      padding: 10px 20px;
    }
    
    /* For aesthetics only */
    body {
      margin: 0;
      font-family: Segoe, "Segoe UI", "DejaVu Sans", "Trebuchet MS", Verdana, sans-serif;
    }
    a









    b









    c









    d









    e









    f









    g









    h









    http://caniuse.com/#feat=css-sticky

提交回复
热议问题