不是自动的。您必须捕获滚动事件,并通过比较DIV矩形和可见页面矩形的坐标来检查每次是否在视图中。
下面是一个最小的例子。
<div id="importantdiv">hello</div>
<script type="text/javascript">
function VisibilityMonitor(element, showfn, hidefn) {
var isshown= false;
function check() {
if (rectsIntersect(getPageRect(), getElementRect(element)) !== isshown) {
isshown= !isshown;
isshown? showfn() : hidefn();
}
};
window.onscroll=window.onresize= check;
check();
}
function getPageRect() {
var isquirks= document.compatMode!=='BackCompat';
var page= isquirks? document.documentElement : document.body;
var x= page.scrollLeft;
var y= page.scrollTop;
var w= 'innerWidth' in window? window.innerWidth : page.clientWidth;
var h= 'innerHeight' in window? window.innerHeight : page.clientHeight;
return [x, y, x+w, y+h];
}
function getElementRect(element) {
var x= 0, y= 0;
var w= element.offsetWidth, h= element.offsetHeight;
while (element.offsetParent!==null) {
x+= element.offsetLeft;
y+= element.offsetTop;
element= element.offsetParent;
}
return [x, y, x+w, y+h];
}
function rectsIntersect(a, b) {
return a[0]<b[2] && a[2]>b[0] && a[1]<b[3] && a[3]>b[1];
}
VisibilityMonitor(
document.getElementById('importantdiv'),
function() {
alert('div in view!');
},
function() {
alert('div gone away!');
}
);
</script>
您可以通过以下方式来改进:
-
抓住它
onscroll
所有的祖先
overflow
scroll
或
auto
并根据滚动位置调整左上角坐标
-
检测
溢流
纸卷
,
汽车
和
hidden
裁切使DIV脱离屏幕
-
使用
addEventListener
/
attachEvent
使用“调整大小/滚动”事件允许多个可见性监视器和其他内容
-
一些兼容性黑客
getElementRect
在某些情况下,为了使命令更准确,如果您真的需要,还可以取消某些事件绑定以避免IE6-7内存泄漏。