jquery-scrollspy.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*!
  2. * jQuery Scrollspy Plugin
  3. * Author: @sxalexander
  4. * Licensed under the MIT license
  5. */
  6. ;(function ( $, window, document, undefined ) {
  7. $.fn.extend({
  8. scrollspy: function ( options ) {
  9. var defaults = {
  10. min: 0,
  11. max: 0,
  12. mode: 'vertical',
  13. buffer: 0,
  14. container: window,
  15. onEnter: options.onEnter ? options.onEnter : [],
  16. onLeave: options.onLeave ? options.onLeave : [],
  17. onTick: options.onTick ? options.onTick : []
  18. }
  19. var options = $.extend( {}, defaults, options );
  20. return this.each(function (i) {
  21. var element = this;
  22. var o = options;
  23. var $container = $(o.container);
  24. var mode = o.mode;
  25. var buffer = o.buffer;
  26. var enters = leaves = 0;
  27. var inside = false;
  28. /* add listener to container */
  29. $container.bind('scroll', function(e){
  30. var position = {top: $(this).scrollTop(), left: $(this).scrollLeft()};
  31. var xy = (mode == 'vertical') ? position.top + buffer : position.left + buffer;
  32. var max = o.max;
  33. var min = o.min;
  34. /* fix max */
  35. if($.isFunction(o.max)){
  36. max = o.max();
  37. }
  38. /* fix max */
  39. if($.isFunction(o.min)){
  40. min = o.min();
  41. }
  42. if(max == 0){
  43. max = (mode == 'vertical') ? $container.height() : $container.outerWidth() + $(element).outerWidth();
  44. }
  45. /* if we have reached the minimum bound but are below the max ... */
  46. if(xy >= o.min && xy <= max){
  47. /* trigger enter event */
  48. if(!inside){
  49. inside = true;
  50. enters++;
  51. /* fire enter event */
  52. $(element).trigger('scrollEnter', {position: position})
  53. if($.isFunction(o.onEnter)){
  54. o.onEnter(element, position);
  55. }
  56. }
  57. /* triger tick event */
  58. $(element).trigger('scrollTick', {position: position, inside: inside, enters: enters, leaves: leaves})
  59. if($.isFunction(o.onTick)){
  60. o.onTick(element, position, inside, enters, leaves);
  61. }
  62. }else{
  63. if(inside){
  64. inside = false;
  65. leaves++;
  66. /* trigger leave event */
  67. $(element).trigger('scrollLeave', {position: position, leaves:leaves})
  68. if($.isFunction(o.onLeave)){
  69. o.onLeave(element, position);
  70. }
  71. }
  72. }
  73. });
  74. });
  75. }
  76. })
  77. })( jQuery, window );