-
-
Save davidtheclark/5515733 to your computer and use it in GitHub Desktop.
/* | |
No jQuery necessary. | |
Thanks to Dan's StackOverflow answer for this: | |
http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport | |
*/ | |
function isElementInViewport(el) { | |
var rect = el.getBoundingClientRect(); | |
return ( | |
rect.top >= 0 && | |
rect.left >= 0 && | |
rect.bottom <= (window.innerHeight || document. documentElement.clientHeight) && | |
rect.right <= (window.innerWidth || document. documentElement.clientWidth) | |
); | |
} |
Thanks very much
Awesome, worked like a charm
Great. Thank you
This is awesome- suited my needs perfectly. Thank you!
Thank you sir, isAnyPartOfElementInViewport() works fine for me.
what if the element inside iframe and one of its parent having scale 70%.
nice!
thanks.
Excellent work! Thank you very much!
well, the first code didnt work for me.
@StokeMasterJack 's code did work though ( isAnyPartOfElementInViewport )
Thank you.
Doesn't work with overflowed elements when element scrolls out of view, both these functions return true.
Bit of a mind-bender but is works.
Thx @StokeMasterJack.
I needed a vertical only version of @StokeMasterJack's function, and wanted to rewrite it to be as short as possible. Not pretty, but still handy!
const isInViewport = (e, {top:t, height:h} = e.getBoundingClientRect()) => t <= innerHeight && t + h >= 0;
@audunolsen, awesome!
Just what I needed to use. @StokeMasterJack Thank you!
Thanks for this
Could someone please write this @audunolsen version without arrow function? Because I don't understand well this format. Thank you!
If someone explain how I can modify this function with my selector I will be very grateful.
I need to know if a specific tag is in the viewport for triggering on Google Tag Manager.
Should we consider about el.style.display !== 'none'
?
function isElementInViewport(el) {
if (el.style.display === 'none') return false
var rect = el.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document. documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document. documentElement.clientWidth)
);
}
it won't work if the element is coming from top, if half coming by scroll up, in this case, the top is nagetive, but the bottom is positive.
width: 300 height: 300 top: -255.03125 right: 827.03125 bottom: 44.96875 left: 527.03125
hello guys, JS is new thing to me. Can someone please explain me what does (el) represent in this script? Because it is not mentioned anywhere else in code but on the beginning.
Hello Mistovic,
The (el) parameter is the DOM element that has been passed to the function to check if it is in the viewport or not yet.
Hello Mistovic,
The (el) parameter is the DOM element that has been passed to the function to check if it is in the viewport or not yet.
Hello, and thank you for a reply.
So basically, we created a new element (el) with boundingClientRect() and gave him coordinates (or size) with return (top, left, bottom, right).
is that understood well?
Here is
isAnyPartOfElementInViewport
from that same stackoverflow thread: