vue3实现立方体

vue3

CSS 的强大是你想象不到的,最近做一个 vue3 的项目,正好写个组件来温故一下。使用 CSS 实现一个正方体也使用一下 vue3 新增的 css 变量。

正方体效果图
代码如下

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<template>
<ul :class="['cube', { 'turn-on': spread }, { rotate: rotate }]">
<template
v-for="i in [1, 2, 3, 4, 5, 6]"
:key="i">
<li class="surface">
<slot :name="`surface${i}`">{{ i }}</slot>
</li>
</template>
<li>
<slot></slot>
</li>
</ul>
</template>
<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
name: 'Cube',
props: {
// 棱长
theLen: {
type: String,
default: '200px',
},
// 鼠标悬浮偏移距离
offset: {
type: String,
default: '50px',
},
//鼠标悬浮是否可以打开
spread: {
type: Boolean,
default: false,
},
// 旋转动画
rotate: {
type: Boolean,
default: false,
},
// 角度
angle: {
type: String,
default: '45deg',
},
},
});
</script>
<style lang="scss" scoped>
.cube {
position: relative;
list-style-type: none;
width: v-bind(theLen);
height: v-bind(theLen);
transform: rotate3d(1, 1, 1, v-bind(angle));
transform-style: preserve-3d;
&.rotate {
animation: rotate 10s infinite linear both;
}
& > li {
position: absolute;
top: 0;
left: 0;
width: v-bind(theLen);
height: v-bind(theLen);
&.surface {
border: 1px solid #000;
}
}
& > .surface:nth-of-type(1) {
transform: translateZ(calc(v-bind(theLen) / 2));
}
& > .surface:nth-of-type(2) {
transform: rotateY(90deg) translateZ(calc(v-bind(theLen) / 2));
}
& > .surface:nth-of-type(3) {
transform: rotateY(360deg) translateZ(calc(-1 * v-bind(theLen) / 2));
}
& > .surface:nth-of-type(4) {
transform: rotateY(90deg) translateZ(calc(-1 * v-bind(theLen) / 2));
}
& > .surface:nth-of-type(5) {
height: v-bind(theLen);
transform: rotateX(-90deg) translateZ(calc(-1 * v-bind(theLen) / 2));
}
& > .surface:nth-of-type(6) {
height: v-bind(theLen);
transform: rotateX(90deg) translateZ(calc(-1 * v-bind(theLen) / 2));
}
& > li:nth-of-type(7) {
display: flex;
justify-content: center;
align-items: center;
border: 1px solid transparent;
}
&.turn-on:hover > .surface:nth-of-type(1) {
transform: translateZ(calc(v-bind(offset) + v-bind(theLen) / 2));
}
&.turn-on:hover > .surface:nth-of-type(2) {
transform: rotateY(90deg) translateZ(
calc(v-bind(offset) + v-bind(theLen) / 2)
);
}
&.turn-on:hover > .surface:nth-of-type(3) {
transform: rotateY(360deg) translateZ(
calc(-1 * v-bind(theLen) / 2 - v-bind(offset))
);
}
&.turn-on:hover > .surface:nth-of-type(4) {
transform: rotateY(90deg) translateZ(
calc(-1 * v-bind(offset) - v-bind(theLen) / 2)
);
}
&.turn-on:hover > .surface:nth-of-type(5) {
height: v-bind(theLen);
transform: rotateX(90deg) translateZ(
calc(-1 * v-bind(offset) - v-bind(theLen) / 2)
);
}
&.turn-on:hover > .surface:nth-of-type(6) {
height: v-bind(theLen);
transform: rotateX(-90deg) translateZ(
calc(-1 * v-bind(offset) - v-bind(theLen) / 2)
);
}
}

@keyframes rotate {
from {
transform: rotate3d(1, 1, 1, 0deg);
}
to {
transform: rotate3d(1, 1, 1, 360deg);
}
}
</style>
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%