目录导航

!function(win,doc){
    // 快速导航
    var $dir = $('.art-aside-dir');
    // 需要快速导航定位到的项
    var $hd = $('.art-sec .hd');
    // 离顶部距离
    var spaceTop = 50;
    // 创建导航html
    $hd.each(function(i){
        var $t = $(this);
        $t.attr('id','art-h-' + i);
        $dir.append('<li data-id="art-h-' + i + '">' + $t.text() + '</li>')
    });
    var dirTop = 0;
    // 存储手动点击的导航项
    var hand;
    $(win).scroll(function(e) {
        var winTop = $(win).scrollTop();
        var $currH2;
        if ( winTop > dirTop ) {
            $dir.css('top',winTop);
        } else {
            $dir.css('top',dirTop);
        }
        $hd.each(function(i){
            // 如果此标题大于视口上边时
            // 如果当前标题是第一个标题就返回第一个并退出,否则返回它之前的一个
            if ( $(this).offset().top - spaceTop > winTop ) {
                $currH2 = i == 0 ? $hd.eq(0) : $hd.eq( i - 1 );
                return false;
            } else {
                // 当视口上边已经大于最后一个标题时就返回最后一个标题
                $currH2 = $hd.filter(':last')
            }
        });
        var winH = $(win).height();
        var docH = $(doc).height();
        // 存在手动点击导航项时
        if ( hand ) {
            $dir.children().removeClass('on').filter('[data-id=' + hand.attr('id') + ']').addClass('on');
            // 手动点击导航项滚动到期望位置误差值小于1时就假设已到达期望位置,停止滚动
            var scrolled = winTop - (hand.offset().top - spaceTop);
            // 到了页尾或到了点击项位置
            if ( winTop + winH == docH || (scrolled < 1 && scrolled > -1) ) {
                $('body,html').stop(true);
                // 删除暂存的点击项
                hand = undefined;
            }
        // 不存在手动点击项时
        } else {
            // 到页尾是直接设置最后一个导航项
            if ( winTop + winH == docH ) {
                $dir.children().removeClass('on').filter(':last').addClass('on');
            } else {
                // 设置当前滚动到的项
                $dir.children().removeClass('on').filter('[data-id=' + $currH2.attr('id') + ']').addClass('on');
            }
        }
        $dir.show();
    });
    $dir.children().click(function(){
        hand = $hd.filter('#' + $(this).attr('data-id'));
        // 防止项的高度太短,不触发滚动时,当前点击的项没有加上当前项class
        $dir.children().removeClass('on').filter('[data-id=' + hand.attr('id') + ']').addClass('on');
        $('body,html').stop(true).animate({'scrollTop':hand.offset().top - spaceTop},'fast');
    });
}(window,document)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值