如果 DIV 元素没有脱离屏幕,我需要检查 jQuery。这些元素是可见的,并根据 CSS 属性显示,但可以通过以下方式有意地将它们放置在屏幕外:
position: absolute;
left: -1000px;
top: -1000px;
我无法使用 jQuery:visible
选择器,因为该元素的高度和宽度不为零。
我没有做任何花哨的事情。这种绝对位置放置是我的Ajax框架实现某些小部件隐藏/显示的方式。
如果 DIV 元素没有脱离屏幕,我需要检查 jQuery。这些元素是可见的,并根据 CSS 属性显示,但可以通过以下方式有意地将它们放置在屏幕外:
position: absolute;
left: -1000px;
top: -1000px;
我无法使用 jQuery:visible
选择器,因为该元素的高度和宽度不为零。
我没有做任何花哨的事情。这种绝对位置放置是我的Ajax框架实现某些小部件隐藏/显示的方式。
取决于您对“屏幕外”的定义。是在视口内,还是在页面的定义边界内?
使用Element.getBoundingClientRect()您可以轻松检测您的元素是否在视口的边界内(即屏幕上或屏幕外):
jQuery.expr.filters.offscreen = function(el) {
var rect = el.getBoundingClientRect();
return (
(rect.x + rect.width) < 0
|| (rect.y + rect.height) < 0
|| (rect.x > window.innerWidth || rect.y > window.innerHeight)
);
};
然后,您可以通过多种方式使用它:
// returns all elements that are offscreen
$(':offscreen');
// boolean returned if element is offscreen
$('div').is(':offscreen');
这里有一个jQuery 插件,它允许用户测试元素是否落在浏览器的可见视口内,同时考虑浏览器的滚动位置。
$('#element').visible();
您还可以检查部分可见性:
$('#element').visible( true);
一个缺点是它只适用于垂直定位/滚动,尽管在混合中添加水平定位应该很容易。
不需要插件来检查是否在视口之外。
var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
var d = $(document).scrollTop();
$.each($("div"),function(){
p = $(this).position();
//vertical
if (p.top > h + d || p.top > h - d){
console.log($(this))
}
//horizontal
if (p.left < 0 - $(this).width() || p.left > w){
console.log($(this))
}
});
嗯...我在这里的每个提议的解决方案中都发现了一些问题。
这是我的解决方案,其中包括jQuery
.fn
实例函数和expression
. 我在我的函数中创建了比我所能创建的更多的变量,但是对于复杂的逻辑问题,我喜欢将它分成更小的、明确命名的部分。
我正在使用getBoundingClientRect
相对于视口返回元素位置的方法,所以我不需要关心滚动位置
用途:
$(".some-element").filter(":onscreen").doSomething();
$(".some-element").filter(":entireonscreen").doSomething();
$(".some-element").isOnScreen(); // true / false
$(".some-element").isOnScreen(true); // true / false (partially on screen)
$(".some-element").is(":onscreen"); // true / false (partially on screen)
$(".some-element").is(":entireonscreen"); // true / false
来源:
$.fn.isOnScreen = function(partial){
//let's be sure we're checking only one element (in case function is called on set)
var t = $(this).first();
//we're using getBoundingClientRect to get position of element relative to viewport
//so we dont need to care about scroll position
var box = t[0].getBoundingClientRect();
//let's save window size
var win = {
h : $(window).height(),
w : $(window).width()
};
//now we check against edges of element
//firstly we check one axis
//for example we check if left edge of element is between left and right edge of scree (still might be above/below)
var topEdgeInRange = box.top >= 0 && box.top <= win.h;
var bottomEdgeInRange = box.bottom >= 0 && box.bottom <= win.h;
var leftEdgeInRange = box.left >= 0 && box.left <= win.w;
var rightEdgeInRange = box.right >= 0 && box.right <= win.w;
//here we check if element is bigger then window and 'covers' the screen in given axis
var coverScreenHorizontally = box.left <= 0 && box.right >= win.w;
var coverScreenVertically = box.top <= 0 && box.bottom >= win.h;
//now we check 2nd axis
var topEdgeInScreen = topEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );
var bottomEdgeInScreen = bottomEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );
var leftEdgeInScreen = leftEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );
var rightEdgeInScreen = rightEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );
//now knowing presence of each edge on screen, we check if element is partially or entirely present on screen
var isPartiallyOnScreen = topEdgeInScreen || bottomEdgeInScreen || leftEdgeInScreen || rightEdgeInScreen;
var isEntirelyOnScreen = topEdgeInScreen && bottomEdgeInScreen && leftEdgeInScreen && rightEdgeInScreen;
return partial ? isPartiallyOnScreen : isEntirelyOnScreen;
};
$.expr.filters.onscreen = function(elem) {
return $(elem).isOnScreen(true);
};
$.expr.filters.entireonscreen = function(elem) {
return $(elem).isOnScreen(true);
};
我知道这有点晚了,但这个插件应该可以工作。http://remysharp.com/2009/01/26/element-in-view-event-plugin/
$('p.inview').bind('inview', function (event, visible) {
if (visible) {
$(this).text('You can see me!');
} else {
$(this).text('Hidden again');
}