Ich lade Elemente über AJAX. Einige von ihnen sind nur sichtbar, wenn Sie die Seite nach unten scrollen. Gibt es eine Möglichkeit, wie ich wissen kann, ob ein Element jetzt im sichtbaren Teil der Seite ist?
Antworten
Zu viele Anzeigen?Dabei werden alle Auffüllungen, Umrandungen oder Ränder des Elements sowie Elemente, die größer sind als das Ansichtsfenster selbst, berücksichtigt.
function inViewport($ele) {
var lBound = $(window).scrollTop(),
uBound = lBound + $(window).height(),
top = $ele.offset().top,
bottom = top + $ele.outerHeight(true);
return (top > lBound && top < uBound)
|| (bottom > lBound && bottom < uBound)
|| (lBound >= top && lBound <= bottom)
|| (uBound >= top && uBound <= bottom);
}
Verwenden Sie dazu etwas in der Art:
var $myElement = $('#my-element'),
canUserSeeIt = inViewport($myElement);
console.log(canUserSeeIt); // true, if element is visible; false otherwise
Es gibt eine Plugin für jQuery namens siehe die ein neues Ereignis "inview" hinzufügt.
Hier ist etwas Code für ein jQuery-Plugin, das keine Ereignisse verwendet:
$.extend($.expr[':'],{
inView: function(a) {
var st = (document.documentElement.scrollTop || document.body.scrollTop),
ot = $(a).offset().top,
wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();
return ot > st && ($(a).height() + ot) < (st + wh);
}
});
(function( $ ) {
$.fn.inView = function() {
var st = (document.documentElement.scrollTop || document.body.scrollTop),
ot = $(this).offset().top,
wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();
return ot > st && ($(this).height() + ot) < (st + wh);
};
})( jQuery );
Dies habe ich in einem Kommentar hier gefunden ( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ ) von einem Kerl namens James
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop(),
docViewBottom = docViewTop + $(window).height(),
elemTop = $(elem).offset().top,
elemBottom = elemTop + $(elem).height();
//Is more than half of the element visible
return ((elemTop + ((elemBottom - elemTop)/2)) >= docViewTop && ((elemTop + ((elemBottom - elemTop)/2)) <= docViewBottom));
}
Aufbauend auf diese großartige Antwort können Sie es mit ES2015+ noch ein wenig weiter vereinfachen:
function isScrolledIntoView(el) {
const { top, bottom } = el.getBoundingClientRect()
return top >= 0 && bottom <= window.innerHeight
}
Wenn Sie sich nicht darum kümmern, dass der obere Teil aus dem Fenster fliegt, sondern nur, dass der untere Teil gesehen wurde, kann dies vereinfacht werden zu
function isSeen(el) {
return el.getBoundingClientRect().bottom <= window.innerHeight
}
oder auch der Einzeiler
const isSeen = el => el.getBoundingClientRect().bottom <= window.innerHeight
Der Javascript-Code könnte wie folgt geschrieben werden:
window.addEventListener('scroll', function() {
var element = document.querySelector('#main-container');
var position = element.getBoundingClientRect();
// checking whether fully visible
if(position.top >= 0 && position.bottom <= window.innerHeight) {
console.log('Element is fully visible in screen');
}
// checking for partial visibility
if(position.top < window.innerHeight && position.bottom >= 0) {
console.log('Element is partially visible in screen');
}
});
und in react js geschrieben als:
componentDidMount() {
window.addEventListener('scroll', this.isScrolledIntoView);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.isScrolledIntoView);
}
isScrolledIntoView() {
var element = document.querySelector('.element');
var position = element.getBoundingClientRect();
// checking whether fully visible
if (position.top >= 0 && position.bottom <= window.innerHeight) {
console.log('Element is fully visible in screen');
}
// checking for partial visibility
if (position.top < window.innerHeight && position.bottom >= 0) {
console.log('Element is partially visible in screen');
}
}
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/