Finding all elements with a scroll
This works with both horizontal and vertical scrollbars. The trick is detecting BOTH the too-wide/too-short AND if the computed CSS is going to allow you to display a scrollbar.
var ElementsWithScrolls = (function() { var getComputedStyle = document.body && document.body.currentStyle ? function(elem) { return elem.currentStyle; } : function(elem) { return document.defaultView.getComputedStyle(elem, null); }; function getActualCss(elem, style) { return getComputedStyle(elem)[style]; } function isXScrollable(elem) { return elem.offsetWidth < elem.scrollWidth && autoOrScroll(getActualCss(elem, 'overflow-x')); } function isYScrollable(elem) { return elem.offsetHeight < elem.scrollHeight && autoOrScroll(getActualCss(elem, 'overflow-y')); } function autoOrScroll(text) { return text == 'scroll' || text == 'auto'; } function hasScroller(elem) { return isYScrollable(elem) || isXScrollable(elem); } return function ElemenetsWithScrolls() { return [].filter.call(document.querySelectorAll('*'), hasScroller); };})();ElementsWithScrolls();
It will select the elements with overflowed and non-overflowed scrolls inside body tag:
$('body *').filter(function() { return ($(this).scrollTop() != 0 || $(this).css('overflow') == 'scroll');});