98 lines
2.4 KiB
JavaScript
98 lines
2.4 KiB
JavaScript
(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);
|