1. 程式人生 > >angular2 學習筆記 ( animation 動畫 )

angular2 學習筆記 ( animation 動畫 )

keyframes guid bool display 建立 cond elf spl 選擇器

refer :

https://angular.io/guide/animations

https://github.com/angular/angular/blob/master/packages/animations/src/animation_metadata.ts

https://github.com/angular/angular/commit/f1a9e3c (router)

angular 的動畫建立在一堆的方法上:

1. trigger
觸發器, 用來和 dom 交互 <div [@triggerName]="state" ></div>
trigger 負責定義各種 state 和它們之間變化來變化去 transition

trigger(‘triggerA‘, [ 
    state(‘A‘, style...),
    state(‘B‘, style...), 
    transition(‘A => B‘, animate...),
    transition(‘B => A‘, animate...)
])

2. State
angular 的概念是通過改變狀態(state)來觸發(trigger)動畫(animate)
每個狀態都定義了最終的樣式

state(‘A‘, style...)

3. transition
負責定義各種 state 之間錯綜復雜的轉換關系

transition(‘A => B‘, animate...)
transition(
‘A <=> B‘, animate...) transition(‘* => *‘, animate...) * is whatever transition(‘:enter‘, animate...) transition(‘:leave‘, animate...) transition(‘* => void‘, animate...) void表示無, whatever to null 也等於 :leave transition((fromState, toState) => boolean, animate...) 還可以寫方法判斷哦 transition(
‘A => B‘,[style,animate]) style 也可以放進來哦. transition(‘A => B‘,[animate,animate]) 數組 animate 會按序執行和 transition(‘A => B‘, sequence([animate,animate])) 是一樣的 transition(‘A => B‘,group(animate,animate)) 不想按序執行可以使用 group

到這裏可以看出一個基本的流程
[@triggerName]="state" 監聽了 state 的變化
一但變化發生觸發器就查找匹配的 transition 然後執行 animate. 就這樣簡單

4. Style
就是定義 css 啦

style({ display : ‘none‘ })

5. animate
具體的動畫定義

animate("5s 10ms cubic-bezier(.17,.67,.88,.1)", style(...)) 

duration= 5second
delay=10ms
easing= cubic-bezier (ease-out 等等 css 有的都可以放)
最後加上 style 就可以動畫了咯

animate("5s", keyframes([ 
    style({opacity: 0, offset: 0}),
    style({opacity: 1, offset: 0.3})
])) 

如果你想完全掌握節奏可以使用 keyframes + offset 做定義, offset 0.3 是百分比

6.group
就是把多個 animate 組合起來並發執行.

group(animate,animate)

7.keyframes
上面說了


8.sequence
按順序一個接一個執行, 和 group 剛好打對臺, 一個 step by step, 另一個是並發

sequence(animate,animate)

9.useAnimation

animate是可以封裝的. 使用 animation 方法

let fadeAnimation = animation([
    style({ opacity: ‘{{ start }}‘ }),
    animate(‘{{ time }}‘,
    style({ opacity: ‘{{ end }}‘))
], { params: { time: ‘1000ms‘, start: 0, end: 1 }});

然後在任何想使用 animate 的地方改用 useAnimation

useAnimation(fadeAnimation, {
    params: {
      time: ‘2s‘,
     start: 1,
      end: 0
    }
})

10.query
任何你想使用 animate 的地方都可以使用 query
animate 會施法在當前的 element 上, 而通過 query 你可以施法在 element 的 child 上
query 支持 css 選擇器的語法,還有一些 angular 特別的定義語法.

query(‘css-selector‘,[animate...])

- Querying for newly inserted/removed elements using `query(":enter")`/`query(":leave")`

這裏有個神技

<div [@listAnimation]="items.length">
    <div *ngFor="let item of items">
        {{ item }}
    </div>
</div>

通過 items.length 配上下面的 transition * => * + query child 就可以實現 items 在插入和移除時的動畫了.

transition(‘* => *‘, [  
    query(‘:leave‘, [
        stagger(100, [
         animate..
        ])
    ]),
    query(‘:enter‘, [        
        stagger(100, [
         animate..
        ])
    ])
])

- Querying all currently animating elements using `query(":animating")`
- Querying elements that contain an animation trigger using `query("@triggerName")`
- Querying all elements that contain an animation triggers using `query("@*")`
- Including the current element into the animation sequence using `query(":self")`

11.stagger
stagger 是配合 query 來使用的, 它的作用是當 query select 出很多 element 時,你希望它們不要並發, 而是隔著一個間隔時間.

query(‘css-selector‘,[stagger(100,[animate])]) 

比如 select 出 2 個 element, 一個觸發動畫先,另一個則會等間隔 100ms 後才觸發.

12.animateChild
animateChild 是一個 manual trigger 概念

<div [@parentAnimation]="exp"> 
    <div [@childAnimation]="exp">
        one
    </div>
</div>

angular 說, 當 parent trigger 觸發後,child trigger by default 是不會被觸發的 (不過我試了會 /.\)
而我們可以在 parent trigger 中通過 query([email protected],[animateChild()]) 來手動觸發 child trigger.
這個在做 router animate 時會用到哦.

router animation 實現 https://github.com/angular/angular/commit/f1a9e3c

其實也是依據上面這些方法來做的. 主要用了 parent, child, query, enter, leave, animateChild 這些概念.

angular2 學習筆記 ( animation 動畫 )