угловой 2 ngIf и CSS переход / анимация
Я хочу, чтобы div скользил справа в angular 2 с помощью css.
<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;
}
6 ответов:
обновление 4.1.0
Смотрите также https://github.com/angular/angular/blob/master/CHANGELOG.md#400-rc1-2017-02-24
обновление 2.1.0
для получения более подробной информации см. анимации в угловой.Ио
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">
по последним угловой 2 документациявы можете анимировать элементы "вход и выход" (как в угловом 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
).обратите внимание (взято из угловых документов):
угловые анимации построены поверх стандартного API веб-анимации и работать в браузерах, которые его поддерживают. Для других браузеров требуется полифилл. Захватите веб-анимации.минута.js из GitHub и добавить это на вашу страницу.
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; }
Я использую angular 5 и для ngif, чтобы работать для меня, что находится в ngfor, я должен был использовать animateChild и в компоненте user-detail я использовал *ngIf="user.расширено", чтобы показать скрыть пользователя, и это сработало для ввода ухода
<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%)'})) ]) ]) ];
один из способов-использовать сеттер для свойства ngIf и установить состояние как часть обновления значения. При установке свойства в true detectChanges () необходимо вызвать, чтобы убедиться, что элемент добавляется обратно в dom до изменения состояния анимации.
пример.деталь.ТС
import { Component, AnimationTransitionEvent, OnInit } from '@angular/core'; import { trigger, state, style, animate, transition } from '@angular/animations'; @Component({ selector: 'example', templateUrl: `./example.component.html`, styleUrls: [`./example.component.css`], 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') ]) ]) ] }) export class ExampleComponent implements OnInit { state: string; private _showButton: boolean; get showButton() { return this._showButton; } set showButton(val: boolean) { if (val) { this._showButton = true; this.state = 'visible'; } else { this.state = 'hidden'; } } constructor() { } ngOnInit() { this.showButton = true; } animationDone(event: AnimationTransitionEvent) { if (event.fromState === 'visible' && event.toState === 'hidden') { this._showButton = false; } } log() { console.log('clicked'); } }
пример.деталь.HTML-код
<div> <p>animation state: {{state}}</p> <p>showButton: {{showButton}}</p> <button (click)="showButton = !showButton">toggle</button> </div> <button class="animation-target" *ngIf="showButton" [@state]="state" (@state.done)="animationDone($event)" (click)="log()" >animation target</button>
пример.деталь.css
.animation-target { background: orange; height: 150px; width: 150px; cursor: pointer; opacity: 0; }