这里的大多数答案都没有考虑到元素也可以隐藏,因为它是从div的视图中滚动出来的,而不仅仅是整个页面。
为了覆盖这种可能性,基本上必须检查元素是否位于其父元素的边界内。
这个解决方案确实做到了:
function(element, percentX, percentY){
var tolerance = 0.01; //needed because the rects returned by getBoundingClientRect provide the position up to 10 decimals
if(percentX == null){
percentX = 100;
}
if(percentY == null){
percentY = 100;
}
var elementRect = element.getBoundingClientRect();
var parentRects = [];
while(element.parentElement != null){
parentRects.push(element.parentElement.getBoundingClientRect());
element = element.parentElement;
}
var visibleInAllParents = parentRects.every(function(parentRect){
var visiblePixelX = Math.min(elementRect.right, parentRect.right) - Math.max(elementRect.left, parentRect.left);
var visiblePixelY = Math.min(elementRect.bottom, parentRect.bottom) - Math.max(elementRect.top, parentRect.top);
var visiblePercentageX = visiblePixelX / elementRect.width * 100;
var visiblePercentageY = visiblePixelY / elementRect.height * 100;
return visiblePercentageX + tolerance > percentX && visiblePercentageY + tolerance > percentY;
});
return visibleInAllParents;
};
它还允许您指定它在每个方向上的可见百分比。
它不包括由于其他因素而隐藏的可能性,比如
display: hidden
.
这应该适用于所有主流浏览器,因为它只使用
getBoundingClientRect
. 我在chrome和internet explorer 11中亲自测试过。