用HTML制作3d翻转卡片

用HTML制作3d翻转卡片

前言

在做商品展示、相册、个人名片页面时,立体翻转卡片能大幅提升页面高级感。很多同学实现翻牌效果会依赖 JavaScript 动画,其实只用原生 CSS3 3D 变换就能完成流畅立体翻面,代码轻量化、浏览器渲染性能更好,兼容性覆盖所有现代浏览器。

今天给大家分享一套完整可运行的 3D 翻转卡片 Demo,鼠标悬浮卡片自动沿 Y 轴 180° 立体翻转,正反面分别展示两张图片,自带圆角、阴影、丝滑过渡动画,零基础前端也能看懂,替换图片路径即可直接投入项目使用。

效果预览

页面使用 flex 实现卡片水平垂直居中,深色背景衬托卡片层次感;鼠标移入卡片后,卡片立体翻转,正面图片平滑切换为背面图片,翻转过程不会出现双面重叠、镜像穿透的 bug;图片自动铺满卡片不变形,圆角完整不溢出。

核心关键属性讲解

想要实现 3D 翻转,下面三个 CSS 属性缺一不可,也是整个案例的核心:

  1. perspective:设置在最外层父容器,代表人眼到卡片的透视距离,数值越小立体冲击感越强,示例中 800px 是兼顾美观与柔和的通用值;
  2. transform-style: preserve-3d:开启子元素 3D 渲染空间,不加这条属性,翻转会变成扁平 2D 旋转,丢失立体效果;
  3. backface-visibility: hidden:隐藏元素背面,解决翻转时正反面互相穿透、镜像重叠的问题; 辅助属性:transition搭配贝塞尔缓动函数,让翻转动画过渡更自然顺滑

完整可运行源码

html

预览

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>3D翻转卡片</title> <style> /* 页面全局:全屏居中卡片 */ body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #2c3e50; } /* 外层透视容器,承载景深 */ .card-container { width: 250px; height: 350px; perspective: 800px; cursor: pointer; } /* 翻转载体,开启3D空间+过渡动画 */ .card-inner { width: 100%; height: 100%; position: relative; transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1); transform-style: preserve-3d; } /* 鼠标悬浮触发180度翻转 */ .card-container:hover .card-inner { transform: rotateY(180deg); } /* 正反面公共样式 */ .card-front, .card-back { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; border-radius: 12px; box-shadow: 0 10px 20px rgba(0,0,0,0.3); overflow: hidden; } /* 图片铺满卡片,自适应不拉伸 */ .card-front img, .card-back img { width: 100%; height: 100%; object-fit: cover; } /* 背面默认旋转180°,初始隐藏 */ .card-back { transform: rotateY(180deg); } </style> </head> <body> <!-- 三层DOM结构:透视容器 → 旋转层 → 正反面 --> <div class="card-container"> <div class="card-inner"> <!-- 卡片正面图片 --> <div class="card-front"> <img src="img/20150307162556_ixeWE.thumb.1000_0.png"> </div> <!-- 卡片背面图片 --> <div class="card-back"> <img src="img/202003242142424_zgozk.jpg"> </div> </div> </div> </body> </html>

代码分层拆解

HTML 结构逻辑

整体采用三层嵌套结构,层级不能打乱:

  1. .card-container:最外层,唯一可以设置 perspective 透视的容器;
  2. .card-inner:旋转载体,所有翻转动画都作用在这一层;
  3. .card-front/.card-back:正反面,绝对定位完全重叠,分别承载两张图片。

CSS 逻辑分步解析

  1. 全局 body:清除默认边距,弹性布局实现卡片屏幕居中;
  2. 透视容器:定义卡片宽高、透视距离,鼠标悬浮显示手型;
  3. 旋转内层:开启 3D 空间,配置翻转过渡时长与缓动曲线;
  4. hover 交互:鼠标移入时,内层整体沿 Y 轴旋转 180 度;
  5. 正反面统一样式:隐藏背面、圆角、阴影,超出部分裁剪;
  6. 图片适配:object-fit:cover保证图片不变形铺满卡片;
  7. 背面初始状态:预先旋转 180°,默认处于视线后方隐藏。

自定义修改指南

拿到代码后可按需调整效果,常用修改位置如下:

  1. 修改卡片大小:调整.card-container的 width、height;
  2. 调整翻转快慢:修改transition后的0.8s,数值越小翻转越快;
  3. 改变 3D 立体强弱:修改perspective值,500px 立体感更强,2000px 更平缓;
  4. 替换正反面图片:直接修改 img 标签内的 src 图片地址;
  5. 修改圆角大小:调整border-radius: 12px
  6. 上下翻转效果:将rotateY全部替换为rotateX
  7. 调整阴影深浅:修改 box-shadow 内的透明度数值。

开发常见踩坑 & 解决方案

  1. 翻转是平面效果,没有 3D 立体感 解决:缺少transform-style: preserve-3d,添加到.card-inner;
  2. 翻转时两面图片互相穿透、能看到背面镜像 解决:正反面样式补充backface-visibility: hidden
  3. 图片超出卡片圆角,边缘直角外露 解决:给正反面容器添加overflow: hidden
  4. 完全看不到背面图片 解决:检查.card-back 是否添加transform: rotateY(180deg)
  5. 3D 透视失效 解决:perspective 必须写在最外层.card-container,不能写在内层旋转容器。

拓展升级思路

  1. 交互升级:添加少量 JS,实现点击翻转,适配移动端触摸操作;
  2. 布局拓展:使用 Grid / 弹性布局实现多卡片列表,用于商品相册;
  3. UI 丰富:在卡片背面增加文字、按钮、介绍信息;
  4. 特效增强:添加 hover 发光、滤镜渐变、轻微缩放动画;
  5. 样式美化:增加渐变底色、边框、文字遮罩层。

总结

这套 3D 翻转卡片完全依靠原生 CSS 实现,无第三方插件、无需 JavaScript,依靠浏览器合成层渲染动画,性能远优于 JS 动画,适配 PC 与移动端所有现代浏览器。

掌握 perspective、preserve-3d、backface-visibility 三个核心属性,就能吃透绝大多数 CSS 3D 翻转动画。代码开箱即用,仅需替换图片路径就能快速落地到相册、商品卡片、个人名片、活动宣传页等业务场景。