Skip to content

Instantly share code, notes, and snippets.

@davidtheclark
Created May 4, 2013 02:00
Show Gist options
  • Select an option

  • Save davidtheclark/5515733 to your computer and use it in GitHub Desktop.

Select an option

Save davidtheclark/5515733 to your computer and use it in GitHub Desktop.
JavaScript: Is element in viewport?
/*
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)
);
}
@ffgcvs

ffgcvs commented Aug 16, 2019

Copy link
Copy Markdown

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.

@Magiccwl

Magiccwl commented Aug 21, 2019 •

Copy link
Copy Markdown

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)
  );
}

@Troy-Yang

Copy link
Copy Markdown

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

@Mistovic

Copy link
Copy Markdown

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.

@Mistovic

Copy link
Copy Markdown

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment