Die meisten Antworten hier berücksichtigen nicht, dass ein Element auch ausgeblendet werden kann, weil es aus der Sicht eines Divs gescrollt wird, nicht nur aus der Sicht der gesamten Seite.
Um diese Möglichkeit abzudecken, müssen Sie grundsätzlich prüfen, ob das Element innerhalb der Grenzen jedes seiner Elternteile positioniert ist.
Diese Lösung tut genau das:
function(element, percentX, percentY){
var tolerance = 0.01; //needed because the rects returned by getBoundingClientRect provide the position up to 10 decimals
if(percentX == null){
percentX = 100;
}
if(percentY == null){
percentY = 100;
}
var elementRect = element.getBoundingClientRect();
var parentRects = [];
while(element.parentElement != null){
parentRects.push(element.parentElement.getBoundingClientRect());
element = element.parentElement;
}
var visibleInAllParents = parentRects.every(function(parentRect){
var visiblePixelX = Math.min(elementRect.right, parentRect.right) - Math.max(elementRect.left, parentRect.left);
var visiblePixelY = Math.min(elementRect.bottom, parentRect.bottom) - Math.max(elementRect.top, parentRect.top);
var visiblePercentageX = visiblePixelX / elementRect.width * 100;
var visiblePercentageY = visiblePixelY / elementRect.height * 100;
return visiblePercentageX + tolerance > percentX && visiblePercentageY + tolerance > percentY;
});
return visibleInAllParents;
};
Außerdem können Sie angeben, wie viel Prozent des Bildes in jeder Richtung sichtbar sein müssen.
Sie deckt nicht die Möglichkeit ab, dass sie aufgrund anderer Faktoren verborgen ist, wie z. B. display: hidden
.
Dies sollte in allen gängigen Browsern funktionieren, da es nur getBoundingClientRect
. Ich habe es persönlich in Chrome und Internet Explorer 11 getestet.
0 Stimmen
Ich verstehe das Problem nicht wirklich. Könnten Sie versuchen, mehr Informationen hinzuzufügen?
61 Stimmen
Bedeutet, dass er eine Methode haben möchte, um zu wissen, ob ein bestimmtes Element im Browserfenster angezeigt wird oder ob der Benutzer scrollen muss, um es zu sehen.
1 Stimmen
Um zu prüfen, ob ein Element in einem Container vollständig sichtbar ist, fügen Sie einfach einen zusätzlichen Selektor-Parameter hinzu und verwenden Sie den Code von elem dafür wieder.
Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();
0 Stimmen
Was ist diese "Bibliothek", @Lindsay?
4 Stimmen
Mögliche Duplikate von Wie kann man feststellen, ob ein DOM-Element im aktuellen Viewport sichtbar ist?
0 Stimmen
Die Bibliothek ist nur eine Funktion, die ich erstellt habe. Z.B..
function Library() { }
. Ich schreibe mein Javascript auf diese Weise, weil ich es einfacher zu lesen / pflegen gegenüber nur mit einer Funktion (z. B. IsElementVisibleInContainer) und haben keine Ahnung, woher es kam.0 Stimmen
Schnittpunkt Beobachter wird die Antwort sein... aber noch nicht ganz, es sei denn, Sie verwenden ein Polyfill für Safari und IE. Observer ist eine neue Version von Event. Dies wird einen Rückruf auslösen, wenn nn% des Elements sichtbar ist. Siehe developer.mozilla.org/de-US/docs/Web/API/
1 Stimmen
Mögliches Duplikat von Wie kann man feststellen, ob ein DOM-Element im aktuellen Ansichtsfenster sichtbar ist?
4 Stimmen
Alle Antworten lösen Reflow aus, es könnte also ein Flaschenhals sein. IntersectionObserver falls unterstützt. Auf modernen Browsern wird die Leistung besser sein,
0 Stimmen
Eine fertige, nicht-perfekte Lösung ist hier: github.com/proxy-m/real-visibility
0 Stimmen
Verwenden Sie die Schnittpunkt-Beobachter-API, um zu erkennen, ob sich ein Element im Ansichtsfenster befindet, Details hier - frontendguruji.com/blog/