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
    Convert XML to JSON with JavaScript

    If you follow me on Twitter, you know that I've been working on a super top secret mobile application using Appcelerator Titanium.  The experience has been great:  using JavaScript to create easy to write, easy to test, native mobile apps has been fun.  My...

  • By
    Introducing MooTools Templated

    One major problem with creating UI components with the MooTools JavaScript framework is that there isn't a great way of allowing customization of template and ease of node creation. As of today, there are two ways of creating: new Element Madness The first way to create UI-driven...

Incredible Demos

  • By
    HTML5’s window.postMessage API

    One of the little known HTML5 APIs is the window.postMessage API.  window.postMessage allows for sending data messages between two windows/frames across domains.  Essentially window.postMessage acts as cross-domain AJAX without the server shims. Let's take a look at how window.postMessage works and how you...

  • By
    Animated AJAX Record Deletion Using jQuery

    I'm a huge fan of WordPress' method of individual article deletion. You click the delete link, the menu item animates red, and the item disappears. Here's how to achieve that functionality with jQuery JavaScript. The PHP - Content & Header The following snippet goes at the...

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!