CSS-Animationen (und ein kleiner JavaScript-Trick) können uns ermöglichen, Seitenübergänge hinzuzufügen und uns vom harten Schnitt von Seitenaufrufen zu lösen. Mein jQuery-Plugin smoothState.js hilft dabei, diese Übergänge zu verfeinern und die Reaktionszeiten der Benutzeroberfläche zu verbessern.
Seitenübergänge verbessern die Benutzererfahrung
Stellen Sie sich für einen Moment vor, wie desorientierend es wäre, wenn Sie beim Berühren eines Türklinken zum anderen Ende der Tür teleportiert würden. Das Navigieren im Web fühlt sich an, als würde man eine teleportierende Türklinke benutzen. Layouts ändern sich, Elemente verschieben oder verschwinden, und es braucht Zeit für den Benutzer, sich anzupassen. Sanfte Übergänge reduzieren den Aufwand, den Benutzer benötigen, um sich in einer neuen Umgebung zurechtzufinden.
Native Apps verstehen die Bedeutung von Animationen. Es ist ungewöhnlich, eine App ohne Seitenübergänge zu finden, und Benutzer haben sich an dieses höhere Maß an Benutzerfreundlichkeit gewöhnt. Das Web beginnt sich aufgrund dieses Wandels der Erwartungen veraltet anzufühlen. Viele denken an das Web als eine unterlegene Erfahrung im Vergleich zu Apps. Glücklicherweise muss das nicht so sein.
Seitenübergänge mit CSS @keyframes-Animationen hinzufügen
Werfen wir einen Blick auf ein Beispiel, um zu sehen, wie wir mit dem Hinzufügen von Seitenübergängen beginnen könnten. In unserem Demo-Layout sehen wir die typischen weißen Blitzer und harten Schnitte von Webseiten.

CSS-Animationen ermöglichen es uns, das visuelle Verhalten eines Elements zu definieren, wenn es auf der Seite gerendert wird. Um unseren Seiten Animationen hinzuzufügen, sollten wir
- Identifizieren, wie die Elemente auf der Seite animiert werden
- Die benötigten Keyframes erstellen
- Die CSS-Deklarationen schreiben
- Klassen zum Layout hinzufügen
Identifizieren, wie die Elemente auf der Seite animiert werden
Betrachten wir unsere Beispielseite

Wenn wir das Layout untersuchen, können wir einige Möglichkeiten für das Hinzufügen von Übergängen erkennen. Googles Leitfaden zu bedeutungsvollen Übergängen ist eine gute Regel für Elementanimationen. Das ist ein guter Ausgangspunkt, wenn Sie neu im Interaktionsdesign sind.
Die benötigten @keyframes erstellen
Es sieht so aus, als bräuchten wir drei Arten von einzigartigen Animationen.
- Eine Fade-In-Animation für den Header und den Button
- Eine Slide-Up-Animation mit leichtem Fade für den Inhalt der Startseite
- Eine Slide-In von rechts mit leichtem Fade für den Inhalt der Detailseite
Erstellen wir diese CSS @keyframes und benennen sie
/*
* Keyframes
*/
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes fadeInUp {
0% {
opacity: 0;
transform: translate3d(0, 100%, 0);
}
100% {
opacity: 1;
transform: none;
}
}
@keyframes fadeInRight {
0% {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
100% {
opacity: 1;
transform: none;
}
}
}
Die CSS-Deklarationen schreiben
Nachdem wir unsere Keyframes erstellt haben, müssen wir sie mit den CSS-Animationseigenschaften an Klassen binden. So sieht dieser CSS-Code aus
/*
* CSS Page Transitions
* Don't forget to add vendor prefixes!
*/
.m-scene {
/** Basic styles for an animated element */
.scene_element {
animation-duration: 0.25s;
transition-timing-function: ease-in;
animation-fill-mode: both;
}
/** An element that fades in */
.scene_element--fadein {
animation-name: fadeIn;
}
/** An element that fades in and slides up */
.scene_element--fadeinup {
animation-name: fadeInUp;
}
/** An element that fades in and slides from the right */
.scene_element--fadeinright {
animation-name: fadeInRight;
}
}
Es ist wichtig zu beachten, dass zu lange Animationen den Benutzer nerven werden. Es gab bereits einige Forschungsergebnisse zur Benutzerfreundlichkeit von Antwortzeiten. Um die Benutzeroberfläche reaktionsschnell zu halten, begrenzen Sie die Animationsdauer auf 0,25 Sekunden. Führen Sie schnelle, unkomplizierte Benutzertests durch, um sicherzustellen, dass Ihre Animationen nicht störend wirken.
Klassen zum Layout hinzufügen
Nachdem wir unseren CSS-Code geschrieben haben, ist es an der Zeit, die Klassen zum Markup hinzuzufügen.
<!-- Home page -->
<div class="m-scene" id="main">
<div class="m-header scene_element scene_element--fadein">
...
</div>
<div class="m-page scene_element scene_element--fadeinup">
...
</div>
</div>
<!-- Detail page -->
<div class="m-scene" id="main">
<div class="m-aside scene_element scene_element--fadein">
...
</div>
<div class="m-right-panel m-page scene_element scene_element--fadeinright">
...
</div>
</div>
Unser Ergebnis ist ein schönerer Einstieg in die Seiten

