123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /*
- * jQuery.appear
- * https://github.com/bas2k/jquery.appear/
- * http://code.google.com/p/jquery-appear/
- * http://bas2k.ru/
- *
- * Copyright (c) 2009 Michael Hixson
- * Copyright (c) 2012-2014 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);
|