2012-06-19 5 views
29

Когда я удаляю элемент из flexbox, оставшиеся предметы «привязываются» к своим новым позициям немедленно, а не оживляют.Можно ли анимировать вкладыши и удаленные изгибы?

Концептуально, поскольку элементы меняют свои позиции, я бы ожидал, что переход будет применяться.

Я установил свойство перехода всех вовлеченных элементов (в Flexbox и детей)

Есть ли способ анимировать изменения (добавляет & удаляет) к Flexbox? Это на самом деле шоу-шоппер для меня и один недостающий кусок с flexbox.

+1

Можете ли вы опубликовать демоверсию, которая воспроизводит вашу проблему вообще? Либо [JS Fiddle] (http://jsfiddle.net/), [JS Bin] (http://jsbin.com/) или что-то подобное было бы хорошо, чтобы мы могли видеть, что происходит в вашем коде, не создавая наши собственные тесты. –

+0

попробуйте (для хром) -webkit-переход: ширина 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

Что нужно сделать для анимации Обоснование-содержание от центра до flex-start –

+0

Я не совсем уверен, что понимаю, что вы имеете в виду, можете ли вы разместить пример? –

+0

Можно ли это сделать с помощью вертикальной компоновки? то естьflex-flow: column; – andrei

Смежные вопросы