2012-06-19 12 views
29

Cuando elimino un elemento de un flexbox, los elementos restantes "se ajustan" en sus nuevas posiciones inmediatamente en lugar de animar.¿es posible animar inserciones y eliminaciones de flexbox?

Conceptualmente, dado que los artículos están cambiando sus posiciones, esperaría que las transiciones se apliquen.

que ha establecido la propiedad de transición en todos los elementos implicados (el FlexBox y los niños)

¿Hay alguna manera de animar ediciones (añade & borra) a un FlexBox? Esto es en realidad un disparate para mí y la única pieza que falta con flexbox.

+1

¿Puede publicar una demostración que reproduzca su problema? O bien [JS Fiddle] (http://jsfiddle.net/), [JS Bin] (http://jsbin.com/) o similar sería bueno, para nosotros ver lo que está sucediendo en su código sin tener que construir nuestras propias pruebas. –

+0

try (para chrome) -webkit-transition: ancho 2s; Creo que puede ser el ancho que se anima cuando se elimina la caja. – ppsreejith

Respuesta

10

Recuerde que las especificaciones del Modelo de caja flexible y del Diseño de cuadrícula cambian constantemente, incluso las propiedades y los valores válidos. Las implementaciones del navegador están lejos de ser completas también. Una vez dicho esto, puede realizar la transición en la propiedad flex para que los elementos se transfieran sin problemas, luego simplemente escuche el TransitionEnd para eliminar finalmente el nodo del árbol DOM.

Aquí es un ejemplo jsFiddle, que se ejecuta en Chrome 21: http://jsfiddle.net/5kJjM/ (haga clic en el div media)

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>

Editar: Para aclarar aún más, cuando se quita un nodo, deberías establecer su flexión en 0, luego eliminarlo del DOM. Al agregar un nodo, agréguelo con flex: 0, luego realice la transición a flexión: 1

+0

donde hay contenido en su div medio, esto no funciona tan bien – Jason

+0

Puede envolver fácilmente el contenido y configurar el desbordamiento para que se oculte durante la transición para que funcione correctamente. – skyline3000

+2

no puedo encontrar ninguna transición en la demostración ... funciona igual que la flexión normal ... y el controlador 'transitionEnd' en la demostración no se activa, lo que significa que no se están aplicando transiciones ... –

19

He arreglado la demostración de @ skyline3000 según este ejemplo desde Treehouse. No estoy seguro si esto va a romper de nuevo si los navegadores cambian, pero esto parece ser la forma prevista para animar los cambios de tamaño de la flexión:

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

También utilicé jQuery pero técnicamente no es necesario.

.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; 
} 

Una cosa a tener en cuenta sobre la CSS es que no se puede pasar a un flex-grow de cero, no será la transición se acaba de desaparecer. Solo debes poner un valor muy pequeño. También parece haber un error de artefacto al dibujar bordes, así que he usado un fondo en este caso.

+0

Qué hacer para animar Justificar-Contenido del centro para iniciar de forma flexible –

+0

No estoy exactamente seguro de que entiendo lo que quiere decir, ¿puede publicar un ejemplo? –

+0

¿es posible hacer esto con un diseño vertical? es decirflex-flow: columna; – andrei

Cuestiones relacionadas