Einblenden bei Bildlauf nach unten, Bildlauf bei Bildlauf nach oben - basierend auf der Elementposition im Fenster

8

Ich versuche, eine Reihe von Elementen zum Einblenden zu erhalten, wenn sie im Fenster vollständig sichtbar sind. Wenn ich weiter scrolle, möchte ich nicht, dass sie ausgeblendet werden, aber wenn ich nach oben scrolle, möchte ich, dass sie ausgeblendet werden.

Dies ist das nächste Spiel, das ich gefunden habe. Ссылка

%Vor%

Es macht genau das, was ich möchte, wenn ich nach unten scrolle, aber ich möchte auch, dass die Elemente ausgeblendet werden, wenn ich an ihnen vorbei scrolle.

Ich habe das ohne Glück versucht.

%Vor%

Vielen Dank, dass Sie sich die Zeit genommen haben, sich das anzusehen.

    
minimographite 01.11.2014, 23:32
quelle

4 Antworten

27

Der Grund, warum Ihr Versuch nicht funktioniert hat, ist, dass die beiden Animationen (Ein- und Ausblenden) gegeneinander funktionierten.

Kurz bevor ein Objekt sichtbar wurde, war es immer noch unsichtbar und die Animation zum Ausblenden würde laufen. Dann, den Bruchteil einer Sekunde später, als das gleiche Objekt sichtbar wurde, würde die Einblendungsanimation versuchen, zu laufen, aber die Ausblendung lief noch. Also würden sie gegeneinander arbeiten und du würdest nichts sehen.

Irgendwann würde das Objekt sichtbar werden (die meiste Zeit), aber es würde eine Weile dauern. Und wenn Sie mit der Pfeiltaste auf der Schaltfläche der Bildlaufleiste nach unten blättern würden, würde die Animation funktionieren, weil Sie in größeren Schritten blättern würden und weniger Bildlaufereignisse erstellen würden.

Genug Erklärung, die Lösung (JS, CSS, HTML):

%Vor% %Vor% %Vor%
( Geige: Ссылка )
  • Ich habe die Fade-Codezeile in eine if-Klausel eingeschlossen: if ($(this).css("opacity")==0) {...} . Dadurch wird sichergestellt, dass das Objekt nur eingeblendet wird, wenn opacity 0 ist. Gleiches gilt für das Ausblenden. Und das verhindert, dass Ein- und Ausblenden gegeneinander arbeiten, weil jetzt immer nur eines der beiden gleichzeitig auf einem Objekt läuft.
  • Ich habe .animate() in .fadeTo() geändert. Es ist jQuerys spezielle Funktion für Deckkraft, viel kürzer zum Schreiben und wahrscheinlich leichter als animieren.
  • Ich habe .position() in .offset() geändert. Dies berechnet sich immer relativ zum Körper, während die Position relativ zum Elternteil ist. Für Ihren Fall glaube ich, Offset ist der Weg zu gehen.
  • Ich habe $(window).height() in $(window).innerHeight() geändert. Letzteres ist meiner Erfahrung nach zuverlässiger.
  • Direkt nach dem Scroll-Handler rufe ich diesen Handler einmal beim Laden der Seite mit $(window).scroll(); auf. Jetzt können Sie alle gewünschten Objekte auf der Seite mit der .fade -Klasse versehen, und Objekte, die beim Seitenladen nicht sichtbar sein sollen, werden sofort ausgeblendet.
  • Ich habe #container sowohl von HTML als auch von CSS entfernt, weil (zumindest für diese Antwort) es nicht notwendig ist. (Ich dachte, du brauchst vielleicht height:2000px , weil du .position() anstelle von .offset() benutzt hast, sonst weiß ich es nicht. Fühle dich frei, es in deinem Code zu belassen.)

AKTUALISIEREN

Wenn Sie andere Deckkraftwerte als 0 und 1 verwenden möchten, verwenden Sie den folgenden Code:

