2016-06-19 3 views
6

предположим, что у меня есть 2 маршрутизированных компонента и две Routerlinks в фиксированной навигационной панели для их маршрутизации. Я хочу, чтобы они скользнули справа, когда я нажимаю Routerlinks.Угловая 2 «слайд-анимация» маршрутизируемого компонента

Я не хочу компенсировать компонент css и использовать функцию тайм-аута, чтобы изменить класс css, чтобы он включался (например, с помощью ngStyle или ngClass).

Есть ли еще более элегантные способы достижения этого в Angular 2?

Спасибо!

+0

Там новый Animation API в RC2, вы можете смотреть на это. [См. Этот пример] (https://angular.io/docs/ts/latest/guide/animations.html#!#example-entering-and-leaving). Я еще не пробовал это с маршрутизатором, но выглядит как забава (: – Sasxa

+0

, поэтому ответы в основном показывают анимацию со встроенным CSS в TypeScript. Есть ли примеры использования ngClass, поэтому вы можете применять стили CSS вместо ввода/отпуска или в/out effects? – Mark

ответ

7

С угловыми 4.1 теперь можно создавать специальные анимации маршрута. Это отличается от запуска анимации при отображении компонента, поскольку она позволит вам одновременно активировать компонент ввода/вывода для плавного перехода и позволить вам изменять переход в зависимости от того, какой компонент идет или идет. Это означает, что вы можете выполнять сложные переходы, например, перемещать компонент справа, если вы сверляете содержимое, и перемещать его слева, если вы вводите его с помощью кнопки «назад» от другого компонента.

  1. Во-первых, аннотировать выход маршрутизатора как так (например, app.component.html.):

    <div class="page" [@routerAnimations]="prepareRouteTransition(outlet)"> 
        <router-outlet #outlet="outlet"></router-outlet> 
    </div> 
    
  2. реализовать функцию prepareRouteTransition(outlet) в соответствующем определении компонента (например, app.component.js).

    prepareRouteTransition(outlet) { 
        const animation = outlet.activatedRouteData['animation'] || {}; 
        return animation['value'] || null; 
    } 
    
  3. Определить анимацию (например, app.component.js):

    const slideLeft = [ 
        query(':leave', style({ position: 'absolute', left: 0, right: 0 ,transform: 'translate3d(0%,0,0)' }), {optional:true}), 
        query(':enter', style({ position: 'absolute', left: 0, right: 0, transform: 'translate3d(-100%,0,0)' }), {optional:true}), 
        group([ 
         query(':leave', group([ 
         animate('500ms cubic-bezier(.35,0,.25,1)', style({ transform: 'translate3d(100%,0,0)' })), // y: '-100%' 
         ]), {optional:true}), 
         query(':enter', group([ 
         animate('500ms cubic-bezier(.35,0,.25,1)', style({ transform: 'translate3d(0%,0,0)' })), 
         ]), {optional:true}) 
        ]) 
        ] 
    
        const slideRight = [ 
        query(':leave', style({ position: 'absolute', left: 0, right: 0 , transform: 'translate3d(0%,0,0)'}), {optional:true}), 
        query(':enter', style({ position: 'absolute', left: 0, right: 0, transform: 'translate3d(100%,0,0)'}), {optional:true}), 
    
        group([ 
         query(':leave', group([ 
         animate('500ms cubic-bezier(.35,0,.25,1)', style({ transform: 'translate3d(-100%,0,0)' })), // y: '-100%' 
         ]), {optional:true}), 
         query(':enter', group([ 
         animate('500ms cubic-bezier(.35,0,.25,1)', style({ transform: 'translate3d(0%,0,0)' })), 
         ]), {optional:true}) 
        ]) 
        ] 
    
  4. Добавьте метаданные анимации в своем определении маршрута (например, app.routing.ts):

    const routes: Routes = [ 
        { 
        path: 'products', 
        component: ProductsComponent, 
        data: { 
         animation: { 
         value: 'products', 
         } 
        } 
        }, 
        { 
        path: 'products/:id', 
        component: ProductDetailComponent, 
        data: { 
         animation: { 
         value: 'product-detail', 
         } 
        } 
        } 
    
  5. Наконец, зарегистрировать " триггер анимации роутераAnimations на вашем компоненте с выбранными вами анимациями и метаданными маршрута (например,app.component.js):

    @Component({ 
        selector: 'app-root', 
        templateUrl: './app.component.html', 
        styleUrls: ['./app.component.css'], 
        animations: [ 
        trigger('routerAnimations', [ 
         transition('products => product-detail', slideRight), 
         transition('product-detail => products', slideLeft), 
        ]) 
        ] 
    }) 
    

Не забудьте polyfill в Web Animation API целевой старые браузеры

Матиас Niemela говорит больше о маршруте анимации в нг-конф здесь (с демо): https://youtu.be/Oh9wj-1p2BM?t=12m21s

Его презентация код: https://github.com/matsko/ng4-animations-preview

+0

Я не могу построить свой проект Angular после этого Кажется, проект github не может построить вообще из коробки –

+0

Хм, был просто способен клонировать, строить и запускать проект github из коробки на двух разных ноутбуках. Если у вас все еще есть проблемы, вы можете создать новый вопрос и опубликовать какой-то код или опубликовать свой проект? Хотелось бы помочь. – SpaceFozzy

+0

Эй, спасибо за ответ, вот что происходит на моем компьютере с последним угловым CLI & node, если я запустил 'ng build --aot --prod'. http://i.imgur.com/kp8mrVo.jpg –

7

С точки зрения скольжения в нем довольно просто.

Вы можете ссылаться на Official Angular 2 Animate docs.

Вы также можете проверить это Plunker я сделал для простой демонстрации, с помощью нового маршрутизатора v3

Имейте в виду, что я изо всех сил, чтобы выяснить, как на самом деле имеют Оставление/выхода/недействительные переходы, когда вызванный элемент вот-вот будет уничтожен из представления.

Я открыл еще один поток в Angular 2 Animate - No visible effect of the '* => void' transition when changing routes/components, чтобы попытаться выяснить, как заставить маршрутизатор обратить внимание на уходящую анимацию/время перехода.

@Component({ 
    selector: 'home', 
    directives: [ROUTER_DIRECTIVES], 
    template: ` 
    <div @flyInOut="'active'" class="radibre"> 
    </div> 
    `, 
    styles: ['.radibre { width: 200px; height: 100px; background: red; }'], 
    animations: [ 
    trigger('flyInOut', [ 
     state('in', style({transform: 'translateX(0)'})), 
     transition('void => *', [ 
     style({transform: 'translateX(-100%)'}), 
     animate(100) 
     ]), 
     transition('* => void', [ 
     animate(100, style({transform: 'translateX(100%)'})) 
     ]) 
    ]) 
    ] 
}) 

export class Home { 
    constructor() { } 
} 
@Component({ 
    selector: 'page', 
    template: ` 
    <div @testingBottom="'active'" class="page"></div>`, 
    styles: ['.page { width: 300px; height: 50px; background: green; }'], 
    animations: [ 
    trigger('testingBottom', [ 
     state('active', style({transform: 'scale(1)'})), 
     transition('void => *', [ 
     style({transform: 'scale(0)'}), 
     animate(100) 
     ]), 
     transition('* => void', [ 
     animate(100, style({transform: 'scale(0)'})) 
     ]) 
    ]) 
    ] 
}) 
+7

Дружелюбное замечание о том, что в настоящее время Plunker не оживляет переход (возможно, из-за обновлений с угловым2 от * rc_ * до * stable *?) – msanford

Смежные вопросы