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

React实现鼠标悬停时Div滑出并保持的最佳方案咨询

嘿,作为React新手碰到这种动画需求太正常啦!其实纯CSS和React状态控制两种方式都能实现你的需求,我结合你的代码给你拆解两种方案,你可以根据场景选~

方案一:纯CSS实现(简单高效,优先推荐)

CSS虽然没有onMouseOver这种JS事件,但可以通过:hover伪类+过渡动画轻松实现悬停滑出/收回的效果,完全不用写JS代码,性能还贼好!

假设你想让右侧的.portStyle或.cvStyle1在鼠标悬停时滑出(比如初始隐藏在屏幕外,悬停后滑入),可以这么改你的CSS:

#homeDiv { 
  overflow-y: hidden; 
  overflow-x:hidden; 
}
.nameStyle { 
  height: 100vh; 
  width: 30%; 
  display: flex; 
  justify-content: flex-end; 
  flex-direction: column; 
}
.portStyle { 
  height: 100vh; 
  width: 20%; 
  position: relative; 
  float: right; 
  background-color: #000;
  /* 初始状态:完全移出屏幕右侧 */
  transform: translateX(100%);
  /* 添加过渡动画,让滑入滑出更丝滑 */
  transition: transform 0.3s ease-in-out;
}
.cvStyle1 { 
  height: 100vh; 
  width: 20%; 
  position: relative; 
  float: right; 
  background-color: #ccc;
  /* 同样给cvStyle1加初始状态和过渡 */
  transform: translateX(100%);
  transition: transform 0.3s ease-in-out;
}

/* 场景1:鼠标悬停在自身时滑入 */
.portStyle:hover {
  transform: translateX(0);
}
.cvStyle1:hover {
  transform: translateX(0);
}

/* 场景2:鼠标悬停在名字区域(.nameStyle)时,右侧的栏滑入 */
/* 用CSS兄弟选择器实现,注意元素顺序要对应 */
.nameStyle:hover ~ .cvStyle1,
.nameStyle:hover ~ .portStyle {
  transform: translateX(0);
}

这种方案的好处是:代码简洁、浏览器原生支持,适合简单的hover触发动画场景。

方案二:React状态控制(更灵活,适合复杂逻辑)

如果你的动画需要结合更多React逻辑(比如滑出后点击页面其他区域才收回、或者根据组件props/其他状态联动),那用React的状态来控制就更合适了。

比如我们给组件加个状态来跟踪hover状态,然后动态修改样式:

import { useState } from 'react';

function YourComponent() {
  // 用state跟踪是否处于hover状态
  const [isPortHovered, setIsPortHovered] = useState(false);
  const [isCvHovered, setIsCvHovered] = useState(false);

  return (
    <div id="homeDiv">
      <div>
        <Navbar />
      </div>
      {/* 给portStyle加鼠标事件,更新状态 */}
      <div 
        className="portStyle"
        onMouseEnter={() => setIsPortHovered(true)}
        onMouseLeave={() => setIsPortHovered(false)}
        // 根据状态动态设置transform
        style={{ transform: isPortHovered ? 'translateX(0)' : 'translateX(100%)' }}
      >
      </div>
      {/* cvStyle1同理 */}
      <div 
        className="cvStyle1"
        onMouseEnter={() => setIsCvHovered(true)}
        onMouseLeave={() => setIsCvHovered(false)}
        style={{ transform: isCvHovered ? 'translateX(0)' : 'translateX(100%)' }}
      >
      </div>
      <div className="nameStyle">
        <h1>Lin</h1>
        <h1>Edmund</h1>
      </div>
    </div>
  );
}

对应的CSS还是要保留过渡效果:

.portStyle, .cvStyle1 {
  /* 原有样式 */
  transition: transform 0.3s ease-in-out;
}

如果不想用内联样式,也可以通过切换className来实现:

<div 
  className={`portStyle ${isPortHovered ? 'slide-in' : 'slide-out'}`}
  onMouseEnter={() => setIsPortHovered(true)}
  onMouseLeave={() => setIsPortHovered(false)}
>
</div>

然后CSS添加:

.slide-in { transform: translateX(0); }
.slide-out { transform: translateX(100%); }

这种方案的优势是:可以灵活结合React的生命周期、状态管理,实现更复杂的交互逻辑。

总结

  • 要是只是单纯的「悬停滑出,移出收回」,纯CSS方案完全够用,简单又高效;
  • 要是需要更复杂的触发条件或联动逻辑,再考虑用React状态控制的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:30