前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS backface-visibility 卡片翻转
CSS动画与视觉

做 3D 卡片翻转效果时,backface-visibility 解决的是什么问题?

一个元素被 rotateY(180deg) 翻过去以后,默认会显示自身内容的镜像——就像透过玻璃从背面看。backface-visibility: hidden 的作用是把这个背面藏起来,翻过去就完全不可见,这样正面和反面各放一个元素,同时翻转,就能实现卡片翻转效果。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#动画与视觉#动画
先看核心答案读代码示例
理解线索

3D 卡片的三个角色

  1. 父容器设 perspective 提供透视效果,transform-style: preserve-3d 保留子元素 3D 空间
  2. 正面默认朝前,backface-visibility: hidden 翻到背后时自动隐藏
  3. 反面初始就 rotateY(180deg) 翻过去,翻回来时才可见

如果漏了 transform-style: preserve-3d,子元素会被压扁回 2D,翻转时就不会有 3D 效果。

核心回答

先记住这个答案

CSS 里的元素是有正反两面的。默认情况下,一个元素被 rotateY(180deg) 翻过去后,背面会像镜子一样显示正面内容的水平镜像。用户看到的文字是反的、按钮位置也反了,体验很差。backface-visibility: hidden 就是告诉浏览器:当这个元素的背面朝向用户时,不要渲染它。配合两个叠在一起的元素——一个做正面、一个做反面——同时翻转,就实现了卡片翻转效果。

  • 默认背面可见,显示内容的镜像
  • hidden 让背面完全不可见
  • 立体翻转需保留 3D 子元素
  • 正反两面都要加这个属性

完整的卡片翻转结构

卡片翻转至少需要三层:外层容器、正面、反面。外层容器负责提供 3D 空间和翻转动作,正面和反面重叠在一起,各管各的显示与隐藏。

正面和反面同时翻转HTML
<!-- 结构:容器 > 正面 + 反面 -->
<div class="card">
  <div class="card-front">正面内容</div>
  <div class="card-back">反面内容</div>
</div>

<style>
.card {
  width: 300px; height: 200px;
  perspective: 800px;                  /* 给子元素提供透视感 */
}
.card-front, .card-back {
  position: absolute; width: 100%; height: 100%;
  backface-visibility: hidden;         /* 两面都要加 */
  transition: transform 0.6s;
}
.card-back {
  transform: rotateY(180deg);          /* 反面初始就翻过去 */
}
.card:hover .card-front { transform: rotateY(180deg); }
.card:hover .card-back  { transform: rotateY(0deg);   }
</style>

初始状态:正面朝前显示,反面已经翻了 180 度,因为 backface-visibility: hidden,反面此时不可见。hover 时两面同时翻转 180 度,正面转到背后隐藏,反面转回来显示。 这里 perspective 写在父容器上而不是子元素上。写在父容器上,所有子元素共享同一个透视点,视觉更自然。如果改成子元素各自 perspective(800px),每个元素有自己的透视点,翻转时会看起来不协调。

transform-style: preserve-3d 的作用

上面的例子里还漏了一个关键属性。如果不在正面和反面的共同父元素上设 transform-style: preserve-3d,子元素会被压平回 2D 平面,翻转时就看不到 3D 效果。

这个属性的意思是「保留子元素在 3D 空间中的位置」。默认值 flat 会把子元素的 3D 变换投影到父元素的平面上,看起来就像照片而不是立体的。实际写代码时经常会发现翻转没效果,大概率就是漏了这个属性。

还有一个注意点:overflow: hidden 会破坏 preserve-3d。如果父容器设了 overflow: hidden,子元素的 3D 效果会被压平。这个坑在做卡片翻转时特别容易踩到。

回答前,多想一步

容易答错的地方

只给一面加 backface-visibility: hidden
正面和反面都要加。如果只给反面加,翻转后正面转到背后时还是可见的,两面内容会叠在一起。
把 perspective 写在被翻转的元素自身上
perspective 要写在翻转元素的父容器上,或者用 transform: perspective(800px) rotateY(180deg) 写在变换函数里。但如果直接写 perspective: 800px 在被翻转的元素上,它只影响该元素的子元素,对元素自身的翻转没有效果。
忘了翻转时的层叠顺序
翻转过程中,正面和反面可能会在 z-index 上打架。正面翻到一半时两者在同一个平面上,可能出现闪烁。给反面加一个较低的 z-index,或者确保翻转角度正好是 180 度的倍数,可以避免这个问题。
试着用自己的话回答

面试官还会怎么问?

不用 backface-visibility 能实现卡片翻转吗?

能,但麻烦。用 JS 监听 transitionend,在翻转到一半时手动切换 display: none 和 display: block。或者用两个 @keyframes 在 50% 的时候分别隐藏和显示。这些写法比 backface-visibility: hidden 复杂得多,也更容易出 bug。

backface-visibility: hidden 会影响性能吗?

会,但通常是正向的。设了这个属性的元素会被提升到独立合成层,翻转时不触发重排和重绘,GPU 直接处理。但如果页面上大量元素都加了这个属性,合成层太多反而会增加 GPU 内存占用。

perspective 的值大小有什么影响?

值越小,透视效果越强烈——元素翻转时近大远小的变形越夸张。值越大,接近正交投影,翻转看起来比较平。通常 600px 到 1200px 之间比较自然,具体取决于元素尺寸。

从一道题,走向一组知识

把知识连起来

动画与视觉

什么情况下元素会被提升为独立合成层?will-change 怎么用才对?

3D 变换会触发合成层提升,和 will-change 的提升逻辑属于同一套机制。

动画与视觉

conic-gradient 和 repeating-conic-gradient 有什么区别?怎么用它们画饼图?

锥形渐变可以做圆形仪表盘,配合卡片翻转能实现「翻面看详情」的数据展示。

参考资料

  • CSS:动画与视觉参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 完整的卡片翻转结构
  3. transform-style: preserve-3d 的作用
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