在复习css的时候,发现自己使用的比较生疏,所以写一个css小项目。练一练手
这个三维立体的筛子主要的功能是,旋转
使用到css中的一些样式,有:flex弹性盒子、animation动画来完成
首先是没有注释版本
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="index.css">
<title>一个三维立体旋转的骰子</title>
</head>
<body>
<div id="wrap">
<div class="box">
<div class="one">
<span></span>
</div>
<div class="two">
<span></span>
<span></span>
</div>
<div class="three">
<span></span>
<span></span>
<span></span>
</div>
<div class="four">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
<div class="five">
<span></span>
<span></span>
<div><span></span></div>
<span></span>
<span></span>
</div>
<div class="six">
<div>
<span></span>
<span></span>
<span></span>
</div>
<div>
<span></span>
<span></span>
<span></span>
</div>
</div>
</div>
</div>
</body>
</html>
这是html代码
下面是css代码:
body{
background: pink;
margin: 0;
}
#wrap{
perspective: 1000px;
}
.box{
width: 200px;
height: 200px;
margin: 300px auto;
position: relative;
transform-style: preserve-3d;
transform: rotateX(30deg) rotateY(30deg) rotateZ(30deg);
animation: circle 10s 4.5s linear infinite;
}
.box >div{
width: 100%;
height: 100%;
padding: 20px;
box-sizing: border-box;
background: #e7e7e7;
border-radius: 5px;
box-shadow: 0 0 10px #bbb;
position: absolute;
left: 0;
top: 0;
display: flex;
justify-content: space-between;
}
.box div span{
width: 50px;
height: 50px;
border-radius: 50%;
background: #d82828;
box-shadow: inset 0 5px #b60505, inset 0 -5px #fa5d5d;
}
.box >div.one{
justify-content: center;
align-items: center;
transform: rotateY(0deg) translateZ(100px);
animation: oneFly 4s;
}
@keyframes oneFly {
0%{
transform: rotateY(90deg) translateZ(300px);
opacity: 0;
}
12.5%{
transform: rotateY(0deg) translateZ(300px);
opacity: 1;
}
75%{
transform: rotateY(0deg) translateZ(300px);
}
87.5%{
transform: rotateY(0deg) translateZ(300px);
}
100%{
transform: rotateY(0deg) translateZ(100px);
}
}
.two{
transform: rotateY(-90deg) translateZ(-100px);
animation: twoFly 4s;
}
@keyframes twoFly {
0%{
transform: rotateY(0deg) translateZ(-300px);
opacity: 0;
}
12.5%{
transform: rotateY(0deg) translateZ(-300px);
opacity: 0;
}
25%{
transform: rotateY(-90deg) translateZ(-300px);
opacity: 1;
}
75%{
transform: rotateY(-90deg) translateZ(-300px);
}
87.5%{
transform: rotateY(-90deg) translateZ(-300px);
}
100%{
transform: rotateY(-90deg) translateZ(-100px);
}
}
.two span:nth-child(2){
align-self: flex-end;
}
.three{
transform: rotateY(0deg) translateZ(-100px);
animation: threeFly 4s;
}
@keyframes threeFly{
0%{
transform: rotateY(90deg) translateZ(-300px);
opacity: 0;
}
25%{
transform: rotateY(90deg) translateZ(-300px);
opacity: 0;
}
37.5%{
transform: rotateY(0deg) translateZ(-300px);
opacity: 1;
}
75%{
transform: rotateY(0deg) translateZ(-300px);
}
87.5%{
transform: rotateY(0deg) translateZ(-300px);
}
100%{
transform: rotateY(0deg) translateZ(-100px);
}
}
.three span:nth-child(2){
align-self: center;
}
.three span:nth-last-child(1){
align-self: flex-end;
}
.four{
flex-wrap: wrap;
align-content: space-between;
transform:rotateY(-90deg) translateZ(100px);
animation: fourFly 4s;
}
@keyframes fourFly{
0%{
transform: rotateY(0deg) translateZ(300px);
opacity: 0;
}
37.5%{
transform: rotateY(0deg) translateZ(300px);
opacity: 0;
}
50%{
transform: rotateY(-90deg) translateZ(300px);
opacity: 1;
}
75%{
transform: rotateY(-90deg) translateZ(300px);
}
87.5%{
transform: rotateY(-90deg) translateZ(300px);
}
100%{
transform: rotateY(-90deg) translateZ(100px);
}
}
.four span:nth-child(3){
margin-right: 35px;
}
.five{
flex-wrap: wrap;
align-content: space-between;
transform: rotateX(-90deg) translateZ(-100px);
animation: fiveFly 4s;
}
@keyframes fiveFly{
0%{
transform: rotateX(90deg) translateZ(-300px);
opacity: 0;
}
50%{
transform: rotateX(90deg) translateZ(-300px);
opacity: 0;
}
75%{
transform: rotateX(-90deg) translateZ(-300px);
opacity: 1;
}
87.5%{
transform: rotateX(-90deg) translateZ(-300px);
}
100%{
transform: rotateX(-90deg) translateZ(-100px);
}
}
.five div{
width: 100%;
display: flex;
justify-content: center;
}
.six{
transform: rotateX(-90deg) translateZ(100px);
animation: sixFly 4s;
}
@keyframes sixFly{
0%{
transform: rotateX(90deg) translateZ(300px);
opacity: 0;
}
62.5%{
transform: rotateX(90deg) translateZ(300px);
opacity: 0;
}
75%{
transform: rotateX(-90deg) translateZ(300px);
opacity: 1;
}
87.5%{
transform: rotateX(-90deg) translateZ(300px);
}
100%{
transform: rotateX(-90deg) translateZ(100px);
}
}
.six div{
display: flex;
flex-direction: column;
justify-content: space-between;
}
@keyframes circle{
0%{
transform: rotateX(30deg) rotateY(30deg) rotateZ(30deg);
}
100%{
transform: rotateX(390deg) rotateY(390deg) rotateZ(390deg);
}
}
下面是css注释版本:
body{
background: pink;
/* 设置背景颜色 少女粉 */
margin: 0;
}
#wrap{
perspective: 1000px;
}
.box{
width: 200px;
height: 200px;
margin: 300px auto;
position: relative;
transform-style: preserve-3d;
/* 三维空间 */
transform: rotateX(30deg) rotateY(30deg) rotateZ(30deg);
/* 使用transform将这些筛子从重叠转变为立体的 */
animation: circle 10s 4.5s linear infinite;
/* 调用circle 让这个筛子旋转起来 */
}
.box >div{
width: 100%;
height: 100%;
padding: 20px;
box-sizing: border-box;
background: #e7e7e7;
border-radius: 5px;
box-shadow: 0 0 10px #bbb;
position: absolute;
left: 0;
top: 0;
display: flex;
justify-content: space-between;
/* 两端对齐 */
}
.box div span{
/* 主要是筛子的红点 */
width: 50px;
height: 50px;
border-radius: 50%;
/* 将筛子设置为有圆角的正方体 */
background: #d82828;
box-shadow: inset 0 5px #b60505, inset 0 -5px #fa5d5d;
/* 红点内设置阴影 */
}
/* 这里不直接使用.one的原因是覆盖.box >div 这样才能得到你想要的结果 */
.box >div.one{
justify-content: center;
/* 水平方向居中 */
align-items: center;
/* 垂直方向对齐 */
transform: rotateY(0deg) translateZ(100px);
/* 将筛子面为1的设置为打开页面第一眼的初始面 */
animation: oneFly 4s;
}
/* 在这里将旋转前的每个面集合分为8个步骤
1.分别是六个面依次从初始位置转到目标位置需要六个步骤
2.这六个面全部都出来之后,有一部是这些面合起来形成筛子,形成筛子之后停顿一下,所以分了8个步骤 每个关键帧的占比是100/8
*/
@keyframes oneFly {
0%{
transform: rotateY(90deg) translateZ(300px);
opacity: 0;
}
12.5%{
transform: rotateY(0deg) translateZ(300px);
opacity: 1;
}
75%{
transform: rotateY(0deg) translateZ(300px);
}
87.5%{
transform: rotateY(0deg) translateZ(300px);
}
100%{
transform: rotateY(0deg) translateZ(100px);
}
}
.two{
transform: rotateY(-90deg) translateZ(-100px);
animation: twoFly 4s;
}
@keyframes twoFly {
0%{
transform: rotateY(0deg) translateZ(-300px);
opacity: 0;
}
12.5%{
transform: rotateY(0deg) translateZ(-300px);
opacity: 0;
}
25%{
transform: rotateY(-90deg) translateZ(-300px);
opacity: 1;
}
75%{
transform: rotateY(-90deg) translateZ(-300px);
}
87.5%{
transform: rotateY(-90deg) translateZ(-300px);
}
100%{
transform: rotateY(-90deg) translateZ(-100px);
}
}
.two span:nth-child(2){
align-self: flex-end;
/* 对齐红点 */
}
.three{
transform: rotateY(0deg) translateZ(-100px);
animation: threeFly 4s;
}
@keyframes threeFly{
0%{
transform: rotateY(90deg) translateZ(-300px);
opacity: 0;
}
25%{
transform: rotateY(90deg) translateZ(-300px);
opacity: 0;
}
37.5%{
transform: rotateY(0deg) translateZ(-300px);
opacity: 1;
}
75%{
transform: rotateY(0deg) translateZ(-300px);
}
87.5%{
transform: rotateY(0deg) translateZ(-300px);
}
100%{
transform: rotateY(0deg) translateZ(-100px);
}
}
.three span:nth-child(2){
align-self: center;
}
.three span:nth-last-child(1){
align-self: flex-end;
}
.four{
flex-wrap: wrap;
/* 给红点换行 */
align-content: space-between;
/* 两端对齐 */
transform:rotateY(-90deg) translateZ(100px);
animation: fourFly 4s;
}
@keyframes fourFly{
0%{
transform: rotateY(0deg) translateZ(300px);
opacity: 0;
}
37.5%{
transform: rotateY(0deg) translateZ(300px);
opacity: 0;
}
50%{
transform: rotateY(-90deg) translateZ(300px);
opacity: 1;
}
75%{
transform: rotateY(-90deg) translateZ(300px);
}
87.5%{
transform: rotateY(-90deg) translateZ(300px);
}
100%{
transform: rotateY(-90deg) translateZ(100px);
}
}
.four span:nth-child(3){
margin-right: 35px;
}
.five{
flex-wrap: wrap;
align-content: space-between;
transform: rotateX(-90deg) translateZ(-100px);
animation: fiveFly 4s;
}
@keyframes fiveFly{
0%{
transform: rotateX(90deg) translateZ(-300px);
opacity: 0;
}
50%{
transform: rotateX(90deg) translateZ(-300px);
opacity: 0;
}
75%{
transform: rotateX(-90deg) translateZ(-300px);
opacity: 1;
}
87.5%{
transform: rotateX(-90deg) translateZ(-300px);
}
100%{
transform: rotateX(-90deg) translateZ(-100px);
}
}
.five div{
width: 100%;
display: flex;
justify-content: center;
}
.six{
transform: rotateX(-90deg) translateZ(100px);
animation: sixFly 4s;
}
@keyframes sixFly{
0%{
transform: rotateX(90deg) translateZ(300px);
opacity: 0;
}
62.5%{
transform: rotateX(90deg) translateZ(300px);
opacity: 0;
}
75%{
transform: rotateX(-90deg) translateZ(300px);
opacity: 1;
}
87.5%{
transform: rotateX(-90deg) translateZ(300px);
}
100%{
transform: rotateX(-90deg) translateZ(100px);
}
}
.six div{
display: flex;
flex-direction: column;
/* 将div排列方式设置为竖列排 */
justify-content: space-between;
}
@keyframes circle{
0%{
transform: rotateX(30deg) rotateY(30deg) rotateZ(30deg);
}
100%{
transform: rotateX(390deg) rotateY(390deg) rotateZ(390deg);
}
}