You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React使用useState切换类名实现淡入过渡,替代CSS :hover方案

实现方案

核心问题说明

你当前的代码没有过渡效果是因为 display 属性属于瞬时切换的离散属性,不存在过渡中间帧,无法触发CSS transition动画。

调整步骤

1. 修改JSX类名逻辑

不要将task-icons和invisible-icons设为互斥类,而是把task-icons作为永久基础类,仅动态切换可见性控制类,保证过渡属性始终生效:

<div name="taskIcons" className={`task-icons ${hover ? '' : 'invisible-icons'}`}>

同时建议把状态切换逻辑从取反改为显式赋值,避免事件异常触发导致状态错乱:

const [hover, setHover] = useState(false)

// 替换原来的handleHover
const handleEnter = () => setHover(true)
const handleLeave = () => setHover(false)

// 绑定到标题元素
<h3 className='task-element task-title' 
  onMouseEnter={handleEnter} 
  onMouseLeave={handleLeave}
>{title}</h3>

2. 调整CSS样式

将显隐切换逻辑从display改为支持过渡的透明度、位移属性,同时可选添加宽度过渡避免隐藏时占用布局空间:

.task-icons {
  display: flex;
  white-space: nowrap;
  margin-top: 4px;
  margin-left: 8px;
  /* 明确指定过渡属性、时长和缓动效果 */
  transition: all 0.3s ease;
  /* 可见状态默认值 */
  opacity: 1;
  transform: translateX(0);
  visibility: visible;
  max-width: 200px; /* 足够容纳所有图标的宽度即可 */
  overflow: hidden;
}

.invisible-icons {
  /* 移除display: none */
  opacity: 0;
  transform: translateX(10px); /* 向右偏移,实现从右侧滑入效果 */
  visibility: hidden;
  pointer-events: none; /* 隐藏时禁止触发点击事件 */
  max-width: 0; /* 隐藏时收缩宽度,不占用布局空间 */
  margin-left: 0;
}

你可以根据自己的需求调整transition的时长,以及translateX的偏移量来控制滑入的距离。


内容的提问来源于stack exchange,提问作者Cknutson100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:21:01