模拟a标签的hash---中部导航


主要功能


  • 固定中部导航栏(滚动到触发)

  • 滚动后可视内容和高亮标题一致(很多网站并未做到这一点)

  • 点击导航标题快速定位到内容

  • 可自定义当触发标题时的标题样式

基于JQuery实现

(function() {
  $.fn.smint = function(fxd) {
    var lastScrollTop, menuHeight,
        myOffset, mySelector, optionLocs,
        scrollSpeed, settings, smint, smintA,
        smintH, smintLi;
    settings = $.extend({
      'scrollSpeed': 500,
      'mySelector': 'div'
    });
    $(this).addClass('smint');
    optionLocs = new Array;
    lastScrollTop = 0;
    menuHeight = $('.smint').height();
    smint = $('.smint');
    smintLi = $('.smint li');
    smintA = $('.smint a');
    smintH = smintLi || smintA;
    myOffset = smint.height();
    if (settings.scrollSpeed) {
      scrollSpeed = settings.scrollSpeed;
    }
    if (settings.mySelector) {
      mySelector = settings.mySelector;
    }
    return smintH.each(function(index) {
      var id, stickyMenu, stickyTop;
      id = $(this).find('a').attr('href').split('#')[1];
      if (!$(this).hasClass('extLink')) {
        $(this).attr('id', id);
      }
      optionLocs.push(Array($(mySelector + '.' + id).position().top - menuHeight, $(mySelector + '.' + id).height() + $(mySelector + '.' + id).position().top, id));
      stickyTop = smint.offset().top;
      stickyMenu = function(direction) {
        var scrollTop;
        scrollTop = $(window).scrollTop() + myOffset;
        if (scrollTop > stickyTop + myOffset) {
          smint.css({
            'position': 'fixed',
            'top': 0
          }).addClass('fxd');
        } else {
          smint.css('position', 'relative').removeClass('fxd');
        }
        if (optionLocs[index][0] <= scrollTop && scrollTop <= optionLocs[index][1]) {
          if (direction === 'up') {
            $('#' + id).addClass('active');
            $('#' + optionLocs[index + 1][2]).removeClass('active');
          } else if (index > 0) {
            $('#' + id).addClass('active');
            $('#' + optionLocs[index - 1][2]).removeClass('active');
          } else if (direction === void 0) {
            $('#' + id).addClass('active');
          }
          $.each(optionLocs, function(i) {
            if (id !== optionLocs[i][2]) {
              $('#' + optionLocs[i][2]).removeClass('active');
            }
          });
        }
      };
      stickyMenu();
      $(window).scroll(function() {
        var direction, st;
        st = $(this).scrollTop() + myOffset;
        if ($(window).scrollTop() + $(window).height() === $(document).height()) {
          smintH.removeClass('active');
          $('.smint li:not(\'.extLink\'):last').addClass('active');
        } else {
          smintH.last().removeClass('active');
        }
        if (st > lastScrollTop) {
          direction = 'down';
        } else if (st < lastScrollTop) {
          direction = 'up';
        }
        lastScrollTop = st;
        stickyMenu(direction);
      });
      $(this).on('click', function(e) {
        var myOffset;
        var goTo, hash;
        myOffset = smint.height();
        e.preventDefault();
        hash = $(this).find('a').attr('href').split('#')[1];
        goTo = $(mySelector + '.' + hash).offset().top - myOffset;
        $('html, body').stop().animate({
          scrollTop: goTo
        }, scrollSpeed);
        if ($(this).hasClass('extLink')) {
          return false;
        }
      });
    });
  };
  $.fn.smint.defaults = {
    'scrollSpeed': 500,
    'mySelector': 'div'
  };
})(jQuery);

http://www.outyear.co.uk/smint/

根据此网站的代码 稍作修改

使用方式

  1. js中声明调用例如 导航的类“navbar-wrapper-middle”

$('.navbar-wrapper-middle').smint('fxd')
//fxd是自己css文件里按自己意愿定义好的类
//即导航栏固定后的样式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值