Измерение смещений будет работать, если вы смотрите только на свойство отображения,
но тест для visibility требует изучения каскада стилей (зависящего от браузера)
document.deepCss=function(who, css){
var val, dv= document.defaultView || window;
val= who.style[css];
if(!val){
if(who.currentStyle) val= who.currentStyle[css];
else val= dv.getComputedStyle(who,"").getPropertyValue(css);
}
return val || "";
}
function isVisible(who){
return !!(document.deepCss(who,'visibility') != 'hidden' &&
document.deepCss(who,'display') != 'none');
}