Вход Регистрация
Файл: documentation/assets/js/jquery.smooth-scroll.js
Строк: 223
<?php
(function($) {
var 
version '1.5.2',
    
optionOverrides = {},
    
defaults = {
      
exclude: [],
      
excludeWithin:[],
      
offset0,

      
// one of 'top' or 'left'
      
direction'top',

      
// jQuery set of elements you wish to scroll (for $.smoothScroll).
      //  if null (default), $('html, body').firstScrollable() is used.
      
scrollElementnull,

      
// only use if you want to override default behavior
      
scrollTargetnull,

      
// fn(opts) function to be called before scrolling occurs.
      // `this` is the element(s) being scrolled
      
beforeScroll: function() {},

      
// fn(opts) function to be called after scrolling occurs.
      // `this` is the triggering element
      
afterScroll: function() {},
      
easing'swing',
      
speed400,

      
// coefficient for "auto" speed
      
autoCoefficient2,

      
// $.fn.smoothScroll only: whether to prevent the default click action
      
preventDefaulttrue
    
},

    
getScrollable = function(opts) {
      var 
scrollable = [],
          
scrolled false,
          
dir opts.dir && opts.dir === 'left' 'scrollLeft' 'scrollTop';

      
this.each(function() {

        if (
this === document || this === window) { return; }
        var 
el = $(this);
        if ( 
el[dir]() > ) {
          
scrollable.push(this);
        } else {
          
// if scroll(Top|Left) === 0, nudge the element 1px and see if it moves
          
el[dir](1);
          
scrolled el[dir]() > 0;
          if ( 
scrolled ) {
            
scrollable.push(this);
          }
          
// then put it back, of course
          
el[dir](0);
        }
      });

      
// If no scrollable elements, fall back to <body>,
      // if it's in the jQuery collection
      // (doing this because Safari sets scrollTop async,
      // so can't set it to 1 and immediately get the value.)
      
if (!scrollable.length) {
        
this.each(function() {
          if (
this.nodeName === 'BODY') {
            
scrollable = [this];
          }
        });
      }

      
// Use the first scrollable element if we're calling firstScrollable()
      
if ( opts.el === 'first' && scrollable.length ) {
        
scrollable = [ scrollable[0] ];
      }

      return 
scrollable;
    };

$.fn.
extend({
  
scrollable: function(dir) {
    var 
scrl getScrollable.call(this, {dirdir});
    return 
this.pushStack(scrl);
  },
  
firstScrollable: function(dir) {
    var 
scrl getScrollable.call(this, {el'first'dirdir});
    return 
this.pushStack(scrl);
  },

  
smoothScroll: function(optionsextra) {
    
options options || {};

    if ( 
options === 'options' ) {
      if ( !
extra ) {
        return 
this.first().data('ssOpts');
      }
      return 
this.each(function() {
        var 
$this = $(this),
            
opts = $.extend($this.data('ssOpts') || {}, extra);

        $(
this).data('ssOpts'opts);
      });
    }

    var 
opts = $.extend({}, $.fn.smoothScroll.defaultsoptions),
        
locationPath = $.smoothScroll.filterPath(location.pathname);

    
this
    
.unbind('click.smoothscroll')
    .
bind('click.smoothscroll', function(event) {
      var 
link this,
          
$link = $(this),
          
thisOpts = $.extend({}, opts$link.data('ssOpts') || {}),
          
exclude opts.exclude,
          
excludeWithin thisOpts.excludeWithin,
          
elCounter 0ewlCounter 0,
          include = 
true,
          
clickOpts = {},
          
hostMatch = ((location.hostname === link.hostname) || !link.hostname),
          
pathMatch thisOpts.scrollTarget || ( $.smoothScroll.filterPath(link.pathname) === locationPath ),
          
thisHash escapeSelector(link.hash);

      if ( !
thisOpts.scrollTarget && (!hostMatch || !pathMatch || !thisHash) ) {
        include = 
false;
      } else {
        while (include && 
elCounter exclude.length) {
          if (
$link.is(escapeSelector(exclude[elCounter++]))) {
            include = 
false;
          }
        }
        while ( include && 
ewlCounter excludeWithin.length ) {
          if (
$link.closest(excludeWithin[ewlCounter++]).length) {
            include = 
false;
          }
        }
      }

      if ( include ) {

        if ( 
thisOpts.preventDefault ) {
          
event.preventDefault();
        }

        $.
extendclickOptsthisOpts, {
          
scrollTargetthisOpts.scrollTarget || thisHash,
          
linklink
        
});

        $.
smoothScrollclickOpts );
      }
    });

    return 
this;
  }
});

