🎴 卡片翻转

使用 rotateY、perspective 和 backface-visibility 实现流畅的 3D 卡片翻转效果

使用的知识点: 🔄 rotateY() 👁️ perspective 🎭 backface-visibility 📦 transform-style

交互演示

体验两种不同的触发方式:悬停翻转和点击翻转

💡 提示:将鼠标悬停在第一张卡片上,或点击第二、三张卡片查看翻转效果

Hover
🎨

设计服务

悬停查看详情

Hover

专业设计

我们提供 UI/UX 设计、品牌设计和视觉设计服务,帮助您的产品脱颖而出。

Click
💻

开发服务

点击查看详情

👆 点击翻转
Click
🚀

全栈开发

从前端到后端,我们提供完整的 Web 应用开发解决方案,技术栈现代化。

👆 再次点击
Click
📱

移动应用

点击查看详情

👆 点击翻转
Click
📲

跨平台开发

使用 React Native 和 Flutter 开发高性能的跨平台移动应用。

👆 再次点击

实现步骤

步骤 1:HTML 结构

创建卡片的三层结构:容器、内部翻转层、正反面:

HTML
<!-- 卡片容器 -->
<div class="flip-card">
  <!-- 内部翻转层 -->
  <div class="flip-card-inner">
    <!-- 正面 -->
    <div class="flip-card-face flip-card-front">
      <h3>卡片标题</h3>
      <p>卡片描述</p>
    </div>

    <!-- 背面 -->
    <div class="flip-card-face flip-card-back">
      <h3>背面标题</h3>
      <p>背面内容</p>
    </div>
  </div>
</div>

步骤 2:设置 3D 空间

在容器上设置 perspective,在内部层设置 transform-style:

CSS
/* 卡片容器 - 提供 3D 透视空间 */
.flip-card {
  width: 300px;
  height: 400px;
  perspective: 1000px;
  /* perspective 值越小,3D 效果越明显 */
}

/* 内部翻转层 - 保持 3D 空间 */
.flip-card-inner {
  position: relative;
  width: 100%;
  height: 100%;
  transition: transform 0.6s;
  transform-style: preserve-3d;
  /* preserve-3d 让子元素保持在 3D 空间中 */
}

步骤 3:设置正反面

使用绝对定位叠加正反面,并隐藏背面:

CSS
/* 正反面共同样式 */
.flip-card-face {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
  /* 隐藏元素的背面,避免翻转时看到镜像 */
}

/* 正面 */
.flip-card-front {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
}

/* 背面 - 初始旋转 180 度 */
.flip-card-back {
  background: white;
  color: #333;
  transform: rotateY(180deg);
  /* 背面预先旋转 180 度,这样翻转时才能正确显示 */
}

步骤 4:实现翻转效果

通过旋转内部层来实现翻转,支持 hover 和 click 两种触发方式:

CSS
/* Hover 触发翻转 */
.flip-card:hover .flip-card-inner {
  transform: rotateY(180deg);
}

/* Click 触发翻转(通过 JavaScript 添加 .flipped 类)*/
.flip-card.flipped .flip-card-inner {
  transform: rotateY(180deg);
}

步骤 5:JavaScript 交互(可选)

为点击触发的卡片添加交互逻辑:

JavaScript
// 获取所有点击触发的卡片
const clickCards = document.querySelectorAll('.flip-card.click-trigger');

// 为每张卡片添加点击事件
clickCards.forEach(card => {
  card.addEventListener('click', () => {
    card.classList.toggle('flipped');
  });
});

关键要点

← 返回实战应用列表