각도 2 ngIf 및 CSS 전환/애니메이션
나는 CSS를 사용하여 오른쪽에서 각 2로 디브가 미끄러져 들어가기를 원합니다.
<div class="note" [ngClass]="{'transition':show}" *ngIf="show">
<p> Notes</p>
</div>
<button class="btn btn-default" (click)="toggle(show)">Toggle</button>
클래스를 전환하고 불투명도를 사용하기 위해 [ngClass]만 사용하면 작업이 잘 됩니다.하지만 처음부터 요소가 렌더링되는 것을 원하지 않기 때문에 먼저 ngIf로 "숨겼지만" 전환이 작동하지 않습니다.
.transition{
-webkit-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
-moz-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
-ms-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out ;
-o-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
margin-left: 1500px;
width: 200px;
opacity: 0;
}
.transition{
opacity: 100;
margin-left: 0;
}
업데이트 4.1.0
https://github.com/angular/angular/blob/master/CHANGELOG.md#400-rc1-2017-02-24 도 참조하십시오.
업데이트 2.1.0
자세한 내용은 Angular 애니메이션을 참조하십시오.이오
import { trigger, style, animate, transition } from '@angular/animations';
@Component({
selector: 'my-app',
animations: [
trigger(
'enterAnimation', [
transition(':enter', [
style({transform: 'translateX(100%)', opacity: 0}),
animate('500ms', style({transform: 'translateX(0)', opacity: 1}))
]),
transition(':leave', [
style({transform: 'translateX(0)', opacity: 1}),
animate('500ms', style({transform: 'translateX(100%)', opacity: 0}))
])
]
)
],
template: `
<button (click)="show = !show">toggle show ({{show}})</button>
<div *ngIf="show" [@enterAnimation]>xxx</div>
`
})
export class App {
show:boolean = false;
}
원래의
*ngIf
식이 다음이 될 때 DOM에서 요소를 제거합니다.false
존재하지 않는 요소에서는 전환을 수행할 수 없습니다.
대신 사용hidden
:
<div class="note" [ngClass]="{'transition':show}" [hidden]="!show">
최신 Angular 2 설명서에 따르면 "Entering and Leave" 요소를 애니메이션으로 만들 수 있습니다(예: Angular 1).
단순 페이드 애니메이션의 예:
관련 @구성요소 추가:
animations: [
trigger('fadeInOut', [
transition(':enter', [ // :enter is alias to 'void => *'
style({opacity:0}),
animate(500, style({opacity:1}))
]),
transition(':leave', [ // :leave is alias to '* => void'
animate(500, style({opacity:0}))
])
])
]
가져오기를 추가하는 것을 잊지 마십시오.
import {style, state, animate, transition, trigger} from '@angular/animations';
관련 구성 요소의 HTML 요소는 다음과 같아야 합니다.
<div *ngIf="toggle" [@fadeInOut]>element</div>
슬라이드와 페이드 애니메이션의 예를 여기서 만들었습니다.
'void' 및 '*'에 대한 설명:
void
다음과 같은 경우의 상태입니다.ngIf
false로 설정됩니다(요소가 뷰에 연결되지 않은 경우 적용됨).*
애니메이션 상태가 여러 개 있을 수 있습니다(문서에서 자세히 읽음).그*
상태는 모든 "상태"로 그들보다 우선합니다. (내 예에서 이것은 다음과 같은 경우의 상태입니다.)ngIf
으로 설정됨true
).
주의사항(각 문서에서 가져온 것):
앱 모듈 내부에 추가 선언,import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
각진 애니메이션은 표준 웹 애니메이션 API 위에 구축되며 이를 지원하는 브라우저에서 기본적으로 실행됩니다.다른 브라우저의 경우 폴리필이 필요합니다.GitHub에서 웹 애니메이션.min.js를 가져와 페이지에 추가합니다.
trigger('slideIn', [
state('*', style({ 'overflow-y': 'hidden' })),
state('void', style({ 'overflow-y': 'hidden' })),
transition('* => void', [
style({ height: '*' }),
animate(250, style({ height: 0 }))
]),
transition('void => *', [
style({ height: '0' }),
animate(250, style({ height: '*' }))
])
])
최신 브라우저를 위한 CSS 전용 솔루션
@keyframes slidein {
0% {margin-left:1500px;}
100% {margin-left:0px;}
}
.note {
animation-name: slidein;
animation-duration: .9s;
display: block;
}
한 가지 방법은 ngIf 속성에 대한 설정자를 사용하고 값 업데이트의 일부로 상태를 설정하는 것입니다.
fade.component.ts
import {
animate,
AnimationEvent,
state,
style,
transition,
trigger
} from '@angular/animations';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
export type FadeState = 'visible' | 'hidden';
@Component({
selector: 'app-fade',
templateUrl: './fade.component.html',
styleUrls: ['./fade.component.scss'],
animations: [
trigger('state', [
state(
'visible',
style({
opacity: '1'
})
),
state(
'hidden',
style({
opacity: '0'
})
),
transition('* => visible', [animate('500ms ease-out')]),
transition('visible => hidden', [animate('500ms ease-out')])
])
],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class FadeComponent {
state: FadeState;
// tslint:disable-next-line: variable-name
private _show: boolean;
get show() {
return this._show;
}
@Input()
set show(value: boolean) {
if (value) {
this._show = value;
this.state = 'visible';
} else {
this.state = 'hidden';
}
}
animationDone(event: AnimationEvent) {
if (event.fromState === 'visible' && event.toState === 'hidden') {
this._show = false;
}
}
}
fade.component.component.component
<div
*ngIf="show"
class="fade"
[@state]="state"
(@state.done)="animationDone($event)"
>
<button mat-raised-button color="primary">test</button>
</div>
예제.component.component.component
:host {
display: block;
}
.fade {
opacity: 0;
}
앵글 5를 사용하고 있고 앵지프가 나를 위해 일하기 위해서는 animateChild를 사용해야 했고 사용자 정의 구성 요소에서 *ngIf="user.expanded"를 사용하여 사용자 숨기기를 표시했고 탈퇴 입력에 효과가 있었습니다.
<div *ngFor="let user of users" @flyInParent>
<ly-user-detail [user]= "user" @flyIn></user-detail>
</div>
//the animation file
export const FLIP_TRANSITION = [
trigger('flyInParent', [
transition(':enter, :leave', [
query('@*', animateChild())
])
]),
trigger('flyIn', [
state('void', style({width: '100%', height: '100%'})),
state('*', style({width: '100%', height: '100%'})),
transition(':enter', [
style({
transform: 'translateY(100%)',
position: 'fixed'
}),
animate('0.5s cubic-bezier(0.35, 0, 0.25, 1)', style({transform: 'translateY(0%)'}))
]),
transition(':leave', [
style({
transform: 'translateY(0%)',
position: 'fixed'
}),
animate('0.5s cubic-bezier(0.35, 0, 0.25, 1)', style({transform: 'translateY(100%)'}))
])
])
];
저의 경우 실수로 잘못된 구성 요소에 애니메이션을 선언했습니다.
app.component.vmdk
<app-order-details *ngIf="orderDetails" [@fadeInOut] [orderDetails]="orderDetails">
</app-order-details>
(요소가사구요선합야을니언다해션이애니메소에성용는되▁the합요▁needs▁on니다▁where▁component▁to▁animation▁be▁(▁is▁the▁declared야선언).appComponent.ts
)에 애니메이션을 에 선언하고 있었습니다.OrderDetailsComponent.ts
대신.
같은 실수를 하는 누군가에게 도움이 되기를 바랍니다.
언급URL : https://stackoverflow.com/questions/36417931/angular-2-ngif-and-css-transition-animation
'programing' 카테고리의 다른 글
iOS에서 HTML을 NSA 속성 문자열로 변환 (0) | 2023.04.29 |
---|---|
Microsoft Azure 웹 사이트 - 사용자 정의 도메인 메일 (0) | 2023.04.29 |
gulp 명령을 찾을 수 없음 - gulp 설치 후 오류 (0) | 2023.04.29 |
상속 및 의존성 주입 (0) | 2023.04.24 |
사용자가 로그인하고 있는지 확인하는 방법 (0) | 2023.04.24 |