%Vor% %Vor% %Vor%
(Geige: Ссылка )
  • Ich habe der if-Klausel einen Schwellenwert hinzugefügt, siehe Erklärung unten.
  • Ich habe am Anfang der Funktion Variablen für threshold und für min/max erstellt. Im Rest der Funktion sind diese Variablen referenziert. Wenn Sie die Werte einmal ändern möchten, müssen Sie dies nur an einer Stelle tun.
  • Ich habe auch || pageLoad zur if-Klausel hinzugefügt. Dies war notwendig, um sicherzustellen, dass alle Objekte beim Laden der Seite in die richtige Deckkraft eingeblendet werden. pageLoad ist ein boolescher Wert, der als Argument gesendet wird, wenn fade() aufgerufen wird.
    Ich musste den Fade-Code in die extra function fade() {...} setzen, um mit dem pageLoad boolean, wenn der scroll-handler aufgerufen wird.
    Ich habe keine andere Möglichkeit gesehen, dies zu tun, wenn das jemand anderes tut, bitte hinterlasse einen Kommentar.

Erläuterung:
Der Grund dafür, dass der Code in deiner Geige nicht funktioniert hat, ist, dass die Opazitätswerte immer gleich sind etwas abseits von dem Wert, auf den Sie es eingestellt haben. Wenn Sie also die Deckkraft auf 0.3 setzen, ist der tatsächliche Wert (in diesem Fall) 0.300000011920929 . Das ist nur einer dieser kleinen Fehler, die Sie auf dem Weg von Trail und Error lernen müssen. Deshalb funktioniert diese if-Klausel nicht: if ($(this).css("opacity") == 0.3) {...} .

Ich habe einen Schwellenwert hinzugefügt, um diesen Unterschied zu berücksichtigen: == 0.3 wird <= 0.31 .
(Ich habe den Schwellenwert auf 0.01 gesetzt, dies kann natürlich geändert werden, genauso wie solange die tatsächliche Deckkraft zwischen dem eingestellten Wert und diesem Schwellenwert liegt.)

Die Operatoren werden jetzt von == in <= und >= geändert.

UPDATE 2:

Wenn Sie die Elemente basierend auf ihrem sichtbaren Prozentsatz ausblenden möchten, verwenden Sie den folgenden Code:

%Vor% %Vor% %Vor%
(Geige: Ссылка )     
myfunkyside 02.11.2014, 08:23
quelle
3

Ich habe Ihren Code ein wenig optimiert und ihn robuster gemacht. Im Hinblick auf die progressive Verbesserung ist es wahrscheinlich besser, die gesamte Einblendlogik in JavaScript zu haben. Im Beispiel von myfunksyde sieht jeder Benutzer ohne JavaScript nichts wegen opacity: 0; .

%Vor%

Siehe hier: Ссылка

Prost, Martin

    
hobbeshunter 18.09.2015 12:27
quelle
3

Ich weiß, es ist spät, aber ich nehme den Originalcode und ändere ein paar Sachen, um das CSS leicht zu steuern. Also habe ich einen Code mit der addClass () und der removeClass ()

erstellt

Hier der vollständige Code: Ссылка

%Vor%     
Michael Deleau 17.02.2016 14:38
quelle
0

Entschuldigung, das ist ein alter Thread, aber einige Leute würden das immer noch brauchen, denke ich,

Hinweis: Ich habe dies mithilfe der Animate.css-Bibliothek zum Animieren der Überblendung erreicht.

Ich habe deinen Code benutzt und einfach die .hidden class hinzugefügt (benutze die versteckte Klasse von bootstrap), aber du kannst einfach nur definieren .hidden { opacity: 0; }

%Vor%

Noch ein Hinweis: Wenn Sie dies auf Container anwenden, kann dies zu Störungen führen.

    
Valumin 04.10.2017 08:10
quelle

Tags und Links