2012-06-19 45 views
29

當我從柔性箱中取出物品時,其餘物品會立即「捕捉」到其新位置,而不是動畫。是否可以爲flexbox插入和移除動畫?

從概念上講,由於項目正在改變他們的立場,我希望過渡適用。

我已經設置了過渡性質的所有相關要素(Flexbox,就和孩子)

有什麼辦法動畫編輯(添加&刪除)到Flexbox的?這實際上是對我而言的一個炫耀者,也是對flexbox缺少的一部分。

+1

你能發佈一個能夠再現你的問題的演示嗎?無論是[JS Fiddle](http://jsfiddle.net/),[JS Bin](http://jsbin.com/)或類似的東西都不錯,讓我們看看代碼中發生了什麼,而無需構建我們自己的測試。 –

+0

嘗試(for chrome)-webkit-transition:寬度2s;我認爲這可能是當盒子被移除時動畫的寬度。 – ppsreejith

回答

10

請記住,柔性盒模型和網格佈局規格不斷變化,即使是屬性和有效值。瀏覽器的實現也遠沒有完成。也就是說,您可以在flex屬性上進行轉換,以便元素順利轉換,然後只需偵聽TransitionEnd以最終從DOM樹中刪除該節點。

下面是一個例子的jsfiddle,在Chrome 21上運行:http://jsfiddle.net/5kJjM/(點擊中間的div)

var node = document.querySelector('#remove-me'); 
 

 
node.addEventListener('click', function(evt) { 
 
    this.classList.add('clicked'); 
 
}, false); 
 

 
node.addEventListener('webkitTransitionEnd', function(evt) { 
 
    document.querySelector('#flexbox').removeChild(this); 
 
}, false);
#flexbox { 
 
    display: -webkit-flex; 
 
    -webkit-flex-flow: row; 
 
} 
 

 
.flexed { 
 
    border: 1px solid black; 
 
    height: 100px; 
 
    -webkit-flex: 1 0 auto; 
 
    -webkit-transition: -webkit-flex 250ms linear; 
 
} 
 

 
.clicked { 
 
    -webkit-flex: 0 0 auto; 
 
}
<div id="flexbox"> 
 
    <div class="flexed"></div> 
 
    <div class="flexed" id="remove-me"></div> 
 
    <div class="flexed"></div> 
 
</div>

編輯: 爲了進一步澄清,當你刪除一個節點,你應該將它的flex設置爲0,然後從DOM中刪除它。添加節點時,將其添加到flex:0,然後將其轉換爲flex:1

+0

你的中間div裏面有內容,這個效果並不理想 – Jason

+0

你可以很容易地將內容封裝起來,並設置溢出在轉換過程中隱藏起來,以便它很好地工作。 – skyline3000

+2

我無法在演示中找到任何轉換...它的工作原理與普通flex一樣...並且演示中的transitionEnd處理程序不會觸發,這意味着沒有應用轉換... –

19

我已經修復了@ skyline3000的示例,該示例基於此示例從Treehouse。不知道這是否會再次突破,如果瀏覽器的改變,但這似乎是動畫柔性大小的變化預期的方式:

http://jsfiddle.net/2gbPg/2/

而且我用jQuery的,但它在技術上不是必需的。

.flexed { 
    background: grey; 
    /* The border seems to cause drawing artifacts on transition. Probably a browser bug. */ 
    /* border: 1px solid black; */ 
    margin: 5px; 
    height: 100px; 
    flex-grow: 1; 
    transition: flex-grow 1000ms linear; 
} 

.removed { 
    /* Setting this to zero breaks the transition */ 
    flex-grow: 0.00001; 
} 

有一點要注意對CSS是你不能過渡到零flex-grow,它不會轉換會就此消失。你只需要放一個非常小的值。此外,在繪製邊框時,似乎還存在人爲錯誤,所以在此情況下我使用了背景。

+0

如何做動畫合理化 - 從中​​心到靈活啓動的內容 –

+0

我不完全相信我明白你的意思,你可以發表一個例子嗎? –

+0

是否可以使用垂直佈局來做到這一點?即flex-flow:列; – andrei