Wir haben mit reinem CSS einige Fortschritte auf unserer Seite gemacht. Aber selbst mit unseren Verbesserungen sehen wir immer noch den Blitz und die Animationen sind nicht so straff, wie sie sein könnten. Jetzt verwenden wir smoothState.js, um das zu beheben.
Verfeinerung mit smoothState.js hinzufügen
smoothState.js ist ein jQuery-Plugin, das Seitenaufrufe progressiv verbessert, um uns mehr Kontrolle über Seitenübergänge zu geben. Um es in unsere Seite einzubinden, müssen wir
- Eine Kopie von jQuery besorgen und sie zu unserer Seite hinzufügen
- smoothState.js herunterladen und es nach jQuery hinzufügen.
- Eine neue .js-Datei erstellen und einbinden, nach smoothState.js, in der wir das Plugin ausführen können. (Oder verwenden Sie jedes Build-Tool / jeden Verkettungsprozess, den Sie zur Erledigung all dieser Aufgaben verwenden.)
In unserer neuen .js-Datei wollen wir smoothState auf einem Container mit einer ID initialisieren. Der Container sollte den gesamten Inhalt der Seite umschließen.
;(function ($) {
'use strict';
var content = $('#main').smoothState({
// onStart runs as soon as link has been activated
onStart : {
// Set the duration of our animation
duration: 250,
// Alterations to the page
render: function () {
// Quickly toggles a class and restarts css animations
content.toggleAnimationClass('is-exiting');
}
}
}).data('smoothState'); // makes public methods available
})(jQuery);
smoothState gibt uns Zugriff auf einen onStart.render() Callback, der es uns ermöglicht, die Art und Weise, wie Elemente die Seite verlassen, zu choreographieren. Wir können die harten Schnitte der Seite eliminieren, indem wir die Layout-Animationen umkehren, bevor neue Inhalte angezeigt werden. Um dies zu tun, führen Sie die Funktion .toggleAnimationClass() aus und übergeben Sie eine Klasse als erstes Argument. Jetzt deklarieren wir eine neue Animationsrichtung mit dieser Klasse.
/*
* CSS Page Transitions
* Don't forget to add vendor prefixes!
*/
.m-scene {
.scene_element {
animation-duration: 0.25s;
transition-timing-function: ease-in;
animation-fill-mode: both;
}
.scene_element--fadein {
animation-name: fadeIn;
}
.scene_element--fadeinup {
animation-name: fadeInUp;
}
.scene_element--fadeinright {
animation-name: fadeInRight;
}
/** Reverse "exit" animations */
&.is-exiting {
.scene_element {
animation-direction: alternate-reverse;
}
}
}
Wir möchten auch den Benutzer wieder an den Anfang der Seite animieren. Erreichen Sie dies, indem Sie die .animate() Funktion von jQuery verwenden und die Eigenschaft scrollTop auf 0 setzen.
;(function ($) {
'use strict';
var $body = $('html, body'), // Define jQuery collection
content = $('#main').smoothState({
onStart : {
duration: 250,
render: function () {
content.toggleAnimationClass('is-exiting');
// Scroll user to the top
$body.animate({ 'scrollTop': 0 });
}
}
}).data('smoothState');
})(jQuery);
Das Endergebnis ist ein sanfter Übergang zwischen den Seiten unserer Website. Elemente betreten und verlassen die Seite elegant und der weiße Blitz ist verschwunden. Wir feuern die Animationen ab, noch bevor der Inhalt geladen ist, sodass der Benutzer eine sofortige Reaktion von der Seite sieht.

