2016-08-23 2 views
5

Ich benutze Aurelia-Animator-CSS, um Router Ansichten zu animieren. Nach dem Navigieren zu einer neuen Routeransicht möchte ich, dass die aktuelle Ansicht vom Bildschirm nach links verschoben wird, während die neue Ansicht von rechts auf den Bildschirm verschoben wird.Aurelia Router Ansicht Animation mit swap-order = "mit"

Hier ist mein Router-View-Element:

<router-view swap-order="with"></router-view>

Hier wird das obere Element in jeder der Ansichten:

<div class="pages au-animate">

Und hier ist die CSS:

@keyframes slideLeftIn { 
    0% { 
    transform: translate(100%, 0); 
    } 
    100% { 
    transform: translate(0, 0); 
    } 
} 
@keyframes slideLeftOut { 
    0% { 
    transform: translate(0, 0); 
    } 
    100% { 
    transform: translate(-100%, 0); 
    } 
} 
.pages.au-enter { 
    transform: translate(100%, 0); 
} 
.pages.au-enter-active { 
    animation: slideLeftIn 0.6s; 
} 
.pages.au-leave-active { 
    animation: slideLeftOut 0.6s; 
} 

Ich verwende Autoprefix äh, so dass Präfixe wie "webkit-" nicht benötigt werden.

Mit swap-order="with" gleitet die aktuelle Ansicht vom Bildschirm nach links, und dann wird die neue Ansicht ohne Verschieben angezeigt. Das gleiche passiert mit swap-order="before".

Hier ist ein youtube screen video mit swap-order="with".

Mit swap-order="after" wird die aktuelle Ansicht vom Bildschirm nach links verschoben, und dann wird die neue Ansicht von rechts eingeblendet.

Hier ist ein youtube screen video mit swap-order="after".

Ich würde denken, dass swap-order="with" wäre derjenige, der in dieser Situation benötigt wird. Aber swap-order="after" ist am nächsten, was ich brauche, da beide Ansichten tatsächlich Dias durchführen, nur nicht zusammen.

+0

änderte ich die .pages.au-enter-aktive Animation Dauer von 0,6s bis 1,6s nur um zu sehen, was mit Swap-Ordnung geschieht = „mit“. Es zeigt die neue Ansicht von rechts, nachdem die aktuelle Ansicht vollständig ausgeblendet wurde. Die neue Ansicht wird zunächst teilweise angezeigt und dann wie erwartet eingeblendet. Es scheint also, dass die neue Ansicht unsichtbar ist, bis die aktuelle Ansicht aus dem DOM entfernt wird. Jetzt denke ich, dass das Problem etwas mit meinem CSS zu tun hat, aber ich bin mir nicht sicher, was es sein könnte. Irgendwelche Vorschläge? –

+0

Erprobierte ein einfaches Projekt und es funktioniert ordnungsgemäß, so dass ich ziemlich sicher bin, dass es etwas mit dem anderen CSS für .pages zu tun hat. –

Antwort

0

Es stellt sich heraus, dass ich nur meine .pages Klasse die folgenden Stile hinzufügen benötigt:

.pages { 
    position: absolute; 
    left: 0px; 
    top: $navBarHeight; /* using sass var for the height of my navbar */ 
} 

Jetzt ist alles wie erwartet funktioniert.

+0

kann ich fragen, ob es Ihnen jemals gelungen ist, die Animation umzukehren, wenn der Benutzer den Zurück-Knopf drückt, und wenn ja, wie? – powerbuoy

+0

@powerbuoy Ein bisschen spät, aber trotzdem. Sie könnten zwei neue Direktiven erstellen, in denen Sie die Transforms invertieren. Wenden Sie eine Klasse an, wenn Sie rückwärts navigieren, sodass Sie die umgekehrten Animationen verwenden. – scheien

+0

@scheien Ich habe eine ziemlich gute Idee, wie ich die Animation umkehren kann, das Problem, das ich habe, ist eine Rückwärtsnavigation. Mehr hier: https://github.com/aurelia/router/issues/436 – powerbuoy

1

Hinweis: Dies ist keine Antwort auf die Frage, sondern eher eine Ergänzung zu dem Animationsstil und der Frage von @powerbouy in der akzeptierten Antwort.

Wenn jemand hierher gekommen, wie ich es tat, auf der Suche nach einer Möglichkeit, einen Telefon Stil Navigation haben:

Sie müßten zwei weitere Animationen, die die Richtung umkehrt.

@keyframes slideRightIn { 
    0% { 
    transform: translate(-100%, 0); 
    } 
    100% { 
    transform: translate(0, 0); 
    } 
} 
@keyframes slideRightOut { 
    0% { 
    transform: translate(0, 0); 
    } 
    100% { 
    transform: translate(100%, 0); 
    } 
} 

Dann würden Sie einen neuen Satz von Animationsklassen müssen:

.slide-right .pages.au-enter { 
    transform: translate(-100%, 0); 
} 
.slide-right .pages.au-enter-active { 
    animation: slideRightIn 0.4s; 
} 
.slide-right .pages.au-leave-active { 
    animation: slideRightOut 0.4s; 
} 

Nach links nach rechts rückwärts Navigation Stil zu verwenden, müßten Sie die slide-right Klasse zu Ihrem einem Elternelement von .pages anzuwenden

Man könnte es auf dem wie router-view Element in einem back() Verfahren anhängen:

back() { 
     document.querySelector('router-view').classList.add('slide-right'); 
     window.history.back(-1); 
    } 

Dann auf dem detach() Ereignis, entfernen Sie es.

detached() { 
    // remove class after animation. Only opt-in for showing "back" style animation. 
    document.querySelector('router-view').classList.remove('slide-right'); 
} 

UPDATE:

Um auch die Verwendung des Browser zu erkennen Schaltfläche zurück, könnten Sie das popstate Ereignis anzapfen. Das Objekt PLATFORM stammt aus dem Aurelia PAL-Paket.

ein Eventhandler hinzufügen:

backEventHandler =() => { this.back(true); }; 

Ereignis-Listener hinzufügen, wenn die Komponente angeschlossen ist:

attached() { 
     PLATFORM.global.addEventListener("popstate", this.backEventHandler); 
    } 

Ereignis-Listener entfernen, wenn die Komponente gelöst ist:

detached() { 
     // remove class after animation. Only opt-in for showing "back" style animation. 
     document.querySelector('router-view').classList.remove('slide-right'); 

     PLATFORM.global.removeEventListener("popstate", this.backEventHandler); 
    } 

Aktualisieren, um die back() Funktion enthalten auch einen Parameter, um festzustellen, ob es vom Browser aus aufgerufen wird o r nicht.

back(native?: boolean) { 
     document.querySelector('router-view').classList.add('slide-right'); 

     if (!native) { 
      window.history.back(-1); 
     } 
    } 
+0

Das funktioniert gut, wenn Sie Ihre eigene Methode 'back()' verwenden, aber nicht, wenn der Benutzer auf die Schaltfläche Zurück klickt. Ich bin auf der Suche nach einem Weg, alle Arten der Rückwärtsnavigation zuverlässig zu erkennen. – powerbuoy

+0

Sie können auf das Ereignis "popstate" tippen, das im Github-Problem erwähnt wird. – scheien

+0

Nein, das feuert unabhängig – powerbuoy

Verwandte Themen