Element.offsetHeight for Visibility

By  on  

One of the (perceived) tricky tasks within front-end coding is checking if an element is visible or not.  The very naive way of checking if an element is visible (i.e. has presence or takes up space on the page) is by checking its display style value:

var incorrectIsVisible = window.getComputedStyle(someElement, null).getPropertyValue('display'); // "inline", "inline-block", "block", etc.

Notice I'm not checking the opacity as well because an invisible element still takes up space on the screen.  The problem with the code above is that you can gain the style of a child but that may not matter if its parent is set to display: none.  For example, if the child's display style value is inline-block, but the element's parent display style is none, the child element is still not visible.  Oddly enough, checking the child element's offsetHeight value will signal if the element is likely visible:

var correctIsVisible = someElement.offsetHeight; // 0 for hidden, more than 0 for displaying

If the element is a child of an element which is display: none, the offsetHeight will be 0 and thus you know the element is not visible despite its display value. Again, remember that opacity is not considered and an element which is opacity: 0 is still technically visible, taking up space.

Recent Features

  • By
    5 Awesome New Mozilla Technologies You’ve Never Heard Of

    My trip to Mozilla Summit 2013 was incredible.  I've spent so much time focusing on my project that I had lost sight of all of the great work Mozillians were putting out.  MozSummit provided the perfect reminder of how brilliant my colleagues are and how much...

  • By
    Camera and Video Control with HTML5

    Client-side APIs on mobile and desktop devices are quickly providing the same APIs.  Of course our mobile devices got access to some of these APIs first, but those APIs are slowly making their way to the desktop.  One of those APIs is the getUserMedia API...

Incredible Demos

  • By
    MooTools History Plugin

    One of the reasons I love AJAX technology so much is because it allows us to avoid unnecessary page loads.  Why download the header, footer, and other static data multiple times if that specific data never changes?  It's a waste of time, processing, and bandwidth.  Unfortunately...

  • By
    MooTools 1.2 Tooltips: Customize Your Tips

    I've never met a person that is "ehhhh" about XHTML/javascript tooltips; people seem to love them or hate them. I'm on the love side of things. Tooltips give you a bit more information about something than just the element itself (usually...

Discussion

  1. René

    Unfortunately there are a lot of caveats to this.
    First of all, it’s not just opacity that will render an element invisible but still taking up space.(filters and visibility:hidden)

    Another that comes to mind right away is checking elements that have no padding or border and have just floating/absolute/fixed children.

    Also, in some cases you could set an element’s height to 0 and having overflowing children (don’t have a use case popping up though)

    Solution; somebody else probably figured that out. My first guess would be either setting height to 1px for the test or bubbling up and use the display none check..

  2. Fabrizio

    What about checking for El.clientwidth === 0

  3. Fabrizio

    and are there other way to check is an element is visible without triggering a reflow/repaint?

  4. Christoph

    The best bet seems to me to check Element.offsetParent. If it returns null, the element is not visible.

  5. Javier

    What about SVG elements? They don’t have offsetHeight property, but they can be set to display:none;

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!