$.
smoothScroll = function(optionspx) {
  if ( 
options === 'options' && typeof px === 'object' ) {
    return $.
extend(optionOverridespx);
  }
  var 
opts$scrollerscrollTargetOffsetspeeddelta,
      
scrollerOffset 0,
      
offPos 'offset',
      
scrollDir 'scrollTop',
      
aniProps = {},
      
aniOpts = {};

  if (
typeof options === 'number') {
    
opts = $.extend({linknull}, $.fn.smoothScroll.defaultsoptionOverrides);
    
scrollTargetOffset options;
  } else {
    
opts = $.extend({linknull}, $.fn.smoothScroll.defaultsoptions || {}, optionOverrides);
    if (
opts.scrollElement) {
      
offPos 'position';
      if (
opts.scrollElement.css('position') === 'static') {
        
opts.scrollElement.css('position''relative');
      }
    }
  }

  
scrollDir opts.direction === 'left' 'scrollLeft' scrollDir;

  if ( 
opts.scrollElement ) {
    
$scroller opts.scrollElement;
    if ( !(/^(?:
HTML|BODY)$/).test($scroller[0].nodeName) ) {
      
scrollerOffset $scroller[scrollDir]();
    }
  } else {
    
$scroller = $('html, body').firstScrollable(opts.direction);
  }

  
// beforeScroll callback function must fire before calculating offset
  
opts.beforeScroll.call($scrolleropts);

  
scrollTargetOffset = (typeof options === 'number') ? options :
                        
px ||
                        ( $(
opts.scrollTarget)[offPos]() &&
                        $(
opts.scrollTarget)[offPos]()[opts.direction] ) ||
                        
0;

  
aniProps[scrollDir] = scrollTargetOffset scrollerOffset opts.offset;
  
speed opts.speed;

  
// automatically calculate the speed of the scroll based on distance / coefficient
  
if (speed === 'auto') {

    
// $scroller.scrollTop() is position before scroll, aniProps[scrollDir] is position after
    // When delta is greater, speed will be greater.
    
delta aniProps[scrollDir] - $scroller.scrollTop();
    if(
delta 0) {
      
delta *= -1;
    }

    
// Divide the delta by the coefficient
    
speed delta opts.autoCoefficient;
  }

  
aniOpts = {
    
durationspeed,
    
easingopts.easing,
    
complete: function() {
      
opts.afterScroll.call(opts.linkopts);
    }
  };

  if (
opts.step) {
    
aniOpts.step opts.step;
  }

  if (
$scroller.length) {
    
$scroller.stop().animate(aniPropsaniOpts);
  } else {
    
opts.afterScroll.call(opts.linkopts);
  }
};

$.
smoothScroll.version version;
$.
smoothScroll.filterPath = function(string) {
  
string string || '';
  return 
string
    
.replace(/^//,'')
    
.replace(/(?:index|default).[a-zA-Z]{3,4}$/,'')
    .
replace(//$/,'');
};

// default options
$.fn.smoothScroll.defaults defaults;

function 
escapeSelector (str) {
  return 
str.replace(/(:|.)/g,'\$1');
}

})(
jQuery);
?>
Онлайн: 0
Реклама