Das werden wir bauen

Der volle Effekt (mit Übergangsanimationen) funktioniert in neueren WebKit- und Opera-Browsern sowie in Firefox 4 (in echter Betaversion ab heute). Jeder andere Browser wird die Blöcke ohne Übergangsanimation rotieren.
Demo ansehen Dateien herunterladen
Der interessante Teil
Die gesamte Animation basiert auf CSS3-Übergängen. JavaScript kümmert sich nur um die Klicks und wendet Klassen nach Bedarf an und entfernt sie wieder. Warum nicht auch JavaScript für die Animationen verwenden und eine breitere Browserunterstützung erhalten? CSS3 ist dafür weitaus besser geeignet. Die Animationen sind besser (Hardware-beschleunigt). Sie verlangsamt kein anderes JavaScript. Es ist auch einfacher zu schreiben, indem man die Animationen in CSS belässt. Mit JavaScript können wir nicht so einfach zu Klassen animieren*.
Mit zunehmender Zeit werden immer mehr Animationen auf CSS und weg von JavaScript-Bibliotheken verlagert.
HTML
Wir geben uns einen semantischen Wrapper, der auch den relativen Positionierungskontext für alle Blöcke bietet. Die Blöcke werden absolut positioniert und letztendlich durch Ändern ihrer Top/Left-Werte animiert, daher ist dieser relative Kontext wichtig. Jeder Block hat einen Div-Wrapper mit einer eindeutigen ID sowie einen Klassennamen, der seinen aktuellen Zustand angibt. Es gibt drei selbsterklärende Zustandsklassen, beginnend mit dem offensichtlichen active, was der Block ist, der sich gerade im vollständig sichtbaren, am weitesten links befindlichen Zustand befindet.
Jeder Block hat eine Unterüberschrift, die nur angezeigt wird, wenn er nicht aktiv ist, und einen weiteren Div-Wrapper, der alles enthält, was angezeigt werden soll, wenn der Block aktiv ist. Die Idee der Unterüberschrift gibt die Möglichkeit, eine Art kurzen Teaser anzubieten und zum Klicken zu verleiten.
<div id="rotator">
<div id="block-1" class="active">
<h2>Subtitle #1</h1>
<div>
<h1>Seven Space Frogs Descend On Canada's Largest City</h1>
<img src="spacefrog.jpg" alt="space frog">
<p>Commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
</div>
</div>
<div id="block-2" class="non-active-top">
<h2>Subtitle #2</h2>
<div>
<h1>The Power of the Voodoo. Who do? You do.</h1>
<img src="goblins.jpg" alt="goblins">
<p>Ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
</div>
</div>
<div id="block-3" class="non-active-bottom">
<h2>Subtitle #3</h2>
<div>
<h1>You May Find Yourself Living in a Shotgun Shack</h1>
<p>Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
</div>
</div>
</div>
CSS
Einrichten des Wrappers und des Kontexts
#rotator { width: 920px; height: 280px; position: relative; background: white; padding: 20px; }
Eindeutiges Styling für jeden der Blöcke kann über die ID erfolgen
#block-1 { background: #d5fcff; }
#block-2 { background: #e1ffd5; }
#block-3 { background: #ffffd8; }
Jeder Block teilt sich einige Eigenschaften, so dass der Überlauf versteckt ist, sie absolut positioniert sind und mit der gleichen Geschwindigkeit animiert werden
#rotator > div {
position: absolute;
overflow: hidden;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
}
Die drei Zustände der Boxen bestimmen ihre Größe und Position
#rotator .active { top: 20px; left: 20px; width: 580px; height: 280px; }
#rotator .non-active-top { top: 20px; left: 620px; height: 130px; width: 320px; }
#rotator .non-active-bottom { top: 170px; left: 620px; height: 130px; width: 320px; }
Die Unterüberschrift (h2) wird genau so groß wie die Box, indem ihre Zeilenhöhe gleich der Höhe der Box gesetzt wird. Dies schiebt alles andere aus dem Weg und versteckt es, da der Überlauf versteckt ist. Wenn die Box dann in ihrem aktiven Zustand ist, verstecken wir die Unterüberschrift und alles andere wird natürlich angezeigt.
#rotator h2 {
text-align: center;
line-height: 130px;
}
#rotator .active h2 {
display: none;
}
jQuery
Wir erstellen eine rotate-Funktion, die die richtigen Klassen den richtigen Blöcken zuweist, je nachdem, was der current-Wert ist. Wahrscheinlich gibt es einen saubereren Weg, dies zu tun, der besser skaliert…
function rotate() {
if (current == 1) {
$("#block-1").removeClass().addClass("active");
$("#block-2").removeClass().addClass("non-active-top");
$("#block-3").removeClass().addClass("non-active-bottom");
} else if (current == 2) {
$("#block-1").removeClass().addClass("non-active-bottom");
$("#block-2").removeClass().addClass("active");
$("#block-3").removeClass().addClass("non-active-top");
} else {
$("#block-1").removeClass().addClass("non-active-top");
$("#block-2").removeClass().addClass("non-active-bottom");
$("#block-3").removeClass().addClass("active");
}
}
Dann hängen wir einen Klick-Handler an jeden der Blöcke. Wenn sie angeklickt werden, ermitteln wir, welcher es ist, anhand seiner ID, setzen den aktuellen Wert auf diesen und rufen die rotate-Funktion auf.
$("#rotator div").click(function() {
current = this.id.substr(6);
rotate();
});
Dank an Andrea Canton für die Idee, zu überprüfen, welcher Block angeklickt wurde, was es den Blöcken ermöglicht, in beide Richtungen zu rotieren, was befriedigender ist.
Alles zusammen jetzt
Sie klicken also auf einen Block, die Klassen dieses Blocks werden angepasst. Die neuen Klassen haben unterschiedliche Größen- und Positionswerte. Da der Block eine CSS-Übergangsanimation hat, werden diese neuen Größen- und Positionswerte animiert. Einfach.
Demo ansehen Dateien herunterladen
*jQuery UI hat die Möglichkeit, zu Klassen zu animieren, indem es jQuerys addClass erweitert. In diesem Szenario ist es jedoch nicht ausreichend, da wir zuerst die vorherige Klasse entfernen müssen (sie an eine Standardposition zurückbewegen), bevor wir die neue hinzufügen, was die Animationen ruckelig und falsch macht.
Großartige Übersicht über eine einfache Technik mit CSS-Animationen. :)
Ich kann es kaum erwarten, bis FF4 zum Standard wird. Mozilla-basierte Browser verpassen diese Dinge wirklich.
Danke Chris!
Firefox Beta 9 enthält viele neue HTML5- und CSS3-Funktionen, die in früheren Versionen fehlten.
http://hacks.mozilla.org/2011/01/firefox-4-beta-9-a-huge-pile-of-awesome/
Tanzen! Tanzen, magischer Tanz!
Gute Arbeit, Chris... :)
Mach weiter... :)
Fantastisch!
Können wir diesen Trick "Do-si-do" nennen?
Microsoft hat auch etwas Ähnliches gemacht
http://www.beautyoftheweb.com/#/highlights/all-around-fast
Okay – Microsoft hat es EPIC gemacht. VERDAMMT!
Danke! Du weißt, wie man etwas lernt und sich verliert? Und dann bekommt man diesen einen Tutorial, bei dem man denkt: "Oh, jetzt verstehe ich es!" Nun, das war dieses Tutorial für mich. Danke, Chris.
Ich konnte nicht aufhören zu klicken!
Woosh! Das ist ein wirklich cooler Effekt! Danke :)
Mögliche Verbesserungen
1. Füge einen Timer hinzu, damit sie sich automatisch wechseln. Sagen wir alle 10 Sekunden.
2. Füge eine Pause beim Überfahren mit der Maus hinzu, um den Timer vorübergehend zu stoppen. Alternativ füge Pausen- und Wiedergabetasten hinzu. Oder beides.
3. Füge eine Bildlaufleiste für lange Inhalte hinzu, damit alles sichtbar ist.
4. Füge etwas hinzu, das dem Benutzer anzeigt, dass er auf eine Unterüberschriften-Box klicken kann, um sie in der Hauptbox anzuzeigen.
Cooler Effekt, aber meiner Meinung nach ein völliges No-Go in Sachen Benutzerfreundlichkeit.
Ich bin neugierig, was das als "totaler Benutzerfreundlichkeits-No-No" einstufen würde.
Ich stimme zu. Es ist nur eine Spielerei.
Ich denke, es ist eine ziemlich coole Idee für rotierende Schlagzeilen; vorgestellte Artikel usw.
In den meisten Browsern (ohne Animation) ist es schwer zu verfolgen, aber das Hinzufügen von Steuerelementen (oder ein JavaScript-Fallback für die Animation) würde das lösen.
Das ist super, aber das Coolste, was ich finde, ist diese substr()-Sache, die du verwendet hast. Ich habe eine Weile nach einer Möglichkeit gesucht, das zu tun, aber es nicht herausgefunden, das ist wirklich nützlich.
LABYRINTH!!!!!!!!!!!!!! Nett.
Sehr cool, Chris =)
Chris, sagst du damit, dass bei gleichen Bedingungen CSS > JavaScript für jede Animation?
Ja.
Zuerst einmal ein toller Artikel :-)
Ich denke immer noch, dass JavaScript besser für Animationen geeignet ist, da es eine echte Programmiersprache ist.
CSS3 wird nur einfache Animationen können. Nichts wie ein 3D-Spiel oder überhaupt irgendein Spiel, das Logik erfordert.
Ziemlich cool! Funktioniert nicht mit deaktiviertem JS, aber wie viele Leute deaktivieren es wirklich? Außerdem ein kleiner Fehler in deinem Beispiel-HTML – <h2> Unterüberschrift #1 </h1>
Wäre es nicht sinnvoller, bei CSS zu bleiben und :target statt Klick-Events zu verwenden?
Hier ein (einfaches) Beispiel, was ich meine: http://jsfiddle.net/wKw9Y/
Das einzige Problem, das ich sehe, ist, dass keine Box standardmäßig "offen" ist.
Funktioniert nicht in IE :(
Liebe es.. Nach diesen Effekten wird Flash offensichtlich untergehen!
Aus irgendeinem Grund zeigt Safari 5.0.3 für Leopard den Text und das Bild von #1 nicht an. Nur die leere blaue Box. Ideen?
Siehe **Piers** Kommentar oben
Toller Effekt.
Ich schaffe es nicht, dass IRGENDETWAS von dem wunderbaren Zeug auf dieser Seite mit Squarespace funktioniert :( :(
Schön, das werde ich sicher verwenden, danke!
Ich weiß nicht, was ich sagen soll…
Ich liebe diese Website, Chris…
Professionelle Webentwickler berücksichtigen Browser, bei denen JavaScript deaktiviert ist. Jeder, der das nicht tut, ist ein Amateur.
Ja, denn die meisten Unternehmen berücksichtigen die Webanalyse und die Zielgruppe nicht.
Vielen Dank, dass Sie mich erwähnt haben, auch wenn ich nur eine kleine Verbesserung vorgenommen habe.
Ich hoffe jedenfalls, dass CSS3 bald auf allen Browsern gut unterstützt wird. Es ist wirklich einfach, solche Tricks zu machen!
Flash wird zu einer Sache der Vergangenheit!
Zuerst war es nur ein cooler Effekt… dann kam das Zitat aus "Labyrinth" und es entwickelte sich plötzlich zu "legendär".
Danke für das Teilen.
Das ist einfach unglaublich. Schade, dass es in Firefox nicht wie beabsichtigt funktioniert, aber zumindest funktioniert es immer noch. Habe es in Safari ausprobiert und es funktioniert einwandfrei. Tolle Sache.
So cool!!! Danke
Danke dafür. Ich teste es gerade und denke darüber nach, es hier zu implementieren: http://familylegacy.com/home-test-page/.
Responsiv bis hinunter zur mobilen CSS-Version.
< http://www.pushinpixels.co.uk/portfolio.html >
Mobile Version ein anderes Mal.
WEITER TANZEN…
Ich würde gerne den kleinen Code-Schnipsel der WordPress-Schleife und die subtilen Änderungen im jQuery sehen, die dies in WP funktionieren lassen würden.
Gibt es talentierte Leute da draußen mit wohlwollendem Charakter?
Oh, das ist lustig! Das hat mir ein paar Ideen für bestehende Projekte gegeben. … Das ist das erste Mal, dass ich deine Seite sehe. Mir gefallen all die Details. Die Icons in den Feldern für Name, E-Mail und Website bei Kommentaren sind sehr cool, ebenso wie der Hintergrund, der im Kommentarbereich animiert. Du hast gerade einen neuen Follower bekommen! :-) Danke.
Schön und einfach…! Das Beste ist, dass es keine Komplikationen gibt. Grundlegende Dinge zusammengefasst…
Gut gemacht
Das macht einfach zu viel Spaß. Wow, es ist Magie. Danke.
Ich würde es lieben, wenn du einen Beitrag darüber machen würdest, wie die Folien nach einer bestimmten Dauer wechseln.
Dann könnte dies heute als Ersatz für die beliebten jQuery-Slider zur Anzeige von Inhalten und Bildern verwendet werden..
Hallo allerseits,
Ich liebe diesen "Trick" absolut und musste damit herumspielen. Hier ist, was ich mir ausgedacht habe
CSS3 Animations Demo
Glaubt jemand, dass ein benutzerdefinierter Layout-Animationseffekt wie auf dieser Seite mit den heutigen HTML/CSS/jQuery-Fähigkeiten möglich wäre?
http://www.hybridworks.jp/
Mann, du hast einen erstaunlichen Sinn für Kreativität, wie der eines Künstlers, mit der Finesse eines guten Webentwicklers!
Das ist großartig und du hast eine so nützliche/benutzerfreundliche Seite. Ich habe die Boxen hier implementiert. http://www.designsourced.com .
Nochmals vielen Dank!
Hallo, danke für dieses Tutorial!
Der Rotator hat hier eine feste Höhe, gibt es in CSS eine Möglichkeit, die Höhe an den Inhalt anzupassen?
Danke nochmal Css-tricks, ich implementiere die Box auf meiner Artikel-Seite.
Rotierende Blöcke
und habe sie so modifiziert, dass sie mit PHP und MySQL funktioniert. Schauen Sie, welche Zeilen ich geändert habe.
hier
Nochmal danke….
Nachdem ich das gesehen hatte, wurde ich inspiriert, meine eigene (meiner Meinung nach coolere) Version zu erstellen. Während ich viel Erfahrung mit CSS-Übergängen habe, war es mit CSS zu kompliziert, da ich mehrere Animationen gleichzeitig auf demselben Element durchführe **und** einige CSS-Eigenschaften sofort ändere. Es ist schwer zu erklären, also müssen Sie es einfach selbst ausprobieren.