准备工作
本次项目我们使用开发工具为HBuilderX
来进行
- 设置开发软件的主题为你自己合适的主题
- 设置快捷键为
VS Code
的快捷 - 本次项目需要准备素材图片
项目创建
使用HbuilderX 来创建项目,我们可以采取一种最简单的方式来创建项目
- 在电脑的桌面上面创建一个英文的文件夹,如
bgg
- 将之前准备好的素材文件夹
img
剪切到bgg
的文件夹里面 - 将
bgg
文件夹拖入到HBuilderX
这个开发工具里面去
开始项目
在当前项目下面新建一个
index.html
的文件,这是一个网页文件,新的项目当中,代码如下<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> </body> </html>
开始设置中间的盒子
<body> <div class="box"></div> </body>
接下来设置样式
/* .box相当于class="box" */ .box { width: 200px; height: 280px; /* 设置了一个2px的实线的白色边框 */ border: 2px solid white; /* 固定定位,固定的定在浏览器的某一个地方 */ position: fixed; /* calc是CSS属性当中计算的使用 */ left: calc(50% - 100px); top: calc(50% - 140px); }
代码说明:
.box
相当于html标签中的class="box"
border
代表设置元素的边框,solid
是实线position:fixed
是固定定位,具体可能参照http://www.softeem.xin:8090/archives/%E5%AE%9A%E4%BD%8D#%E5%9B%BA%E5%AE%9A%E5%AE%9A%E4%BD%8Dcalc
代表CSS中的计算
开始设置里面的第1张图片
<style> /* .box相当于class="box" */ .box { width: 200px; height: 280px; /* 设置了一个2px的实线的白色边框 */ border: 2px solid white; /* 固定定位,固定的定在浏览器的某一个地方 */ position: fixed; /* calc是CSS属性当中计算的使用 */ left: calc(50% - 100px); top: calc(50% - 140px); /* 把平面的盒子变成一个3D的盒子 */ transform-style: preserve-3d; } .box>img { /* 把图片的宽度与高度设置成与外边的盒子相同 */ width: 100%; height: 100%; } /* 选中class="box"下边的第1张图片 */ .box>img:nth-child(1) { /* 我要让这一张图片沿着Y轴去旋转30度 ,并且在Z轴上面向前走300px*/ transform: rotateY(30deg) translateZ(300px); } </style> <div class="box"> <img src="img/2014.jpg" /> </div>
在上面的代码里面,我们用到了CSS3当中的变换属性
transform
,这一块可以参考http://www.softeem.xin:8090/archives/%E5%8F%98%E6%8D%A2其中还用到了3D变换
按照第1张图片的思路,我们把剩下的11张图片也放进去
当我们按照我们的思维进行代码完成,在里面添加了剩下的图片代码
<div class="box"> <img src="img/2014.jpg" /> <img src="img/2015.jpg" /> <img src="img/2016.jpg" /> <img src="img/2017.jpg" /> <img src="img/2018上.jpg" /> <img src="img/w01.jpg" /> <img src="img/w02.jpg" /> <img src="img/w03.jpg" /> <img src="img/w04.jpg" /> <img src="img/w05.jpg" /> <img src="img/w06.jpg" /> <img src="img/w07.jpg" /> </div>
我们发现一个问题,这个图片是从上向下在排列,并没有符合我们的要求,那么,我们怎么样让片都从于同一个位置开始呢?
这个时候我们要让所有的图片都以
box
盒子的左上角为开始,这怎么办呢?针对于这一种,在前端布局里面,有一个思路叫子绝父相
子绝父相:当一个元素如果要以另一外元素为标准进行位置布局的时候,最好的办法就是在父级元素上面设置
相对定位
,而在所有的子级元素上面设置绝对定位
,这样就实现了子绝父相的布局
CSS动画的应用
在CSS里面,如果要使用动画,必须经历下面两个阶段
graph LR
A[定义动画]-->B[调用动画]
动画的定义
@keyframes 动画名称 {
from {
/*动画开始*/
}
to {
/*动画结束*/
}
}
下面我们就使用语法定义了一个旋转360度的动画
/* 在CSS里面,我们可以定义一个动画 */
@keyframes zhuan {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(360deg);
}
}
动画的调用
在调用动画的时候,要使用CSS的属性去调用,这个属性就是animation
animation-name
动画的名称animation-duration
动画的时间animation-iteration-count
动画执行的次数animation-timing-function
动画执行的时间函数(动画的效果)
目前我们使用的就是上面的四个
完整代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>标哥最帅</title>
<style type="text/css">
body {
background-color: black;
}
.box {
width: 200px;
height: 280px;
border: none;
position: fixed;
left: calc(50% - 100px);
top: calc(50% - 140px);
transform-style: preserve-3d;
transform: rotateX(-20deg);
/* 调用动画 */
animation-name: zhuan;
/* 设置动画执行一次需要10s */
animation-duration: 10s;
/* 设置动画无限次循环 */
animation-iteration-count: infinite;
/* 设置动画匀速播放 */
animation-timing-function: linear;
}
.box>img {
width: 100%;
height: 100%;
position: absolute;
left: 0px;
top: 0px;
border-radius: 10px;
box-shadow: 0px 0px 15px white;
}
.box>img:nth-child(1) {
transform: rotateY(30deg) translateZ(500px);
}
.box>img:nth-child(2) {
transform: rotateY(60deg) translateZ(500px);
}
.box>img:nth-child(3) {
transform: rotateY(90deg) translateZ(500px);
}
.box>img:nth-child(4) {
transform: rotateY(120deg) translateZ(500px);
}
.box>img:nth-child(5) {
transform: rotateY(150deg) translateZ(500px);
}
.box>img:nth-child(6) {
transform: rotateY(180deg) translateZ(500px);
}
.box>img:nth-child(7) {
transform: rotateY(210deg) translateZ(500px);
}
.box>img:nth-child(8) {
transform: rotateY(240deg) translateZ(500px);
}
.box>img:nth-child(9) {
transform: rotateY(270deg) translateZ(500px);
}
.box>img:nth-child(10) {
transform: rotateY(300deg) translateZ(500px);
}
.box>img:nth-child(11) {
transform: rotateY(330deg) translateZ(500px);
}
.box>img:nth-child(12) {
transform: rotateY(360deg) translateZ(500px);
}
/* 在CSS里面,我们可以定义一个动画 */
@keyframes zhuan {
from {
transform: rotateX(-20deg) rotateY(0deg);
}
to {
transform: rotateX(-20deg) rotateY(360deg);
}
}
</style>
</head>
<body>
<div class="box">
<img src="img/2014.jpg" />
<img src="img/2015.jpg" />
<img src="img/2016.jpg" />
<img src="img/2017.jpg" />
<img src="img/2018上.jpg" />
<img src="img/w01.jpg" />
<img src="img/w02.jpg" />
<img src="img/w03.jpg" />
<img src="img/w04.jpg" />
<img src="img/w05.jpg" />
<img src="img/w06.jpg" />
<img src="img/w07.jpg" />
</div>
</body>
</html>
女朋友相册完整版代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>女朋友相册</title>
<link rel="stylesheet" href="css/index.css" />
</head>
<body>
<audio src="你的酒馆对我打了烊.mp3" autoplay="autoplay" controls="controls" />
</audio>
<div class="wrap">
<div class="cube">
<div class="out_front">
<img src="img/1.jpg" class="pic"/>
</div>
<div class="out_back">
<img src="img/2.jpg" class="pic"/>
</div>
<div class="out_left">
<img src="img/3.jpg" class="pic"/>
</div>
<div class="out_right">
<img src="img/4.jpg" class="pic"/>
</div>
<div class="out_top">
<img src="img/5.jpg" class="pic"/>
</div>
<div class="out_bottom">
<img src="img/6.jpg" class="pic"/>
</div>
<span class="in_front">
<img src="img/7.jpg" class="in_pic" />
</span>
<span class="in_back">
<img src="img/8.jpg" class="in_pic" />
</span>
<span class="in_left">
<img src="img/9.jpg" class="in_pic" />
</span>
<span class="in_right">
<img src="img/10.jpg" class="in_pic" />
</span>
<span class="in_top">
<img src="img/11.jpg" class="in_pic" />
</span>
<span class="in_bottom">
<img src="img/12.jpg" class="in_pic" />
</span>
</div>
</div>
</body>
</html>
css代码:
html{
background: #000;
height: 100%;
}
/*最外层容器样式*/
.wrap{
position: relative;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 200px;
height: 200px;
margin: auto;
/*改变左右上下,图片方块移动*/
}
/*包裹所有容器样式*/
.cube{
width: 200px;
height: 200px;
margin: 0 auto;
transform-style: preserve-3d;
transform: rotateX(-30deg) rotateY(-80deg);
-webkit-animation: rotate 20s infinite;
/*匀速*/
animation-timing-function: linear;
}
@-webkit-keyframes rotate{
from{transform: rotateX(0deg) rotateY(0deg);}
to{transform: rotateX(360deg) rotateY(360deg);}
}
.cube div{
position: absolute;
width: 200px;
height: 200px;
opacity: 0.8;
transition: all .4s;
}
/*定义所有图片样式*/
.pic{
width: 200px;
height: 200px;
}
.cube .out_front{
transform: rotateY(0deg) translateZ(100px);
}
.cube .out_back{
transform: translateZ(-100px) rotateY(180deg);
}
.cube .out_left{
transform: rotateY(90deg) translateZ(100px);
}
.cube .out_right{
transform: rotateY(-90deg) translateZ(100px);
}
.cube .out_top{
transform: rotateX(90deg) translateZ(100px);
}
.cube .out_bottom{
transform: rotateX(-90deg) translateZ(100px);
}
/*定义小正方体样式*/
.cube span{
display: bloack;
width: 100px;
height: 100px;
position: absolute;
top: 50px;
left: 50px;
}
.cube .in_pic{
width: 100px;
height: 100px;
}
.cube .in_front{
transform: rotateY(0deg) translateZ(50px);
}
.cube .in_back{
transform: translateZ(-50px) rotateY(180deg);
}
.cube .in_left{
transform: rotateY(90deg) translateZ(50px);
}
.cube .in_right{
transform: rotateY(-90deg) translateZ(50px);
}
.cube .in_top{
transform: rotateX(90deg) translateZ(50px);
}
.cube .in_bottom{
transform: rotateX(-90deg) translateZ(50px);
}
/*鼠标移入后样式*/
.cube:hover .out_front{
transform: rotateY(0deg) translateZ(200px);
}
.cube:hover .out_back{
transform: translateZ(-200px) rotateY(180deg);
}
.cube:hover .out_left{
transform: rotateY(90deg) translateZ(200px);
}
.cube:hover .out_right{
transform: rotateY(-90deg) translateZ(200px);
}
.cube:hover .out_top{
transform: rotateX(90deg) translateZ(200px);
}
.cube:hover .out_bottom{
transform: rotateX(-90deg) translateZ(200px);
}
最终效果如下(我只是截了一张静态图,实际为动态3D效果):
总结
本次项目当中用到了技术点
transform
变换trasnform-style
:变换的方式,里面有3D变换rotate
旋转translate
位移@keyframe
定义动画animation
使用动画- “子绝父相”的使用
教程来源:软帝标哥