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

如何实现鼠标悬停卡片时切换整个Div的内容?

实现悬停卡片切换整体内容的方案

你要实现的「悬停单个卡片切换整个div内容」效果,纯CSS可以实现,但有局限性;JavaScript方案更灵活通用,以下是两种方案的具体实现:


一、纯CSS方案(依赖固定结构)

这种方案需要调整HTML结构,将触发hover的导航项和内容区放在同一容器下,利用CSS兄弟选择器控制内容的显示隐藏。

调整后的HTML

<div class="partitions__wrapper">
  <!-- 悬停触发项 -->
  <div class="partition-trigger">Interior Design</div>
  <div class="partition-trigger">Author's Supervision</div>
  <div class="partition-trigger">Other Service</div>

  <!-- 对应内容区 -->
  <div class="partition-content active">
    <h2 class="partition__title">Interior Design</h2>
    <p class="partition__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
    <a class="border-button">See more</a>
  </div>
  <div class="partition-content">
    <h2 class="partition__title">Author's Supervision</h2>
    <p class="partition__text">Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
    <a class="border-button">See more</a>
  </div>
  <div class="partition-content">
    <h2 class="partition__title">Other Service</h2>
    <p class="partition__text">Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
    <a class="border-button">See more</a>
  </div>
</div>

配套CSS

.partitions__wrapper {
  position: relative;
  background-color: #f5f5f5;
  padding: 50px;
  text-align: center;
}

.partition-trigger {
  display: inline-block;
  margin: 0 20px;
  padding: 10px;
  cursor: pointer;
  transition: color 0.3s;
}

.partition-trigger:hover {
  color: #666;
}

.partition-content {
  position: absolute;
  top: 100px;
  left: 50%;
  transform: translateX(-50%);
  width: 60%;
  display: none;
}

/* 默认显示第一个内容 */
.partition-content.active {
  display: block;
}

/* 悬停第一个触发项时,显示对应内容 */
.partition-trigger:nth-child(1):hover ~ .partition-content:nth-child(4) {
  display: block;
}
.partition-trigger:nth-child(1):hover ~ .partition-content:not(:nth-child(4)) {
  display: none;
}

/* 悬停第二个触发项时,显示对应内容 */
.partition-trigger:nth-child(2):hover ~ .partition-content:nth-child(5) {
  display: block;
}
.partition-trigger:nth-child(2):hover ~ .partition-content:not(:nth-child(5)) {
  display: none;
}

/* 悬停第三个触发项时,显示对应内容 */
.partition-trigger:nth-child(3):hover ~ .partition-content:nth-child(6) {
  display: block;
}
.partition-trigger:nth-child(3):hover ~ .partition-content:not(:nth-child(6)) {
  display: none;
}

/* 保留原有的样式 */
.partition__title {
  padding: 80px 0;
  font-size: 24px;
  font-weight: 700;
  margin-bottom: -80px;
}

.partition__text {
  font-size: 16px;
  line-height: 1.5;
}

.border-button {
  text-decoration: none;
  font-family: "athens";
  display: inline-block;
  position: relative;
  padding: 12px 8px;
  color: #000;
  overflow: hidden;
  cursor: pointer;
  background-image: linear-gradient(to right, #000 33%, #0000 33% 66%, #000 66%);
  background-position: right bottom;
  background-size: 300% 1px;
  background-repeat: no-repeat;
}

.border-button:hover {
  background-position: left bottom;
  transition: background-position 1s;
}

a:hover {
  color: black;
}

CSS方案局限

  • 必须严格固定触发项和内容区的HTML顺序,新增内容时需要手动添加对应的CSS选择器;
  • 鼠标离开触发项后,内容会回到默认状态,无法保持选中效果(除非结合:focus,但需要点击触发)。

二、JavaScript方案(灵活通用)

JS方案不需要依赖固定结构,扩展性强,还能轻松扩展点击选中、状态保持等功能。

调整后的HTML

<div class="partitions__wrapper">
  <div class="partition-nav">
    <div class="partition-nav-item" data-content="interior">Interior Design</div>
    <div class="partition-nav-item" data-content="supervision">Author's Supervision</div>
    <div class="partition-nav-item" data-content="other">Other Service</div>
  </div>

  <div class="partition-content-wrapper">
    <div class="partition-content" id="interior">
      <h2 class="partition__title">Interior Design</h2>
      <p class="partition__text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
      <a class="border-button">See more</a>
    </div>
    <div class="partition-content" id="supervision">
      <h2 class="partition__title">Author's Supervision</h2>
      <p class="partition__text">Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
      <a class="border-button">See more</a>
    </div>
    <div class="partition-content" id="other">
      <h2 class="partition__title">Other Service</h2>
      <p class="partition__text">Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
      <a class="border-button">See more</a>
    </div>
  </div>
</div>

配套CSS

.partitions__wrapper {
  background-color: #f5f5f5;
  padding: 50px;
  text-align: center;
}

.partition-nav {
  margin-bottom: 40px;
}

.partition-nav-item {
  display: inline-block;
  margin: 0 20px;
  padding: 10px;
  cursor: pointer;
  font-weight: 500;
  transition: color 0.3s;
}

.partition-nav-item:hover {
  color: #666;
}

.partition-content {
  display: none;
  width: 60%;
  margin: 0 auto;
}

/* 默认显示第一个内容 */
.partition-content.active {
  display: block;
}

/* 保留原有的样式 */
.partition__title {
  padding: 80px 0;
  font-size: 24px;
  font-weight: 700;
  margin-bottom: -80px;
}

.partition__text {
  font-size: 16px;
  line-height: 1.5;
}

.border-button {
  text-decoration: none;
  font-family: "athens";
  display: inline-block;
  position: relative;
  padding: 12px 8px;
  color: #000;
  overflow: hidden;
  cursor: pointer;
  background-image: linear-gradient(to right, #000 33%, #0000 33% 66%, #000 66%);
  background-position: right bottom;
  background-size: 300% 1px;
  background-repeat: no-repeat;
}

.border-button:hover {
  background-position: left bottom;
  transition: background-position 1s;
}

a:hover {
  color: black;
}

JavaScript代码

// 获取所有导航项和内容项
const navItems = document.querySelectorAll('.partition-nav-item');
const contentItems = document.querySelectorAll('.partition-content');

// 默认激活第一个内容
contentItems[0].classList.add('active');

// 给每个导航项绑定hover事件
navItems.forEach(item => {
  item.addEventListener('mouseover', () => {
    // 移除所有内容的激活状态
    contentItems.forEach(content => content.classList.remove('active'));
    // 获取当前导航项对应的内容ID
    const targetId = item.getAttribute('data-content');
    // 激活对应内容
    document.getElementById(targetId).classList.add('active');
  });
});

JS方案优势

  • 不依赖HTML结构顺序,新增内容只需添加对应导航项和内容区,无需修改JS逻辑;
  • 可轻松扩展功能,比如点击导航项保持选中状态、添加过渡动画等;
  • 交互逻辑更灵活,能处理复杂的状态切换需求。

内容的提问来源于stack exchange,提问作者Elia d'Albenzio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:32:05