diff --git a/jquery.appear.js b/jquery.appear.js index ff0b764..a7ca39c 100644 --- a/jquery.appear.js +++ b/jquery.appear.js @@ -15,9 +15,11 @@ var check_lock = false; var defaults = { interval: 250, - force_process: false + force_process: false, + viewport: window } var $window = $(window); + var $viewport = $(defaults.viewport); var $prior_appeared; @@ -45,16 +47,26 @@ return false; } - var window_left = $window.scrollLeft(); - var window_top = $window.scrollTop(); + var is_win = $viewport[0] === window; + + var scroll_top = $viewport.scrollTop(); + var scroll_left = $viewport.scrollLeft(); + + var viewport_offset = $viewport.offset(); + var viewport_offset_top = is_win ? 0 : viewport_offset.top; + var viewport_offset_left = is_win ? 0 : viewport_offset.left; + var offset = $element.offset(); - var left = offset.left; - var top = offset.top; + var top = is_win ? offset.top : Math.abs(viewport_offset_top - offset.top - scroll_top); + var left = is_win ? offset.left : Math.abs(viewport_offset_left - offset.left - scroll_left); + + var extra_offset_top = $element.data('appear-top-offset') || 0; + var extra_offset_left = $element.data('appear-top-offset') || 0; - if (top + $element.height() >= window_top && - top - ($element.data('appear-top-offset') || 0) <= window_top + $window.height() && - left + $element.width() >= window_left && - left - ($element.data('appear-left-offset') || 0) <= window_left + $window.width()) { + if (top + $element.height() >= scroll_top && + top - extra_offset_top <= scroll_top + $viewport.height() && + left + $element.width() >= scroll_left && + left - extra_offset_left <= scroll_left + $viewport.width()) { return true; } else { return false; @@ -76,7 +88,9 @@ setTimeout(process, opts.interval); }; - $(window).scroll(on_check).resize(on_check); + $viewport = $(opts.viewport); + $viewport.scroll(on_check); + $window.resize(on_check); check_binded = true; }