CSS3的3D变换能力让网页可以实现丰富的立体交互效果,卡片3D翻转展开是其中非常典型的应用场景。要实现自然的翻转效果,除了基础的transform属性外,transform-origin的作用是控制元素变换的轴心点,直接决定翻转的方向和视觉效果。

transform-origin基础概念
transform-origin用于设置元素变换的原点,默认值是元素中心点(50% 50% 0)。该属性可以接收1到3个值,分别对应X轴、Y轴、Z轴的原点位置,支持百分比、长度单位和关键词(left、right、top、bottom等)。
在3D翻转场景中,transform-origin的设置会直接影响翻转的轴心:比如设置X轴为left,元素就会以左侧为轴进行翻转;设置Y轴为top,元素就会以上侧为轴进行翻转。
基础卡片3D翻转实现
首先我们需要搭建基础的卡片结构,包含正面和背面两个面,通过父容器控制3D空间和翻转逻辑。
<div class="card-container">
<div class="card">
<div class="card-front">
<h3>卡片正面</h3>
<p>点击卡片查看背面内容</p>
</div>
<div class="card-back">
<h3>卡片背面</h3>
<p>这里是卡片的详细信息内容</p>
</div>
</div>
</div>
接下来是核心的CSS样式,首先要给父容器设置perspective属性,创建3D透视空间,再给卡片容器设置transform-style: preserve-3d,让子元素保持3D空间关系。
/* 卡片容器,设置透视距离 */
.card-container {
width: 300px;
height: 200px;
perspective: 1000px;
margin: 50px auto;
}
/* 卡片主体,设置3D变换保留 */
.card {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transition: transform 0.8s ease;
/* 默认翻转轴心为左侧,可根据需求调整 */
transform-origin: left center;
}
/* 卡片正反面公共样式 */
.card-front, .card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 20px;
box-sizing: border-box;
}
/* 正面样式 */
.card-front {
background-color: #409eff;
color: white;
}
/* 背面样式,初始旋转180度隐藏 */
.card-back {
background-color: #67c23a;
color: white;
transform: rotateY(180deg);
}
/* 触发翻转的类 */
.card.flipped {
transform: rotateY(180deg);
}
给卡片容器添加点击事件,切换flipped类即可实现基础的翻转效果。此时transform-origin设置为left center,卡片会以左侧为轴进行Y轴翻转。
transform-origin的不同取值效果
我们可以通过调整transform-origin的取值,实现不同方向的翻转效果,以下是常见的几种配置:
| transform-origin取值 | 翻转轴心 | 视觉效果 |
|---|---|---|
| left center | 左侧中点 | 卡片以左侧为轴,像翻书一样向右翻转 |
| right center | 右侧中点 | 卡片以右侧为轴,向左翻转 |
| center top | 顶部中点 | 卡片以顶部为轴,向下翻转 |
| center bottom | 底部中点 | 卡片以底部为轴,向上翻转 |
| 50% 50% 0 | 中心点 | 卡片以中心为轴,原地旋转 |
展开效果的实现
如果需要实现卡片翻转后展开显示更多内容的效果,可以结合scale属性和transform-origin配合。比如翻转后让卡片宽度展开,同时调整轴心保证展开方向正确。
/* 翻转后展开卡片 */
.card.flipped {
transform: rotateY(180deg) scaleX(1.5);
/* 展开时轴心调整为左侧,保证展开方向向右 */
transform-origin: left center;
}
如果希望翻转的同时从中心向两侧展开,可以将transform-origin设置为center center,同时调整scale的变换逻辑:
.card.flipped {
transform: rotateY(180deg) scaleX(1.5);
transform-origin: center center;
}
注意事项
- perspective属性需要设置在翻转元素的父容器上,不能设置在翻转元素本身,否则无法形成正确的3D透视效果。
- backface-visibility: hidden是必须的,否则翻转后背面内容会透过正面显示。
- transform-origin的取值如果包含Z轴,需要注意单位,Z轴的长度会影响3D变换的纵深效果。
- 翻转动画的transition属性建议设置在变换元素本身,而不是hover或触发类上,避免动画异常。
完整示例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS卡片3D翻转展开</title>
<style>
.card-container {
width: 300px;
height: 200px;
perspective: 1000px;
margin: 50px auto;
cursor: pointer;
}
.card {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transition: transform 0.8s ease;
transform-origin: left center;
}
.card-front, .card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 20px;
box-sizing: border-box;
}
.card-front {
background-color: #409eff;
color: white;
}
.card-back {
background-color: #67c23a;
color: white;
transform: rotateY(180deg);
}
.card.flipped {
transform: rotateY(180deg) scaleX(1.5);
}
</style>
</head>
<body>
<div class="card-container" onclick="this.querySelector('.card').classList.toggle('flipped')">
<div class="card">
<div class="card-front">
<h3>卡片正面</h3>
<p>点击卡片查看背面内容</p>
</div>
<div class="card-back">
<h3>卡片背面</h3>
<p>这里是卡片的详细信息内容,翻转后展开显示更多区域</p>
</div>
</div>
</div>
</body>
</html>
通过调整transform-origin的取值,我们可以灵活控制卡片3D翻转的轴心,结合其他transform属性就能实现各种符合需求的翻转展开效果,适配不同的页面交互场景。
CSStransform-origin3D翻转卡片动画修改时间:2026-07-07 23:48:17