jQuery: fade in/out + animieren der Elemente
Ich bin mit jQuery, fade in/out-Elemente und ändern der Deckkraft von den anderen.
$(function(){
$('.image').each(function() {
$(this).hover(
function() {
$(this).stop().animate({ opacity: 0.3 }, 'slow');
$(this).siblings().fadeIn('slow');
},
function() {
$(this).stop().animate({ opacity: 1 }, 'slow');
$(this).siblings().fadeOut('slow');
})
});
});
Sehen Sie den vollständigen code in http://projects.klavina.com/stackoverflow/01/ (ich bin auch mit dem jQuery Masonry plugin auf der Seite).
Ich bin ziemlich neu in JS/jQuery und der obige code funktioniert nicht gut, es sei denn, ich mousover .Bild-element wirklich langsam. Wenn ich mich bewege, über die Elemente schneller, die Bildunterschriften, die über die Bilder-show, auch wenn ich bereits umgestellt, ein weiteres element. Wie kann ich Sie entfernen? I. e. die Beschriftungen sollten für fade-in, nur wenn ich da noch schweben, das Besondere element.
Ersten Bild auf der Beispiel-Website hat eine "z-index: 100;" für die Beschriftung, so kann ich das text-overlay mit voller Deckkraft. Im Idealfall möchte ich haben "z-index: 100;" für alle die Bildunterschriften, aber das macht das schweben funktioniert noch schlimmer.
Plus, die verblassen in/out sieht verzerrt aus im IE. Wie kann ich das beheben? Ich habe die Deckkraft zu ändern auf einer anderen Seite, und fixiert den IE-bug, durch hinzufügen von einen weißen hintergrund, um das element, aber ich kann das nicht, hier (ich habe ein Foto unterhalb).
Danke!
Isotop ist Kühler. Isotop.metafizzy.co
InformationsquelleAutor klavina | 2011-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Kern-Ursache des Problems ist, müssen Sie einen Anruf zu
.siblings().stop()
, zusätzlich der$(this).stop()
(die Sie schon haben).Nachdem Sie beheben, sehen Sie eine neue Ausgabe, wo Sie Ihre Beschriftungen zunächst ordnungsgemäß funktionieren, aber dann beginnen zu verblassen, nur teilweise, wenn Sie schon seit moused über immer wieder (und eines Tages werden Sie vollständig verschwinden, bis Sie die Seite neu laden). Dies ist aufgrund der Art und Weise
.fadeIn()
funktioniert in Kombination mit.fadeOut()
--fadeIn()
muss nicht immer fade-inopacity:1
-- statt, es wird-in was auch immer "Deckkraft" angewendet wurde, zu der ZeitfadeOut()
hieß zuvor.Um dies zu umgehen, können Sie
animate({opacity:1},'slow')
stattfadeIn('slow')
-- oder man kann das präziser (und klarer).fadeTo('slow',1)
(docs). (beachten Sie, dass die Reihenfolge der parameter ist bei den verschiedenen fadeTo, als im Vergleich zu den anderen Animations-Funktionen - die Dauer kommt zuerst, dann der Wert, den Sie möchten, zu verblassen).Natürlich könnte man auch verwenden
fadeTo()
statt Ihrer andere Deckkraft-animation-obwohl, es ist sicherlich nichts falsch mit der Verwendunganimate()
als Sie gezeigt haben -- die beiden sind gleichwertig. (natürlich würden Sie brauchen, um seanimate()
wenn Sie wollen zu manipulieren, um mehrere css-Eigenschaften gleichzeitig.)Wenn es kommt alles zusammen, es könnte in etwa so Aussehen:
Sehen Sie diesen code in Aktion an jsFiddle: http://jsfiddle.net/coltrane/XstpE/
(Anmerkung: das Beispiel ist abhängig von der gehosteten Ressourcen, die mit der original-Beitrag über, so wird es nicht funktionieren, wenn diese verschoben oder sonst nicht verfügbar).
Beachten Sie auch: Im obigen Beispiel habe ich den Einsatz von
.each()
wie Sie es in Ihrer ursprünglichen Beispiel, aber ich möchte darauf hinweisen, dass es wirklich nicht notwendig.Dem folgenden äquivalent ist (und würde in der Regel als "besser" jQuery-Technik):
Wenn Sie einen event-handler, um eine multi-element-set, jQuery automatisch bindet den selben handler auf jedes element in der Menge. (Ich habe aktualisiert mein Beispiel auf jsFiddle (oben verlinkten), um den code ohne die
each()
).Bearbeiten
Den OP darauf hin, dass schwebt über der Beschriftung (die sitzt oben auf dem Bild) bewirkt, dass die
mouseleave
handler auslösen, wodurch die roll-out-Aktion, die ausgeführt wird. Das gewünschte Verhalten ist, um die Beschriftung nicht auslösen der rollout.Dieses Problem tritt auf, weil der Beschriftung "Schatten" des Bildes, des
hover()
auf das Bild angewendet wird. Wenn der Mauszeiger über die Beschriftung nicht mehr auf dem Bild (es ist auf der Beschriftung), damit der browser feuert ein mouseleave auf dem Bild. Die gleiche situation kann Anlass für alle Arten von subtilen Problemen zu-vor allem, wie Sie komplexer Inhalte.Um dieses Problem zu lösen, empfehle ich, dass Sie sich einfach
hover()
eine Ebene nach oben (auf den container, die Bild und die Beschriftung), anstelle der Anwendung auf das Bild direkt. In diesem Fall, dass die container$('.entry')
. Der code ändern würde, wie diese:hier ist eine neue version der jsFiddle
Das geschieht, weil Ihr
hover()
- handler ist auf dem Bild-nicht auf die Beschriftung: wenn Sie die Maus über die Beschriftung, DH Prozesse, die dies als "verlassen" in das Bild. Die anderen Browser das gleiche tun, wenn Sie geben Sie Ihre Beschriftung ein eine oder mehrere der folgenden Positionierung-bezogene css-Attribute. Es gibt auch andere subtile Dinge, die Sie zuschneiden können, als ein Ergebnis von diesem zu -- auch Webkit & FF. Die beste Lösung (meiner Meinung nach), um Ihrehover()
- handler auf$('.entry')
statt$('.image')
. siehe aktualisierte jsFiddle hier.InformationsquelleAutor Lee
Nicht sicher, wie lange 'langsam' Parameter bedeutet in Ihren Funktionen animieren. Versuchen tweaking, zu 'schnell' oder ein numerischer Wert in Millisekunden und sehen, ob das helfen würde.
Stoppen animation auf ein element, wenn die Maus es verlässt:
Wenn Sie möchten, um zu versuchen zu stoppen die animation auf ein element, wenn die Maus es verlässt, siehe edit zu meiner Antwort.
InformationsquelleAutor Ke Sun
Versuchen Sie es mit mouseenter() und mouseleave() anstelle von hover().
hover()
bindetmouseenter
undmouseleave
(docs). Verbindlich, diese Ereignisse direkt sollte keinen Unterschied machen, überhaupt.InformationsquelleAutor Jesse E. Stark