Anxhelo Lushka
7 years ago
committed by
GitHub
1 changed files with 4 additions and 150 deletions
@ -1,150 +1,4 @@ |
|||
/* |
|||
* jQuery.appear |
|||
* https://github.com/bas2k/jquery.appear/
|
|||
* http://code.google.com/p/jquery-appear/
|
|||
* |
|||
* Copyright (c) 2009 Michael Hixson |
|||
* Copyright (c) 2012 Alexander Brovikov |
|||
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
|
|||
*/ |
|||
(function($) { |
|||
$.fn.appear = function(fn, options) { |
|||
|
|||
var settings = $.extend({ |
|||
|
|||
//arbitrary data to pass to fn
|
|||
data: undefined, |
|||
|
|||
//call fn only on the first appear?
|
|||
one: true, |
|||
|
|||
// X & Y accuracy
|
|||
accX: 0, |
|||
accY: 0 |
|||
|
|||
}, options); |
|||
|
|||
return this.each(function() { |
|||
|
|||
var t = $(this); |
|||
|
|||
//whether the element is currently visible
|
|||
t.appeared = false; |
|||
|
|||
if (!fn) { |
|||
|
|||
//trigger the custom event
|
|||
t.trigger('appear', settings.data); |
|||
return; |
|||
} |
|||
|
|||
var w = $(window); |
|||
|
|||
//fires the appear event when appropriate
|
|||
var check = function() { |
|||
|
|||
//is the element hidden?
|
|||
if (!t.is(':visible')) { |
|||
|
|||
//it became hidden
|
|||
t.appeared = false; |
|||
return; |
|||
} |
|||
|
|||
//is the element inside the visible window?
|
|||
var a = w.scrollLeft(); |
|||
var b = w.scrollTop(); |
|||
var o = t.offset(); |
|||
var x = o.left; |
|||
var y = o.top; |
|||
|
|||
var ax = settings.accX; |
|||
var ay = settings.accY; |
|||
var th = t.height(); |
|||
var wh = w.height(); |
|||
var tw = t.width(); |
|||
var ww = w.width(); |
|||
|
|||
if (y + th + ay >= b && |
|||
y <= b + wh + ay && |
|||
x + tw + ax >= a && |
|||
x <= a + ww + ax) { |
|||
|
|||
//trigger the custom event
|
|||
if (!t.appeared) t.trigger('appear', settings.data); |
|||
|
|||
} else { |
|||
|
|||
//it scrolled out of view
|
|||
t.appeared = false; |
|||
} |
|||
}; |
|||
|
|||
//create a modified fn with some additional logic
|
|||
var modifiedFn = function() { |
|||
|
|||
//mark the element as visible
|
|||
t.appeared = true; |
|||
|
|||
//is this supposed to happen only once?
|
|||
if (settings.one) { |
|||
|
|||
//remove the check
|
|||
w.unbind('scroll', check); |
|||
var i = $.inArray(check, $.fn.appear.checks); |
|||
if (i >= 0) $.fn.appear.checks.splice(i, 1); |
|||
} |
|||
|
|||
//trigger the original fn
|
|||
fn.apply(this, arguments); |
|||
}; |
|||
|
|||
//bind the modified fn to the element
|
|||
if (settings.one) t.one('appear', settings.data, modifiedFn); |
|||
else t.bind('appear', settings.data, modifiedFn); |
|||
|
|||
//check whenever the window scrolls
|
|||
w.scroll(check); |
|||
|
|||
//check whenever the dom changes
|
|||
$.fn.appear.checks.push(check); |
|||
|
|||
//check now
|
|||
(check)(); |
|||
}); |
|||
}; |
|||
|
|||
//keep a queue of appearance checks
|
|||
$.extend($.fn.appear, { |
|||
|
|||
checks: [], |
|||
timeout: null, |
|||
|
|||
//process the queue
|
|||
checkAll: function() { |
|||
var length = $.fn.appear.checks.length; |
|||
if (length > 0) while (length--) ($.fn.appear.checks[length])(); |
|||
}, |
|||
|
|||
//check the queue asynchronously
|
|||
run: function() { |
|||
if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout); |
|||
$.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20); |
|||
} |
|||
}); |
|||
|
|||
//run checks when these methods are called
|
|||
$.each(['append', 'prepend', 'after', 'before', 'attr', |
|||
'removeAttr', 'addClass', 'removeClass', 'toggleClass', |
|||
'remove', 'css', 'show', 'hide'], function(i, n) { |
|||
var old = $.fn[n]; |
|||
if (old) { |
|||
$.fn[n] = function() { |
|||
var r = old.apply(this, arguments); |
|||
$.fn.appear.run(); |
|||
return r; |
|||
} |
|||
} |
|||
}); |
|||
|
|||
})(jQuery); |
|||
(function($){$.fn.appear=function(fn,options){var settings=$.extend({data:undefined,one:true,accX:0,accY:0},options);return this.each(function(){var t=$(this);t.appeared=false;if(!fn){t.trigger('appear',settings.data);return;} |
|||
var w=$(window);var check=function(){if(!t.is(':visible')){t.appeared=false;return;} |
|||
var a=w.scrollLeft();var b=w.scrollTop();var o=t.offset();var x=o.left;var y=o.top;var ax=settings.accX;var ay=settings.accY;var th=t.height();var wh=w.height();var tw=t.width();var ww=w.width();if(y+th+ay>=b&&y<=b+wh+ay&&x+tw+ax>=a&&x<=a+ww+ax){if(!t.appeared)t.trigger('appear',settings.data);}else{t.appeared=false;}};var modifiedFn=function(){t.appeared=true;if(settings.one){w.unbind('scroll',check);var i=$.inArray(check,$.fn.appear.checks);if(i>=0)$.fn.appear.checks.splice(i,1);} |
|||
fn.apply(this,arguments);};if(settings.one)t.one('appear',settings.data,modifiedFn);else t.bind('appear',settings.data,modifiedFn);w.scroll(check);$.fn.appear.checks.push(check);(check)();});};$.extend($.fn.appear,{checks:[],timeout:null,checkAll:function(){var length=$.fn.appear.checks.length;if(length>0)while(length--)($.fn.appear.checks[length])();},run:function(){if($.fn.appear.timeout)clearTimeout($.fn.appear.timeout);$.fn.appear.timeout=setTimeout($.fn.appear.checkAll,20);}});$.each(['append','prepend','after','before','attr','removeAttr','addClass','removeClass','toggleClass','remove','css','show','hide'],function(i,n){var old=$.fn[n];if(old){$.fn[n]=function(){var r=old.apply(this,arguments);$.fn.appear.run();return r;}}});})(jQuery); |
|||
|
Loading…
Reference in new issue