Nun ... Ich habe hier in jeder vorgeschlagenen Lösung einige Probleme gefunden.
- Sie sollten auswählen können, ob das gesamte Element oder nur ein Teil davon auf dem Bildschirm angezeigt werden soll
- Vorgeschlagene Lösungen schlagen fehl, wenn das Element höher / breiter als das Fenster ist und das Browserfenster irgendwie abdeckt .
Hier ist meine Lösung, die jQuery
.fn
Instanzfunktion und enthält expression
. Ich habe mehr Variablen in meiner Funktion erstellt, als ich konnte, aber für komplexe logische Probleme teile ich sie gerne in kleinere, klar benannte Teile.
Ich verwende eine getBoundingClientRect
Methode, die die Elementposition relativ zum Ansichtsfenster zurückgibt, sodass ich mich nicht um die Bildlaufposition kümmern muss
Verwendung :
$(".some-element").filter(":onscreen").doSomething();
$(".some-element").filter(":entireonscreen").doSomething();
$(".some-element").isOnScreen();
$(".some-element").isOnScreen(true);
$(".some-element").is(":onscreen");
$(".some-element").is(":entireonscreen");
Quelle :
$.fn.isOnScreen = function(partial){
var t = $(this).first();
var box = t[0].getBoundingClientRect();
var win = {
h : $(window).height(),
w : $(window).width()
};
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;
var coverScreenHorizontally = box.left <= 0 && box.right >= win.w;
var coverScreenVertically = box.top <= 0 && box.bottom >= win.h;
var topEdgeInScreen = topEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );
var bottomEdgeInScreen = bottomEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );
var leftEdgeInScreen = leftEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );
var rightEdgeInScreen = rightEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );
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);
};