如果想最快获得方案和代码,可以问 GPT,真的非常快~
如果想了解具体的步骤,咱们继续
准备
实现翻牌效果,主要是利用 CSS 的transform
实现 3D 旋转,利用transition
实现动画效果。 核心的属性有:
perspective
perspective
属性,设置了元素在 3D 空间中的视觉效果。
使用了这个属性,在翻转动画中会出现透视的效果,这样效果看起来更符合日常透视的直觉。
MDN:
perspective
指定了观察者与 z=0
平面的距离,使具有三维位置变换的元素产生透视效果。 z>0
的三维元素比正常大,而 z<0
时则比正常小,大小程度由该属性的值决定。
三维元素在观察者后面的部分不会绘制出来,即 z
轴坐标值大于 perspective
属性值的部分。默认情况下,消失点位于元素的中心。
transform-style
属性,设置元素的子元素是位于 3D
空间中还是平面中。
如果不设置这个属性,默认会在平面空间中。这样在翻牌效果中背面的容器就不会显示出来。因为正反面不会形成 3D 空间中的遮挡关系。
backface-visibility
backface-visibility
属性,指定当元素背面朝向观察者时是否可见。
MDN:
元素的背面是其正面的镜像。虽然在 2D
中不可见,但是当变换导致元素在 3D
空间中旋转时,背面可以变得可见。 (此属性对 2D 变换没有影响,它没有透视。)
这个属性在正面和反面设置了不透明度的时候会有明显可观测的效果。它有 2 个值:
hidden
当元素背面朝向观察者时不可见visible
当元素背面朝向观察者时可见
思路
结构我们遵循:套,器,正,反。 即外层有一个容器做包裹的套子,用来响应鼠标事件。当然,如果是通过js
动态添加class
的形式实现的。可以不要这个套子。 接下来,需要一个牌的容器。最后是正面和反面的两个容器。如果不想使用这么多元素,利用伪元素也可以实现。
实现
首先来看看利用多个元素的实现方式:
<div class="box">
<div class="cover">
<div class="side front">正面</div>
<div class="side back">反面</div>
</div>
</div>
.box {
width: 100px;
height: 100px;
perspective: 800px;
background: #f2f2f2;
.cover {
width: 100px;
height: 100px;
position: relative;
transform-style: preserve-3d;
transition-property: transform;
transition-duration: 1.5s;
transition-timing-function: liner;
color: white;
.side {
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 100px;
backface-visibility: hidden;
position: absolute;
top: 0;
left: 0;
}
.front {
background: #220077;
}
.back {
background: #228877;
transform: rotateY(180deg);
}
}
&:hover {
.cover {
transform: rotateY(180deg);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
为什么需要一个外层的包裹容器?
主要是为了响应鼠标交互能够丝滑一些,例如hover
时候进行翻转。如果没有外层封套,则在卡牌旋转的时候的同时鼠标位于边缘,可能会出现失去响应的情况。
效果
伪元素效果
如果正面和反面的内容只是图片和十分简单的文本,那么使用伪元素也可以实现,并且可以节约 2 个元素:
<div class="box">
<div class="cover"></div>
</div>
.box {
width: 100px;
height: 100px;
perspective: 800px;
background: #f2f2f2;
.cover {
width: 100px;
height: 100px;
position: relative;
transform-style: preserve-3d;
transition-property: transform;
transition-duration: 1.5s;
transition-timing-function: liner;
color: white;
cursor: pointer;
user-select: none;
&::before,
&::after {
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 100px;
backface-visibility: hidden;
position: absolute;
top: 0;
left: 0;
}
&::before {
content: "\6b63\9762";
background: #220077;
}
&:after {
content: "\53cd\9762";
background: #228877;
transform: rotateY(180deg);
}
}
&:hover {
.cover {
transform: rotateY(180deg);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
效果如下:
参考