【发布时间】:2021-12-09 18:34:30
【问题描述】:
我想在用户单击按钮时为元素设置动画。 该元素显示按钮被点击的次数。这是通过每次单击按钮时递增的状态来管理的。
每当单击按钮时,显示的数字应弹跳/动画,以强调其变化。
本质上,我想有条件地附加一个 CSS 类。有很多如何做到这一点的示例,但几乎所有示例都只应用了一个类,而不是很多类。
我使用tailwindcss 进行样式设置。这意味着大量元素上的大量 CSS 类。
我所考虑的
字符串连接
有一个classNames 数组,可以轻松添加和删除动画类。
const [count, setCount] = useState(0);
const [classNames, setClassNames] = useState([
'text-2xl', 'mb-2', 'font-bold', 'text-black', 'dark:text-white'
]);
const countElement = <p className={classNames.join(' ')}>{count}</p>;
const handleClick = () => {
setCount(count + 1);
// Append the animation class.
setClassNames(classNames.concat('animate-bounce'));
// Remove the animation class after the animation is done.
setTimeout(() => {
setClassNames(classNames.filter(className =>
className !== 'animate-bounce'));
}, 1000);
};
return <>
{count > 0 ? countElement : null}
<button className="px-4 py-3 mb-2 rounded-lg font-semibold transition-colors duration-300
bg-cardinal-default hover:bg-cardinal-dark active:bg-cardinal-darkest
text-black dark:text-white"
onClick={handleClick}>Click me</button>
</>;
虽然使用 tailwindcss 这有点难看,因为 它将所有样式与其实际元素分开。不完全理想。感觉很hacky。
动画内部元素
const [isBouncing, setIsBouncing] = useState(false);
const countElement = (
<p className="text-2xl mb-2 font-bold text-black dark:text-white">
<span className={isBouncing ? 'inline-block animate-spin' : ''}>{count}</span>
</p>
);
...
setCount(count + 1);
setIsBouncing(true);
setTimeout(() => setIsBouncing(false), 1000);
...
这样更好,但还是需要我设置inline-block
有更好的方法吗?还是我已经用尽了所有有价值的解决方案?
【问题讨论】:
标签: javascript reactjs tailwind-css