先记住这个答案
CSS 里的元素是有正反两面的。默认情况下,一个元素被 rotateY(180deg) 翻过去后,背面会像镜子一样显示正面内容的水平镜像。用户看到的文字是反的、按钮位置也反了,体验很差。backface-visibility: hidden 就是告诉浏览器:当这个元素的背面朝向用户时,不要渲染它。配合两个叠在一起的元素——一个做正面、一个做反面——同时翻转,就实现了卡片翻转效果。
- 默认背面可见,显示内容的镜像
hidden让背面完全不可见- 立体翻转需保留 3D 子元素
- 正反两面都要加这个属性
完整的卡片翻转结构
卡片翻转至少需要三层:外层容器、正面、反面。外层容器负责提供 3D 空间和翻转动作,正面和反面重叠在一起,各管各的显示与隐藏。
<!-- 结构:容器 > 正面 + 反面 -->
<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 之间比较自然,具体取决于元素尺寸。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。