Danke für diesen Artikel. Ich habe eine Weile mit CSS gekämpft, aber das wird mir definitiv helfen. Danke nochmal! :)
Ich hätte fast etwas Ähnliches geschrieben – gut, dass ich es nicht musste, weil ich ein Niete in JavaScript bin.
Ich habe zuvor eine schäbige selbstgemachte Version davon ausprobiert, bei der
preventDefaultaufrufendo-page-leave-animationshinzufügen, die einige@keyframe-Sachen auslöstsetTimeoutstarten, der die Länge dieser Animationen hatwindow.locationauf diehrefdes geklickten Links setzendo-page-enter-animationsauf dem Body haben, die einige@keyframe-Sachen auslöstDer Punkt ist… wenn man viele Links auf der Seite hat, können wir nicht alle Links vorladen, sonst würde das die Benutzererfahrung verlangsamen, oder?
Ich habe das immer mit AngularJS-Routen und HTTP-Intercepts gemacht… funktioniert Wunder.
Ich würde gerne deine Methode sehen, um einen ähnlichen Effekt mit Angular-Routen und Interceptoren zu implementieren…
Ich würde das auch gerne mit Angular sehen
Vielleicht übersehe ich etwas hier, aber dieses Verhalten ist mit Angular ziemlich einfach zu erreichen. Ich habe es in der Vergangenheit so implementiert: http://scotch.io/tutorials/javascript/animating-angularjs-apps-ngview
Hey! Ich habe ein paar Fragen.
Warum verwendest du im
keyframes-Codetranslate3danstelle vontranslate?Warum wird im jQuery-Code ein Semikolon vor der Erstellung der sofort aufgerufenen Funktion verwendet? Ist das ein Muster oder was?
Die Verwendung von translate3D dient der GPU-Nutzung. Das Semikolon ist vielleicht dazu da, ein vergessenes Semikolon im vorherigen geladenen Skript zu verhindern.
Toller Beitrag! Ich gehe davon aus, dass dies nicht funktioniert, wenn man den Zurück-Button des Browsers verwendet, aber trotzdem ein schöner einfacher Übergang, ohne das Web zu zerstören. In unserer Firma verwenden wir die History-API für Seitenübergänge, weil der Kunde keine Hard-Refreshes mag, aber trotzdem „echte“ Seiten für Suchmaschinenfreundlichkeit möchte… Also ja, ich sehe mich das definitiv verwenden. Der Usability-Aspekt ist ein sehr guter Grund, dies zu implementieren, obwohl… ich habe es noch nie so gesehen…
Gute Idee!
Auf dem iPhone getestet, das Drücken des Zurück-Buttons scheint zu funktionieren
Machen Sie weiter so!
Welche minimale jQuery-Version wird benötigt? Ich habe versucht, dies in einer Drupal 7-Installation zu implementieren, aber die Animationsklasse wurde nicht hinzugefügt.
1.9 ist die Grundvoraussetzung. Ich habe keine Nachforschungen angestellt, ob es mit einer noch früheren Version kompatibel ist, aber es könnte sein. Zögern Sie nicht, mich zu kontaktieren, wenn Sie Probleme bei der Implementierung von smoothState haben.
Oh warte, dieselben Probleme mit der Reinitialisierung von JavaScript… wahrscheinlich, weil es die History-API verwendet…………..
Findest du jemals eine Lösung für die Reinitialisierung von JS? Habe hier dasselbe Problem.
Wird der Code so funktionieren, wie er angegeben ist, oder muss ich etwas daran ändern?
Das ist ein großartiger Artikel. Er erinnert mich an die 90er Jahre, als FrontPage Seitenübergänge hatte, nur dass diese mich nicht zum Selbstmord treiben.
Danke für einen weiteren großartigen Artikel!
Das wäre ein perfekter Artikel gewesen, wenn es echte Seitenneuladungen gegeben hätte. Ansonsten gibt es keine Probleme, das zu tun. Was ist, wenn man Fade-In/Fade-Out mit echten Weiterleitungen machen möchte. Kein Laden von AJAX-Inhalten. Ich habe den Weg dazu noch nicht gefunden.
Es funktioniert perfekt und superschnell! Ich habe eine Frage: Einige meiner Seiten verwenden jQuery-Funktionen, und nach einem Seitenwechsel funktionieren sie nicht mehr. Wie kann ich sie neu initialisieren?
Ich habe dasselbe Problem.
Hat jemand eine Lösung gefunden?
Ich liebe es. Wirklich nett.
Sicherlich ein cooler Beitrag, aber ich bezweifle, ob das tatsächlich gut für die Benutzererfahrung ist. Ich verstehe die Idee der Teleportation von einem Raum zum anderen, aber es sei denn, Sie laden eine ganze Website vor, Sie könnten die Navigation nur um der Übergänge willen blockieren.
Hey Joe, danke für deine Gedanken.
Könntest du ein wenig näher erläutern, was du mit „blockieren der Navigation“ meinst?
Toller Beitrag!
Huuuh, warum funktioniert das in Chrome nicht?
Auf meinem Windows-Tablet dauert der erste Übergang zu einer Seite über zehn Sekunden.
Habe dies mit CSS3-Hintergrundanimationen getestet… Es funktioniert reibungslos, genau wie sein Name, aber einige jQuery-Funktionen wie ein einfacher Countdown funktionieren nicht mehr, wenn man zu einer anderen Seite navigiert und dann zu der Seite mit den JS-Funktionen zurückkehrt. Hat jemand eine Lösung dafür gefunden?