Анимация добавления блока в список блоков в React
У меня есть горизонтальный ряд ящиков, выровненных по правому краю. Я хочу добавить новый блок с правой стороны, чтобы он постепенно сдвигался внутрь, перемещая другие блоки влево при этом.
https://codesandbox.io/s/vibrant-curran-xqcbh?file=/src/App.js - вот где я нашел. Вот мой код:
import { motion, AnimatePresence } from "framer-motion";
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [texts, setTexts] = useState(["foo", "foo"]);
return (
<div className="m-2">
<button
className="btn btn-primary mb-3"
onClick={() => {
setTexts([...texts, "bar"]);
}}
>
Add box
</button>
<div className="d-flex justify-content-end">
<AnimatePresence initial={false}>
{texts.map((text, i) => (
<motion.div
key={i}
positionTransition
initial={{ x: 100 }}
animate={{ x: 0 }}
transition={{ duration: 2, type: "tween" }}
>
<div className="alert alert-primary mr-2" style={{ width: 100 }}>
{text}
</div>
</motion.div>
))}
</AnimatePresence>
</div>
</div>
);
}
Есть две проблемы:
- Все существующие поля перемещаются влево намного быстрее, чем следующее поле.
- Существующие ящики после перемещения имеют пружинные колебания. Вместо этого я бы хотел, чтобы они плавно двигались к месту назначения, не превышали его и не колебались.
Есть идеи, куда идти дальше?
Я использовал framer-motion, но я не привязан к нему, если другая библиотека облегчит это.
1 ответ
Решение
Просто нужна подходящая пружина для positionTransition.
const spring = {
duration: 2,
type: "tween"
};
...
positionTransition={spring}
См. Пример https://codesandbox.io/s/kind-mendel-zl1fl?file=/src/App.js