Быстрый поиск в Google дал этот результат (не мой), который, кажется, достигает вашей цели с небольшим дополнительным JavaScript и использованием библиотеки TweenLite. Основная логика находится в функции layout()
:
function layout() {
group.classList.toggle("reorder");
for (var i = 0; i < total; i++) {
var box = boxes[i];
var lastX = box.x;
var lastY = box.y;
box.x = box.node.offsetLeft;
box.y = box.node.offsetTop;
// Continue if box hasn't moved
if (lastX === box.x && lastY === box.y) continue;
// Reversed delta values taking into account current transforms
var x = box.transform.x + lastX - box.x;
var y = box.transform.y + lastY - box.y;
// Tween to 0 to remove the transforms
TweenLite.fromTo(box.node, 0.5, { x, y }, { x: 0, y: 0, ease });
}
}
Для каждого элемента, находящегося в гибком макете, он принимает последние координаты x и y, а также текущие координаты после изменения направления макета и на основе этих двух анимирует переход и использует свойство transform
css.