www.gusucode.com > 【T6965】响应式互联网网络建设设计类织梦模板(自适应手机端) > 【T6965】响应式互联网网络建设设计类织梦模板(自适应手机端)/skin/js/jquery.bootstrap-autohidingnavbar.js

    ;(function($, window, document, undefined) {

  var pluginName = 'autoHidingNavbar',

      $window = $(window),

      $document = $(document),

      _scrollThrottleTimer = null,

      _resizeThrottleTimer = null,

      _throttleDelay = 70,

      _lastScrollHandlerRun = 0,

      _previousScrollTop = null,

      _windowHeight = $window.height(),

      _visible = true,

      _hideOffset,

      defaults = {

        disableAutohide: false,

        showOnUpscroll: true,

        showOnBottom: true,

        hideOffset: 'auto', // "auto" means the navbar height

        animationDuration: 200

      };



  function AutoHidingNavbar(element, options) {

    this.element = $(element);

    this.settings = $.extend({}, defaults, options);

    this._defaults = defaults;

    this._name = pluginName;

    this.init();

  }



  function hide(autoHidingNavbar) {

    if (!_visible) {

      return;

    }



    autoHidingNavbar.element.addClass('navbar-hidden').animate({

      top: -autoHidingNavbar.element.height()

    }, {

      queue: false,

      duration: autoHidingNavbar.settings.animationDuration

    });



    $('.dropdown.open .dropdown-toggle', autoHidingNavbar.element).dropdown('toggle');



    _visible = false;

  }



  function show(autoHidingNavbar) {

    if (_visible) {

      return;

    }



    autoHidingNavbar.element.removeClass('navbar-hidden').animate({

      top: 0

    }, {

      queue: false,

      duration: autoHidingNavbar.settings.animationDuration

    });

    _visible = true;

  }



  function detectState(autoHidingNavbar) {

    var scrollTop = $window.scrollTop(),

        scrollDelta = scrollTop - _previousScrollTop;



    _previousScrollTop = scrollTop;



    if (scrollDelta < 0) {

      if (_visible) {

        return;

      }



      if (autoHidingNavbar.settings.showOnUpscroll || scrollTop <= _hideOffset) {

        show(autoHidingNavbar);

      }

    }

    else if (scrollDelta > 0) {

      if (!_visible) {

        if (autoHidingNavbar.settings.showOnBottom && scrollTop + _windowHeight === $document.height()) {

          show(autoHidingNavbar);

        }

        return;

      }



      if (scrollTop >= _hideOffset) {

        hide(autoHidingNavbar);

      }

    }



  }



  function scrollHandler(autoHidingNavbar) {

    if (autoHidingNavbar.settings.disableAutohide) {

      return;

    }



    _lastScrollHandlerRun = new Date().getTime();



    detectState(autoHidingNavbar);

  }



  function bindEvents(autoHidingNavbar) {

    $document.on('scroll.' + pluginName, function() {

      if (new Date().getTime() - _lastScrollHandlerRun > _throttleDelay) {

        scrollHandler(autoHidingNavbar);

      }

      else {

        clearTimeout(_scrollThrottleTimer);

        _scrollThrottleTimer = setTimeout(function() {

          scrollHandler(autoHidingNavbar);

        }, _throttleDelay);

      }

    });



    $window.on('resize.' + pluginName, function() {

      clearTimeout(_resizeThrottleTimer);

      _resizeThrottleTimer = setTimeout(function() {

        _windowHeight = $window.height();

      }, _throttleDelay);

    });

  }



  function unbindEvents() {

    $document.off('.' + pluginName);



    $window.off('.' + pluginName);

  }



  AutoHidingNavbar.prototype = {

    init: function() {

      this.elements = {

        navbar: this.element

      };



      this.setDisableAutohide(this.settings.disableAutohide);

      this.setShowOnUpscroll(this.settings.showOnUpscroll);

      this.setShowOnBottom(this.settings.showOnBottom);

      this.setHideOffset(this.settings.hideOffset);

      this.setAnimationDuration(this.settings.animationDuration);



      _hideOffset = this.settings.hideOffset === 'auto' ? this.element.height() : this.settings.hideOffset;

      bindEvents(this);



      return this.element;

    },

    setDisableAutohide: function(value) {

      this.settings.disableAutohide = value;

      return this.element;

    },

    setShowOnUpscroll: function(value) {

      this.settings.showOnUpscroll = value;

      return this.element;

    },

    setShowOnBottom: function(value) {

      this.settings.showOnBottom = value;

      return this.element;

    },

    setHideOffset: function(value) {

      this.settings.hideOffset = value;

      return this.element;

    },

    setAnimationDuration: function(value) {

      this.settings.animationDuration = value;

      return this.element;

    },

    show: function() {

      show(this);

      return this.element;

    },

    hide: function() {

      hide(this);

      return this.element;

    },

    destroy: function() {

      unbindEvents(this);

      show(this);

      $.data(this, 'plugin_' + pluginName, null);

      return this.element;

    }

  };



  $.fn[pluginName] = function(options) {

    var args = arguments;



    if (options === undefined || typeof options === 'object') {

      return this.each(function() {

        if (!$.data(this, 'plugin_' + pluginName)) {

          $.data(this, 'plugin_' + pluginName, new AutoHidingNavbar(this, options));

        }

      });

    } else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {

      var returns;



      this.each(function() {

        var instance = $.data(this, 'plugin_' + pluginName);



        if (instance instanceof AutoHidingNavbar && typeof instance[options] === 'function') {

          returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1));

        }

      });



      return returns !== undefined ? returns : this;

    }



  };



})(jQuery, window, document);