检查元素是否在屏幕上可见
可能重复:
jQuery – 检查滚动后元素是否可见
我试图确定一个元素是否在屏幕上可见。 为了这个,我试图find元素的垂直位置使用offsetTop,但返回的值是不正确的。 在这种情况下,除非向下滚动,否则元素不可见。 但是,尽pipe如此,当我的屏幕高度是703时,offsetTop返回值为618,所以根据offsetTop元素应该是可见的。
我正在使用的代码如下所示:
function posY(obj) { var curtop = 0; if( obj.offsetParent ) { while(1) { curtop += obj.offsetTop; if( !obj.offsetParent ) { break; } obj = obj.offsetParent; } } else if( obj.y ) { curtop += obj.y; } return curtop; }
先谢谢你!
BenM说,你需要检测视口的高度+滚动位置,以配合你的顶级毒品。 你使用的function是可以的,做这个工作,尽pipe它需要更复杂的function。
如果你不使用jQuery
那么脚本会是这样的:
function posY(elm) { var test = elm, top = 0; while(!!test && test.tagName.toLowerCase() !== "body") { top += test.offsetTop; test = test.offsetParent; } return top; } function viewPortHeight() { var de = document.documentElement; if(!!window.innerWidth) { return window.innerHeight; } else if( de && !isNaN(de.clientHeight) ) { return de.clientHeight; } return 0; } function scrollY() { if( window.pageYOffset ) { return window.pageYOffset; } return Math.max(document.documentElement.scrollTop, document.body.scrollTop); } function checkvisible( elm ) { var vpH = viewPortHeight(), // Viewport Height st = scrollY(), // Scroll Top y = posY(elm); return (y > (vpH + st)); }
使用jQuery更容易:
function checkVisible( elm, evalType ) { evalType = evalType || "visible"; var vpH = $(window).height(), // Viewport Height st = $(window).scrollTop(), // Scroll Top y = $(elm).offset().top, elementHeight = $(elm).height(); if (evalType === "visible") return ((y < (vpH + st)) && (y > (st - elementHeight))); if (evalType === "above") return ((y < (vpH + st))); }
这甚至提供了第二个参数。 使用“可见”(或没有第二个参数),它会严格检查一个元素是否在屏幕上。 如果设置为“高于”,则当问题元素在屏幕上方或上方时,它将返回true。
见行动: http : //jsfiddle.net/RJX5N/2/
我希望这回答了你的问题。
– 改良版 –
这是很短的,应该这样做:
function checkVisible(elm) { var rect = elm.getBoundingClientRect(); var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight); return !(rect.bottom < 0 || rect.top - viewHeight >= 0); }
用小提琴来certificate: http : //jsfiddle.net/t2L274ty/1/
而一个版本的threshold
和mode
包括:
function checkVisible(elm, threshold, mode) { threshold = threshold || 0; mode = mode || 'visible'; var rect = elm.getBoundingClientRect(); var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight); var above = rect.bottom - threshold < 0; var below = rect.top - viewHeight + threshold >= 0; return mode === 'above' ? above : (mode === 'below' ? below : !above && !below); }
并用小提琴来certificate它: http : //jsfiddle.net/t2L274ty/2/
你可以使用jQuery,因为它是跨浏览器兼容?
function isOnScreen(element) { var curPos = element.offset(); var curTop = curPos.top; var screenHeight = $(window).height(); return (curTop > screenHeight) ? false : true; }
然后使用如下的函数调用函数:
if(isOnScreen($('#myDivId'))) { /* Code here... */ };
你想使用scrollTop然后比较元素顶部的位置,然后页。
- 销毁,然后使用相同的variables构造新的对象
- 如何覆盖另一个div的一个div
- window.location.href,window.location.replace和window.location.assign之间的区别
- 在TD中使用位置相对/绝对?
- 我可以使用哪些服务根据IP地址find用户的位置?
- bootstrap popover:高级定位
- LocationRequest setInterval(long millis)和LocationRequest setFastestInterval(long millis)之间的区别
- 检测访客的国家/地点的最佳方法?
- CSS显示:内联块不接受margin-top?