我正在处理的应用程序需要能够在路线中来回导航,因此当您从一个方向导航应用程序时,组件从左向右动画,当您向后导航时,他们从右向导航左
即。
component1 -> component2 = left -> right animation
component2 -> component1 = right -> left animation
我可以在NG4中轻松实现这一点,但问题是它不会导航退出和输入组件。退出组件刚刚消失,输入组件动画。
我也可以在NG2中实现这一点 - 但是当你有条件动画时会出现复杂情况。即
component2 -> component3 = left -> right animation
component2 -> component1 = right -> left animation
此处的问题是根据下一条或上一条路线触发不同的动画。
是否有人在NG2或4中都有解决方案来解决在两个方向同时动画两个视图的问题?
我还没有将它放入plunkr,因为我不知道如何设置NG4应用程序。道歉。
我的NG4解决方案基于this demo app https://github.com/matsko/ng4-animations-preview
但基本上在我的app.component.ts中我有以下动画:
animations: [
trigger('routerAnimations',[
transition('page1 => page2',[
style({transform: 'translateX(100%)'}),
animate('500ms')
]),
transition('page2 => page1', [
style({transform: 'translateX(-100%)'}),
animate('500ms')
]),
transition('page2 => page3',[
style({transform: 'translateX(100%)'}),
animate('500ms')
]),
transition('page3 => page2',[
style({transform: 'translateX(-100%)'}),
animate('500ms')
]),
transition('page3 => page4',[
style({transform: 'translateX(100%)'}),
animate('500ms')
]),
transition('page4 => page3',[
style({transform: 'translateX(-100%)'}),
animate('500ms')
])
])
]
和一个从每条路线抓取动画值并将其(?)绑定到<router-outlet> in app.component.html
上的出口变量的函数:
export class AppComponent {
prepareRouteTransition(outlet) {
let routeData: any;
try {
routeData = outlet['_activatedRoute'].snapshot.routeConfig['animation'];
} catch(e) {
return '';
}
return routeData.value;
}
}
上面的函数抓取动画中用于定义转换开始和结束值的动画值:
export const APP_ROUTES = [{
path: '',
component: Page1Component,
animation: {
value: 'page1',
}
},
{
path: 'page2',
component: Page2Component,
animation: {
value: 'page2',
}
},
{
path: 'page3',
component: Page3Component,
animation: {
value: 'page3'
}
},
{
path: 'page4',
component: Page4Component,
animation: {
value: 'page4'
}
}
];
app.component.html:
<div class="page" [@routerAnimations]="prepareRouteTransition(outlet)">
<router-outlet #outlet="outlet"></router-outlet>
</div>
答案 0 :(得分:8)
您现在可以通过定义查询:enter
和:leave
元素的动画来实现此目的。
此示例将动画显示现有路线,并顺利地在输入路线中制作动画:
const slideLeft = [
query(':leave', style({ position: 'absolute', left: 0, right: 0 ,transform: 'translate3d(0%,0,0)' })),
query(':enter', style({ position: 'absolute', left: 0, right: 0, transform: 'translate3d(-100%,0,0)' })),
group([
query(':leave',
animate('1s', style({ transform: 'translate3d(100%,0,0)' }))),
query(':enter',
animate('1s', style({ transform: 'translate3d(0%,0,0)' })))
])
]
const slideRight = [
query(':leave', style({ position: 'absolute', left: 0, right: 0 , transform: 'translate3d(0%,0,0)'})),
query(':enter', style({ position: 'absolute', left: 0, right: 0, transform: 'translate3d(100%,0,0)'})),
group([
query(':leave',
animate('1s', style({ transform: 'translate3d(-100%,0,0)' }))),
query(':enter',
animate('1s', style({ transform: 'translate3d(0%,0,0)' })))
])
]
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
animations: [
trigger('routerAnimations', [
transition('products => product-details', slideRight),
transition('product-details => products', slideLeft)
])
]
})
答案 1 :(得分:0)
您可以通过将动画放置在要设置动画的路由器出口而不是视图本身周围来实现此目的。
您还希望将动画制作在一个组中,使两个动画同时运行。
<!-- app.html -->
<div [@routeAnimation]="prepRouteState(routerOutlet)">
<!-- make sure to keep the ="outlet" part -->
<router-outlet #routerOutlet="outlet"></div>
class AppComponent {
prepRouteState(outlet: any) {
return outlet.activatedRouteData['animation'] || 'firstPage';
}
}
<!-- app.ts -->
const ROUTES = [
{ path: '',
component: HomePageComponent,
data: {
animation: 'homePage'
}
},
{ path: 'support',
component: SupportPageComponent,
data: {
animation: 'supportPage'
}
}
]
// the animation itself
trigger('routeAnimation', [
//...
transition('homePage => supportPage', [
group([
query(':enter', [
style({ opacity: 0 }),
animate('0.5s', style({ opacity: 1 })),
animateChild()
]),
query(':leave', [
animate('0.5s', style({ opacity: 0 })),
animateChild()
])
])
]),
//...
])