jQuery - липкий заголовок, який стискається при прокрутці вниз


74

Цікаво, як зробити липкий заголовок стиснутим (з анімацією), коли ви прокручуєте сторінку вниз і повертаєтеся до нормального стану, коли сторінка прокручується вгору. Ось два приклади для роз’яснення:

http://themenectar.com/demo/salient/

http://www.kriesi.at/themes/enfold/

Я отримую деталь, щоб це виправити, але як я повинен зробити, щоб зменшити заголовок, коли користувач прокручує вниз?

Дякую тонна


6
Опублікуйте свій код. Давайте подивимося, що ви спробували до цього часу.
pmandell

Чи існує назва для цього типу анімованих заголовків?
zkent 21.03.17

Відповіді:


105

Це має бути те, що ви шукаєте за допомогою jQuery.

$(function(){
  $('#header_nav').data('size','big');
});

$(window).scroll(function(){
  if($(document).scrollTop() > 0)
{
    if($('#header_nav').data('size') == 'big')
    {
        $('#header_nav').data('size','small');
        $('#header_nav').stop().animate({
            height:'40px'
        },600);
    }
}
else
  {
    if($('#header_nav').data('size') == 'small')
      {
        $('#header_nav').data('size','big');
        $('#header_nav').stop().animate({
            height:'100px'
        },600);
      }  
  }
});

Демонстрація: http://jsfiddle.net/jezzipin/JJ8Jc/


Ваше рішення майже ідеальне, але я хотів додатиClass () замість регулювання висоти, АЛЕ без втрати анімації. Можливо?
eozzy

1
Хтось знає, чому це працює у всіх браузерах, окрім Safari для iOS? cc @jezzipin
Hugo

4
Боюсь, я не впевнений. Тепер, коли Safari доступний лише на Mac, у мене немає можливості протестувати це на Safari (оскільки я ненавиджу Mac і уникаю їх будь-якою ціною), тому я боюся, що не зможу знайти рішення для ти.
jezzipin

Було б ефективніше просто додати / видалити клас і зробити перехід за розміром за допомогою перетворення CSS.
Teetrinker

1
Як я вже згадував нижче щодо відповіді Сінкі, використання CSS обмежує підтримку вашого браузера, що означає, що ефект не буде відбуватися на IE8 та IE9. Якщо вам потрібна повна підтримка браузера, тоді вам потрібно буде використовувати цей метод через CSS.
jezzipin

88

Тут вилка CSS для анімації Sozi jezzin, щоб відокремити код від стилю.

JS:

$(window).on("scroll touchmove", function () {
  $('#header_nav').toggleClass('tiny', $(document).scrollTop() > 0);
});

CSS:

.header {
  width:100%;
  height:100px;
  background: #26b;
  color: #fff;
  position:fixed;
  top:0;
  left:0;
  transition: height 500ms, background 500ms;
}
.header.tiny {
  height:40px;
  background: #aaa;
}

http://jsfiddle.net/sinky/S8Fnq/

Під час прокрутки / дотику класу css "tiny" встановлено значення "#header_nav", якщо "$ (document) .scrollTop ()" перевищує 0.

Атрибут переходу CSS красиво анімує атрибут "висота" та "фон".


Хороша робота. Майте на увазі, що для користувачів IE9 та IE8 перехід не розпочнеться, оскільки ця властивість не підтримується у цих браузерах. Окрім цього, це відмінне рішення, оскільки це добре для тих, хто хоче скоротити кількість маніпуляцій dom у своєму коді. caniuse.com/#search=transition
jezzipin

6
@Sinky Ви могли б перемикати заняття в один рядок $('#header_nav').toggleClass('tiny', $(document).scrollTop() > 0);
Ерік

2
Має бути прийнятою відповіддю. На сьогоднішній день найчистіше рішення.
Джеффрі Розендал,

2
Трохи старий, але слід додати, $(window).trigger("scroll")якщо сторінка спочатку не відображається вгорі.
rabudde


3

Засновано на проблемі прокрутки Twitter ( http://ejohn.org/blog/learning-from-twitter/ ).

Ось моє рішення, регулювання події прокрутки js (корисно для мобільних пристроїв)

JS:

$(function() {
    var $document, didScroll, offset;
    offset = $('.menu').position().top;
    $document = $(document);
    didScroll = false;
    $(window).on('scroll touchmove', function() {
      return didScroll = true;
    });
    return setInterval(function() {
      if (didScroll) {
        $('.menu').toggleClass('fixed', $document.scrollTop() > offset);
        return didScroll = false;
      }
    }, 250);
  });

CSS:

.menu {
  background: pink;
  top: 5px;
}

.fixed {
  width: 100%;
  position: fixed;
  top: 0;
}

HTML:

<div class="menu">MENU FIXED ON TOP</div>

http://codepen.io/anon/pen/BgqHw


Дуже корисне посилання та вдосконалене рішення з урахуванням проблем із продуктивністю запущеного коду на кожній події прокрутки ... дякую! Ви кешували елемент $ (document), але також можете кешувати елемент $ ('. Menu) el, щоб код не отримував його кожного разу.
nabrown

0

Я зробив оновлену версію відповіді на jezzipin (і я анімую верхній відступ замість висоти, але ви все одно розумієте.

 /**
 * ResizeHeaderOnScroll
 *
 * @constructor
 */
var ResizeHeaderOnScroll = function()
{
    this.protocol           = window.location.protocol;
    this.domain             = window.location.host;
};

ResizeHeaderOnScroll.prototype.init    = function()
{
    if($(document).scrollTop() > 0)
    {
        $('header').data('size','big');
    } else {
        $('header').data('size','small');
    }

    ResizeHeaderOnScroll.prototype.checkScrolling();

    $(window).scroll(function(){
        ResizeHeaderOnScroll.prototype.checkScrolling();
    });
};

ResizeHeaderOnScroll.prototype.checkScrolling    = function()
{
    if($(document).scrollTop() > 0)
    {
        if($('header').data('size') == 'big')
        {
            $('header').data('size','small');
            $('header').stop().animate({
                paddingTop:'1em',
                paddingBottom:'1em'
            },200);
        }
    }
    else
      {
        if($('header').data('size') == 'small')
        {
            $('header').data('size','big');
            $('header').stop().animate({
                paddingTop:'3em'
            },200);
        }  
      }
}

$(document).ready(function(){
    var resizeHeaderOnScroll = new ResizeHeaderOnScroll();
    resizeHeaderOnScroll.init()
})

0

Я взяв відповідь Джеззіпіна і зробив так, що якщо ви прокручуєте сторінку, застосовується правильний розмір. Також вилучено деякі речі, які не обов’язково потрібні.

function sizer() {
    if($(document).scrollTop() > 0) {
        $('#header_nav').stop().animate({
            height:'40px'
        },600);
    } else {
        $('#header_nav').stop().animate({
            height:'100px'
        },600);
    }
}

$(window).scroll(function(){
    sizer();
});

sizer();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.