Created
January 27, 2014 10:19
-
-
Save jjmu15/8646226 to your computer and use it in GitHub Desktop.
check if element is in viewport - vanilla JS. Use by adding a “scroll” event listener to the window and then calling isInViewport().
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Determine if an element is in the visible viewport | |
function isInViewport(element) { | |
var rect = element.getBoundingClientRect(); | |
var html = document.documentElement; | |
return ( | |
rect.top >= 0 && | |
rect.left >= 0 && | |
rect.bottom <= (window.innerHeight || html.clientHeight) && | |
rect.right <= (window.innerWidth || html.clientWidth) | |
); | |
} | |
The above function could be used by adding a “scroll” event listener to the window and then calling isInViewport(). |
Just wrote a similar version that only accounts for height, but returns true when any part of the element is in the viewport:
function isVisible (ele) { const { top, bottom } = ele.getBoundingClientRect(); const vHeight = (window.innerHeight || document.documentElement.clientHeight); return ( (top > 0 || bottom > 0) && top < vHeight ); }
this is the one working as of now
Great work guys @jjmu15 and Tsimons@ Your snippets are amazing. I have been looking for something like this. Didn't want to import a library to solve just one problem
you are probably the greatest human being in my perspective now, thanks
Thanks for sharing this inspiring piece of code. ;)
Here is an extended version that supports checking for full visibility in more specific areas.
function isInViewport(element, parentElement=null)
{
var childRect = element.getBoundingClientRect();
if (parentElement == null)
{
// check for full visibility in window area
// (original version)
var html = document.documentElement;
return (
childRect.top >= 0 &&
childRect.left >= 0 &&
childRect.bottom <= (window.innerHeight || html.clientHeight) &&
childRect.right <= (window.innerWidth || html.clientWidth)
);
}
else
{
// check for full visibility in a specific parent element's area
// (for scrollable containers that don't fill the whole window)
var parentRect = parentElement.getBoundingClientRect();
return (
childRect.top >= parentRect.top &&
childRect.left >= parentRect.left &&
childRect.bottom <= parentRect.bottom &&
childRect.right <= parentRect.right
);
}
}
why arent you guys using the
IntersectionObserver API in vanilla JS?
More about it here < https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API >
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thank you Jjmu15 and Tsimons. Your snippets each address different needs.