一个简单的 3D 卡片效果
嘛… 业务需求,就做了一下
HTML
HTML 结构很简单,一个 relative 的父元素,两个 absolute 的子元素(一个正面一个背面)
| 12
 3
 4
 5
 6
 
 | <div class="wrapper"><div id="card">
 <div class="front">这是正面哦</div>
 <div class="back">这是背面~</div>
 </div>
 </div>
 
 | 
CSS 基础样式
父元素长宽设定,居中
transform-style: preserve-3d;将变换舞台设置为 3d(有遮挡效果)
MDN 上时这样说的:
CSS 属性 transform-style 设置元素的子元素是位于 3D 空间中还是平面中。
如果选择平面,元素的子元素将不会有 3D 的遮挡关系。
由于这个属性不会被继承,因此必须为元素的所有非叶子子元素设置它
perspective: 500px;景深
perspective-origin: bottom;视角
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | #card {width: 400px;
 height: 180px;
 margin: 30px auto;
 position: relative;
 cursor: pointer;
 
 transform-style: preserve-3d;
 perspective: 500px;
 
 }
 
 | 
子元素的共同属性
transition设定过渡效果
backface-visibility: hidden;这个是为了被转到背面的元素不显示
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | .front,.back {
 width: 100%;
 height: 100%;
 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
 position: absolute;
 top: 0;
 left: 0;
 display: flex;
 justify-content: center;
 align-items: center;
 border-radius: 4px;
 
 transition: transform 0.5s;
 backface-visibility: hidden;
 }
 
 | 
子元素各自的属性
正面的元素初始不旋转
背面的元素初始旋转 180deg
设定一个好看的背景
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | .front {background: linear-gradient(135deg, #ddd 25%, transparent 25%) -10px 0, linear-gradient(
 225deg,
 #ddd 25%,
 transparent 25%
 ) -10px 0, linear-gradient(315deg, #ddd 25%, transparent 25%),
 linear-gradient(45deg, #ddd 25%, transparent 25%);
 background-size: calc(2 * 10px) calc(2 * 10px);
 
 transform: rotateY(0);
 }
 .back {
 background-image: linear-gradient(0deg, transparent 50%, skyblue 50%);
 background-size: 50px 50px;
 
 transform: rotateY(180deg);
 }
 
 | 
hover 触发旋转
hover 应该给父元素,给子元素的话,就转不回来了
| 12
 3
 4
 5
 6
 
 | #card:hover .front {transform: rotateY(180deg);
 }
 #card:hover .back {
 transform: rotateY(360deg);
 }
 
 | 
Codepen