2015-01-21 47 views
5

我在我的web應用程序中使用UI路由器。根格代碼:在UI路由器中狀態轉換之間淡入淡出動畫

<div ui-view="content" class="fade-in-up"></div> 

當我從一個狀態到另一個(/訂單,在下面的截圖/反饋),新州的動畫漸變結束前的第一個狀態不隱藏。

Screenshot

我的CSS是:

@-webkit-keyframes fadeInUp { 
    0% { 
opacity: 0; 
-webkit-transform: translateY(15px); 
} 
100% { 
opacity: 1; 
-webkit-transform: translateY(0); 
} 
} 
@-moz-keyframes fadeInUp { 
0% { 
opacity: 0; 
-moz-transform: translateY(15px); 
} 
100% { 
    opacity: 1; 
    -moz-transform: translateY(0); 
} 
} 
@-o-keyframes fadeInUp { 
0% { 
opacity: 0; 
-o-transform: translateY(15px); 
} 
100% { 
    opacity: 1; 
    -o-transform: translateY(0); 
    } 
    } 
    @keyframes fadeInUp { 
    0% { 
    opacity: 0; 
    transform: translateY(15px); 
} 
100% { 
    opacity: 1; 
    transform: translateY(0); 
    } 
    } 
    .fade-in-up { 
    -webkit-animation: fadeInUp .5s; 
    animation: fadeInUp .5s; 
    } 

我在哪裏錯了?

+0

[The FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-animate-ui-view-with-ng-animate)有一個回答這個問題對我有用。確保你使用的是ngAnimate,然後檢查你的CSS。 – Casey 2015-09-08 16:46:38

回答

10

我剛剛發佈了一個tutorial with a working demo顯示如何使用ngAnimate與CSS轉換執行此操作。

有一對夫婦在演示的轉變,這是主要的元素在新的觀點衰落CSS代碼片段:

/* start 'enter' transition on main view */ 
main.ng-enter { 
    /* transition on enter for .5s */ 
    transition: .5s; 

    /* start with opacity 0 (invisible) */ 
    opacity: 0; 
} 

/* end 'enter' transition on main view */ 
main.ng-enter-active { 
    /* end with opacity 1 (fade in) */ 
    opacity: 1; 
} 

這裏只有對.ng-enter而不是.ng-leave的過渡,這將導致新視圖(即輸入)淡入,而舊視圖(即將離開)在沒有轉換的情況下立即消失。

0

您可以使用.ng-enter.ng-leave類(如果您已包含'ng-animate'模塊)來觸發動畫。然後,你可以做這樣的事情在你的CSS文件:

[ui-view].ng-leave { 
    animation: fadeOut 0.5s; 
} 

[ui-view].ng-enter { 
    animation: fadeIn 0.5s; 
} 

或只設置一個過渡性質與變換和不透明性的持續時間和剛剛成立相應的他們在ng-enterng-leave類。

+0

我試過了,但沒有改變。我認爲這與css動畫無關。也許這是一個用戶界面問題。 – Burak 2015-01-30 09:45:41

4

嘗試添加類「主力」你DIV所以它看起來是這樣的:

<div ui-view="content" class="main"></div> 

然後使用這個CSS:

.main.ng-enter { 
    transition: 0.25s; 
    opacity: 0; } 
.main.ng-enter-active { 
    opacity: 1; } 
.main.ng-leave { 
    transition: 0.25s; 
    opacity: 1; } 
.main.ng-leave-active { 
    opacity: 0; } 
5

ui-router將激發你的ui-view路線更改視圖出來的與傳入視圖相同的時間。因此,您得到的是以前的ui-view仍然可見,而下一個ui-view已呈現,並且如果您將視圖動畫化,那麼會出現重疊的轉換持續時間舊觀點和新觀點。你應該看看上呈現新的ui-view直到舊持觀望完成了動畫(動畫在新的一個前)

我將調查ui-router$rootScope狀態改變事件進入這個(https://github.com/angular-ui/ui-router/wiki#state-change-events)。

## Hold off on the state change, until current (previous) state has finished animating out 
$rootScope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) -> 
    console.log "state change start", arguments 

$rootScope.$on '$stateChangeSuccess', (event, toState, toParams, fromState, fromParams) -> 
    console.log "state change success", arguments 

也看看這個人的例子http://homerjam.github.io/angular-ui-router-anim-in-out。他們創造了鉤到ui-view和分裂開的變化爲enterleave模塊,你可以觸發(老視)的動畫出來後(新視圖)的動畫http://homerjam.github.io/angular-ui-router-anim-in-out/anim-in-out.js

這個人說明了什麼正在發生ui-view更改複製https://youtu.be/W89DYSthCTQ?t=345

+0

視頻鏈接擅長解釋問題的根源,但他沒有提供解決方案。 – dopatraman 2015-11-16 00:54:19

+0

同意 - 我相信解決方案會有很大的不同,取決於所使用的'ui-view'嵌套的級別。對於沒有嵌套在單個視圖容器之外的應用程序的「簡單」解決方案應該包括一個動畫,其持續時間爲ng-animate,以檢測並觸發所提及的這些更改事件,並且爲嵌套視圖添加匹配(或更大)的動畫持續時間這個元素的主視圖是ng-animate開始觀看'transitionend'事件的地方。 – twmulloy 2015-11-21 17:34:32