
Hallo, ich bin Liam Goodacre, und Chris hat mich gebeten, ein kurzes jQuery-Tutorial darüber zu schreiben, wie man Fading-Hover-Effekte erzielt. Ich werde zeigen, wie man Farb- und Bildverschmelzungen durchführt. Wir werden jQuery und das jQuery Colour Plugin verwenden.
Als ich das erste Mal so etwas geschrieben habe, habe ich ein Hintergrund-Div so eingestellt, dass es beim Hovern mit der Maus einblendet und beim Verlassen der Maus ausblendet. Ich stellte fest, dass, wenn ich meine Maus schnell über den Link bewegte und wieder weg, der Hintergrund genauso oft aufblitzte, wie ich die Maus bewegt hatte. Dann habe ich der Animation befohlen, anzuhalten, bevor ich neue Animationen einstelle. Das löste das Problem, führte aber ein neues ein.
Das neue Problem: Wenn ich denselben Test durchführte (wiederholtes Hovern mit der Maus), sahen die Maus-Aus-Zustände des Links langsam genauso aus wie der Hover-Zustand, daher hörte der Hintergrund nach ein paar Malen auf, auszublenden. Ich bemerkte, dass Chris dasselbe Problem auf seiner Website hatte.
Dann hatte ich eine Idee: Beim Hovern mit der Maus, wenn ich die aktuelle Animation stoppe und den Hintergrund unsichtbar setze, bevor ich ihn einblende, anstatt ihn aus seinem aktuellen Zustand heraus einblenden zu lassen. Das scheint das Problem gelöst zu haben.
Beispiel ansehen Dateien herunterladen
Ok dann, fangen wir an…
Was wir brauchen, ist ein Div, das zwei Dinge enthält: ein Anker-Element und ein weiteres Div, das ich als subDiv bezeichnen werde. Das subDiv zeigt das Bild an, das beim Hovern mit der Maus eingeblendet wird. Der Anker überlagert das subDiv und hat einen transparenten Hintergrund.
Das HTML
Wir werden das subDiv mit jQuery dynamisch zum Div hinzufügen, um die Menge an HTML, die wir schreiben müssen, zu reduzieren. Das ist hilfreich, wenn man mehrere solcher Links hat.
Das ist bisher unser HTML-Code…
<div class="hoverBtn">
<a href="https://css-tricks.de/">Go to CSS-Tricks</a>
</div>
Wir haben ein Div mit der Klasse hoverBtn, das einen Link zu CSS-Tricks enthält.
Das CSS
div.hoverBtn {
position: relative;
width: 100px;
height: 30px;
background: #000 url(your_background_image.png) repeat-x 0 0 scroll;
}
div.hoverBtn a {
position: relative;
z-index: 2;
display: block;
width: 100px;
height: 30px;
line-height: 30px;
text-align: center;
color: #000;
background: transparent none repeat-x 0 0 scroll;
}
div.hoverBtn div {
display: none;
position: relative;
z-index: 1;
width: 100px;
height: 30px;
margin-top: -30px;
background: #FFF url(your_hover_image.png) none repeat-x 0 0 scroll;
}
Das subDiv ist nun unter dem Anker positioniert, und ich habe Hintergrundgrafiken auf das Div und das subDiv angewendet.
Das JavaScript
Ich gehe davon aus, dass Sie ein grundlegendes Verständnis der Verwendung von jQuery haben, obwohl der Code auch dann ziemlich selbsterklärend ist, wenn Sie es nicht haben.
Hier ist unser Ausgangspunkt…
//when the dom has loaded
$(function(){
});
Ich bin sicher, die meisten von Ihnen sind sich vollkommen bewusst, dass jeglicher Code, der zwischen diesen beiden Zeilen geschrieben wird, ausgeführt wird, sobald das DOM fertig geladen ist.
Jetzt müssen wir das subDiv hinzufügen. Das können wir mit der `append`-Methode von jQuery-Objekten erreichen.
//when the dom has loaded
$(function(){
//display the hover div
$("div.hoverBtn").show("fast", function() {
//append the background div
$(this).append("<div></div>");
});
});
Ich habe `append` innerhalb des Callbacks der `show`-Methode eingepackt, damit wir `this` verwenden können, um jedes `div.hoverBtn`-Element zu referenzieren.
Jetzt müssen wir das Hover-Ereignis des Links programmieren. Wir werden die Schriftfarbe ausblenden, daher sollten wir eine Hover-Farbe angeben. Wir können auch das `rel`-Attribut verwenden, um die ursprüngliche Farbe jedes Ankers zu speichern. Das ist nützlich für unterschiedlich gefärbte Links.
var hoverColour = "#FFF";
//when the dom has loaded
$(function(){
//display the hover div
$("div.hoverBtn").show("fast", function() {
//append the background div
$(this).append("<div></div>");
//on link hover
$(this).children("a").hover(function(){
//store initial link colour
if ($(this).attr("rel") == "") {
$(this).attr("rel", $(this).css("color"));
}
//fade in the background
$(this).parent().children("div")
.stop()
.css({"display": "none", "opacity": "1"})
.fadeIn("fast");
//fade the colour
$(this) .stop()
.css({"color": $(this).attr("rel")})
.animate({"color": hoverColour}, 350);
},function(){
//fade out the background
$(this).parent().children("div")
.stop()
.fadeOut("slow");
//fade the colour
$(this) .stop()
.animate({"color": $(this).attr("rel")}, 250);
});
});
});
Im Grunde passiert also Folgendes:
- Eine Hover-Farbe wird deklariert
- Sobald das DOM geladen ist…
- Ein subDiv wird an das hoverBtn-Div angehängt
- Beim Hover-Ereignis des Links
Die ursprüngliche Farbe wird im rel-Attribut des Links gespeichert
Die Animation des subDiv wird gestoppt
Es wird ausgeblendet und dann so eingestellt, dass es eingeblendet wird
Die Animation des Links wird gestoppt
Seine Farbe wird zurückgesetzt und so eingestellt, dass sie zur Hover-Farbe übergeht - Beim Callback des Hover-Ereignisses
Die Animation des subDiv wird gestoppt
Es wird dann so eingestellt, dass es ausblendet
Die Animation des Links wird gestoppt
Es wird dann so eingestellt, dass es zu seiner ursprünglichen Farbe übergeht
Weitere Entwicklungen
Sie könnten versuchen, dies zu verbessern, indem Sie das enthaltende Div dynamisch laden. Das könnte auch beinhalten, die Größe des enthaltenden Divs an die des Anker-Elements anzupassen.
Liam, sieht für mich wirklich gut aus, ich versuche mich mehr mit jQuery zu beschäftigen, es scheint ein guter Weg zu sein, andere Bibliotheken zu ersetzen. Ich werde das vielleicht auf meinem Blog implementieren oder damit experimentieren, wie du gesagt hast.
Ich liebe das Tutorial. Danke Chris und Liam! Nur zum Teilen, ich dachte, ich teile ein ähnliches Tutorial, das zusätzliche Funktionalität hat – es ermöglicht einen CSS-Sprite-Fallback, falls der Endbenutzer kein JS aktiviert hat (wer würde so etwas tun?). Dave Shea hat über diese Idee auf A List Apart geschrieben – Schauen Sie es sich selbst an!
Ich habe viele Tutorials online gefunden, dieses ist das einfachste und beste zu befolgen. Danke Chris und Liam!
Wenn die Links im Menü diesen schönen Fading-Effekt haben, warum fehlt dann dem Suchbutton in der Seitenleiste der Fader? Ich denke, das neue Design würde sich besser anfühlen ohne solche kleinen Inkonsistenzen.
Sehr schönes Tutorial. Leicht zu befolgen und das Endergebnis ist den Aufwand wert. Jetzt muss ich herausfinden, wie ich das in mein WordPress-Blog implementiere...irgendwelche Hinweise?
Beim Betrachten der Demo-Datei bleibt der erste Link im Hover-Zustand beim ersten Überfahren mit der Maus bei mir weiß. Nach dem ersten Mal verschwindet es. Seltsam. Ich weiß nicht, ob bei mir etwas seltsam ist oder nicht (XP/FF3). Danke für den Beitrag!
@Jesse
Ich sehe dasselbe Problem. Ich bin auf Mac und benutze FF3. Unter Safari sehe ich die weiße Farbe nicht.
Toller Artikel Liam. Die einzige Frage, die ich habe, ist, warum Sie das "rel"-Attribut zum Speichern der Farbe verwendet haben? Ihr Markup ist wunderschön semantisch, abgesehen davon. Warum nicht die jQuery Data-Funktion verwenden, wie hier:
// speichern
$(this).data('color', $(this).css('color'));
// abrufen
$(this).css('color', $(this).data('color'));
Vielen Dank für all eure Kommentare!
@Gaber
Entschuldigung, ich habe derzeit keine Erfahrung mit WordPress, aber das werde ich bald haben, also melde ich mich vielleicht bei Ihnen.
@jesse & @Benjamin
Ich habe das gerade auch bemerkt, es passiert nur im Online-Beispiel, es zeigt keinen weißen Block, wenn ich lokal von meinem Desktop aus ausführe... seltsam, ich werde untersuchen, warum das passiert.
@brad dunbar
Ah, sehr interessant, ich habe das rel-Attribut verwendet, da dies das war, was Chris verwendet hatte, also habe ich die Methode einfach übernommen. Ich hatte noch nie von der jQuery Data-Methode gehört, ich werde diese in Zukunft verwenden, danke. Ich werde Chris vielleicht auch informieren, damit er das Tutorial ändert, damit andere davon profitieren können.
–Liam
Vielen Dank, ich hoffe, Sie machen ein Tutorial über die Tabs in Ihrer Seitenleiste, die die beliebtesten und hervorgehobenen Beiträge enthalten, ich mag sie sehr und ich kann nicht herausfinden, wie Sie sie gemacht haben.
Tolles Tutorial, danke vielmals, ich bekomme ein besseres Verständnis der jQuery-Bibliothek.
Brillant, ich habe das letzte Woche in meiner Website-Navigation eingesetzt. Definitiv die Zukunft.
@oshouip, ich bin mir nicht sicher, ob Chris das so implementiert hat, aber versuchen Sie, sich die scrollTo und localScroll Plugins für jQuery anzusehen
Hallo Leute! Dieses neue Menü sieht wirklich großartig aus. Ich habe eine allgemeine Frage zu jQuery. Mir ist aufgefallen, dass beim Öffnen meiner Websites in IE immer einige Alert-Popups für die Verwendung von jQuery angezeigt werden. Warum passiert das? Und warum passiert es bei Ihnen nicht! Danke!
Danke Chris und Liam, sehr interessant. Ich werde das später definitiv ausprobieren. @oshouip, Chris hat ein Tutorial auf NETTUTS über diese Seitenleiste gemacht. Klick
Hier, um den Artikel zu lesen. Ich hoffe, das hilft.
@Gaber Für WordPress sollten Sie jQuery von deren eigener Bibliothek mit der speziellen WordPress-Funktion einbinden. Dann sollten Sie in WordPress in JavaScript `jQuery` anstelle von `$` verwenden. Schauen Sie sich dieses Tutorial an.
Danke für dieses wunderbare jQuery-Menü. Ich habe es heruntergeladen und werde es in meinen neuen Projekten verwenden. :)
Gutes Menü. Aber schade, dass es in jQuery statt in Prototype oder MooTools ist.
Es erinnert mich an diese abscheulichen Frontpage-Style-Java-betriebenen Buttons.
Es ist definitiv nicht die Zukunft…
Schönes Menü, ich bin mir nicht sicher, ob ich es verwenden würde, aber trotzdem schön.
Mann, danke für ein so erklärendes Tutorial mit der Anmerkung, dass es Liam so hilft!!!
Bitte weiterhin jQuery…
Hallo nochmal Leute. Ich habe Matthews Vorschlag ziemlich gut zum Laufen gebracht (danke Matthew), aber mein Wissen lässt mich wieder etwas im Stich. Im ursprünglichen Zustand meines
gibt es keinen Hintergrund. Ich möchte, dass es zu einer Farbe überblendet und dann beim Verlassen der Maus zurück zu nichts, nicht zu einer anderen Farbe. Hat jemand Vorschläge, wie das erreicht werden könnte?
Kann jemand eine würdevolle Degradation ohne JS erstellen?
@kidvector,
ich denke, Sie möchten in diesem Fall nur die Opazitätseigenschaft animieren.
Danke Mann, schöner Artikel.
Hallo
Ich versuche, Ihr JS mit einem Akkordeonmenü-JS zu verwenden, aber ich bekomme es nicht zum Laufen. Der Hover-Effekt funktioniert, aber das Akkordeonmenü öffnet sich nicht.
Ich habe mehrere Dinge versucht, aber ohne Erfolg. Wenn Sie mich in die richtige Richtung weisen könnten, wäre das sehr willkommen.
Ich bekomme es auch nicht zum Laufen
Tolles Werkzeug, aber es scheint nicht jedes Mal vollständig zu laden, wenn Sie eine Seite besuchen. Manchmal wird nur die obere Hälfte der Hintergrundzeit geladen. Haben Sie Ideen, wie man es schneller und vollständig laden lassen kann?