अच्छा ... मुझे यहां हर प्रस्तावित समाधान में कुछ समस्याएं मिली हैं।
- यदि आप पूरे तत्व स्क्रीन या बस के किसी भाग पर होना चाहते हैं का चयन करने के लिए सक्षम होना चाहिए
- प्रस्तावित समाधान विफल रहता है तत्व उच्च/खिड़की की तुलना में व्यापक है और थोड़े ब्राउज़र विंडो शामिल है।
यहां मेरा समाधान है जिसमें jQuery
.fn
इंस्टेंस फ़ंक्शन और expression
शामिल हैं। मैंने अपने काम के अंदर और अधिक चर बनाया है, लेकिन जटिल तार्किक समस्या के लिए मैं इसे छोटे, स्पष्ट रूप से नामित टुकड़ों में विभाजित करना चाहता हूं।
मैं getBoundingClientRect
विधि है कि व्यूपोर्ट अपेक्षाकृत तत्व स्थिति रिटर्न उपयोग कर रहा हूँ तो मैं स्क्रॉल स्थिति
useage के बारे में परवाह करने की जरूरत नहीं:
$(".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://stackoverflow.com/ प्रश्न/5353934/चेक-अगर-तत्व-दृश्य-ऑन-स्क्रीन/5354536 # 5354536 – Tokimon