jQuery - 向下滚动时会缩小的粘性标题

IT技术 javascript jquery html css web-deployment
2021-02-26 22:40:45

我想知道如何在向下滚动页面时缩小粘性标题(带动画),并在页面向上滚动到顶部时恢复正常状态。这里有两个例子需要澄清:

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

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

我得到了修复它的部分,但是当用户向下滚动时我应该如何缩小我的标题?

万分感谢

6个回答

这应该是您使用 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/

正如我在下面在 Sinky 的回答中提到的,使用 CSS 会限制您的浏览器支持,这意味着该效果不会在 IE8 和 IE9 上发生。如果您想要完整的浏览器支持,那么您将需要通过 CSS 使用此方法。
2021-04-21 22:40:45
恐怕我不确定。现在 Safari 只能在 Mac 上使用,我没有能力在 Safari 上进行测试(因为我讨厌 Mac 并不惜一切代价避免使用它们)所以我恐怕无法想出一个解决方案你。
2021-05-04 22:40:45
只添加/删除一个类并使用 CSS 转换进行大小转换会更有效。
2021-05-05 22:40:45
您的解决方案几乎是完美的,但我想 addClass() 而不是在不丢失动画的情况下调整高度。可能的?
2021-05-12 22:40:45
有谁知道为什么这适用于除 Safari for iOS 之外的所有浏览器?抄送@jezzipin
2021-05-14 22:40:45

这里是 jezzipin 解决方案的 CSS 动画分支,将代码与样式分开。

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/

在滚动/触摸移动时,如果 "$(document).scrollTop()" 大于 0,则 css 类 "tiny" 设置为 "#header_nav"。

CSS 过渡属性很好地为“高度”和“背景”属性设置了动画。

@Sinky 你可以在一行中切换类 $('#header_nav').toggleClass('tiny', $(document).scrollTop() > 0);
2021-04-16 22:40:45
有点旧,但应该添加一个$(window).trigger("scroll")if 页面最初没有显示在顶部。
2021-05-02 22:40:45
干得好。请记住,对于 IE9 和 IE8 的用户,转换不会启动,因为这些浏览器不支持此属性。除此之外,这是一个很好的解决方案,因为它适合任何想要减少代码中 dom 操作量的人。caniuse.com/#search=transition
2021-05-07 22:40:45
应该是公认的答案。迄今为止最干净的解决方案。
2021-05-14 22:40:45

http://callmenick.com/2014/02/18/create-an-animated-resizing-header-on-scroll/

此链接有一个很棒的教程,其中包含您可以使用的源代码,展示了如何使标题中的元素以及标题本身变小。

现在链接失效了
2021-05-10 22:40:45

基于 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,这样代码就不会每次都检索它。
2021-05-12 22:40:45

我做了 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()
})