diff --git a/README.md b/README.md index ffb00a6..be79f04 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,14 @@ containing: - `throttle`: a number indicating a millisecond value of throttle which will limit the in-view event firing rate to happen every that many milliseconds +- `considerPageVisibility`: A boolean indicating whether or not the page + visibility should be considered when marking an element as visible or not + (default false). + +- `considerDocumentFocus`: A boolean indicating whether or not the document + focus should be considered when marking an element as visible or not + (default false). + ### InViewContainer Use `in-view-container` when you have a scrollable container that contains `in-view` diff --git a/angular-inview.js b/angular-inview.js index debc09e..1d2cf26 100644 --- a/angular-inview.js +++ b/angular-inview.js @@ -62,7 +62,17 @@ function inViewDirective ($parse) { var viewportEventSignal = signalSingle({ type: 'initial' }) // Merged with the window events - .merge(signalFromEvent(window, 'checkInView click ready wheel mousewheel DomMouseScroll MozMousePixelScroll resize scroll touchmove mouseup keydown')) + .merge(signalFromEvent(window, 'checkInView click ready wheel mousewheel DomMouseScroll MozMousePixelScroll resize scroll touchmove mouseup keydown')); + + // Merged with the page visibility events + if (options.considerPageVisibility) { + viewportEventSignal = viewportEventSignal.merge(signalFromEvent(document, 'visibilitychange')); + } + + // Merged with the page focus/blur events + if (options.considerPageFocus) { + viewportEventSignal = viewportEventSignal.merge(signalFromEvent(window, 'focus blur')); + } // Merge with container's events signal if (container) { @@ -94,8 +104,10 @@ function inViewDirective ($parse) { viewportRect = offsetRect(viewportRect, options.viewportOffset); var elementRect = offsetRect(element[0].getBoundingClientRect(), options.offset); var isVisible = !!(element[0].offsetWidth || element[0].offsetHeight || element[0].getClientRects().length); + var documentVisible = !options.considerPageVisibility || document.visibilityState === 'visible' || document.hidden === false; + var documentFocussed = !options.considerPageFocus || document.hasFocus(); var info = { - inView: isVisible && intersectRect(elementRect, viewportRect), + inView: documentVisible && documentFocussed && isVisible && intersectRect(elementRect, viewportRect), event: event, element: element, elementRect: elementRect, diff --git a/examples/pagefocus.html b/examples/pagefocus.html new file mode 100644 index 0000000..8c2401c --- /dev/null +++ b/examples/pagefocus.html @@ -0,0 +1,88 @@ + + + + + angular-inview basic example + + + + +
+ +
+ + + + + + + + diff --git a/examples/pagevisibility.html b/examples/pagevisibility.html new file mode 100644 index 0000000..40d3e8a --- /dev/null +++ b/examples/pagevisibility.html @@ -0,0 +1,83 @@ + + + + + angular-inview basic example + + + + +
+ +
+ + + + + + + +