详解flex布局做骰子案例
上次案例用到了css3的3D特效,3D特效做正方体也是很常用的,所有我想到了利用css3做一个骰子,而骰子每一面的点数利用定位做起来很麻烦,利用css3的flex布局是很方便的,这次来看看如何利用flex弹性盒子的一些属性完成骰子点数的布局~
首先,建立一个3D空间元素,做成正方体,是上一篇中详细介绍过如何创建一个3D空间元素,这里就不细说了~实现一个正方体的原理是,在一个父元素中包含六个子元素,transform:rotate和translate来转变好每一个的面,在编写过程中,以下是我觉得对视觉效果有很好体验的一些细节:1、视距设置在body中,值给大一些。2、背景为黑色,骰子的每一面边框带一些圆角和内阴影。以下是我做出一个正方体的效果。
正方体创建好后,到了这次的重点–利用弹性盒子flex的一些属性来布局每一面的点数。
首先在每一面中创建对应的div个数,并给每一面的div设置display:flex;和flex-wrap:wrap;(弹性盒子中元素在必要时换行)样式
点数1
第一面只有一个子div,所以只需将其中心对齐就好了。设置justify-content: center;(元素在弹性盒子主轴中心开始排列)和 align-items: center;(元素在弹性盒子交叉轴中心开始排列),就可以实现水平垂直对称了。部分代码如下
.father1{
justify-content: center;
align-items: center;
}
点数2
第二面两个元素首先设置主轴元素两侧的间距相等排列,再将第二个元素靠交叉轴终点排列。部分代码如下
.father2{
justify-content: space-around;
}
.father2 .son:nth-child(2){
align-self:flex-end;
}
点数3
第三面三个元素首先设置主轴元素两侧的间距相等排列,再将第二个元素靠交叉轴中心排列,第三个元素靠交叉轴终点排列,部分代码如下
.father3{
justify-content: space-around;
}
.father3 .son:nth-child(2){
align-self:center;
}
.father3 .son:nth-child(3){
align-self:flex-end;
}
点数4
第三面两个元素一排并且都是靠垂直居中些排列,这里我设置主轴元素两侧的间距相等排列,由于元素在一列排不下会自动换行,所以增大每个元素外边距就实现效果了,部分代码如下
.father4{
justify-content:space-around;
}
.father4 .son{
margin: 25px;
}
点数5
第五面在子元素创建时分别创三个div里面分别放2、1、2div,设置主轴元素两侧的间距相等排列,设置盒子元素纵向排列,将面底下的三个div设为弹性盒子,第一、三个div设置主轴元素两侧的间距相等排列,第二个div设置主轴元素靠中心排列,部分代码如下
.father5{
justify-content: space-around;
flex-direction: column;
}
.father5>div{
display: flex;
}
.five_1{
justify-content: space-around;
}
.five_2{
justify-content: center;
}
.five_3{
justify-content: space-around;
}
点数6
第五面在子元素创建时分别创三个div里面分别放2、1、2div,设置主轴元素两侧的间距相等排列,设置盒子元素纵向排列,将面底下的三个div设为弹性盒子设置主轴元素两侧的间距相等排列,和盒子元素横向排列,部分代码如下
.father6{
flex-direction:column;
justify-content: space-around;
}
.father6>div{
display: flex;
flex-direction:row;
justify-content:space-around;
}
再给骰子用animation属性加一个自动旋转的效果,就更加炫酷啦,示例图和完整代码如下。
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0px;
padding:0px;
}
body{
perspective:8000px;
background-color: black;
}
.big{
position: relative;
top: 300px;
left: 400px;
width: 200px;
height: 200px;
/* border: 1px solid red; */
transform-style: preserve-3d;
transform:rotateX(180deg);
/* transform:rotatey(90deg); */
/* transition:all 10s linear; */
animation: run 10s linear 0s infinite;
}
/* .big:hover{
transform:rotateX(180deg) rotatey(180deg) rotatez(180deg);
} */
@keyframes run {
0%{
transform:rotateX(0deg) rotatey(0deg) rotatez(0deg);
}
100%{
transform:rotateX(180deg) rotatey(180deg) rotatez(180deg);
}
}
.father{
position: absolute;
width: 200px;
height: 200px;
display: flex;
flex-wrap:wrap;
border-radius: 30px;
box-shadow: 0px 0px 10px 10px #fff inset;
background-color: #EEE;
/* padding: 10px; */
}
.son{
width: 50px;
height: 50px;
border-radius: 25px;
background-color: black;
/* margin: 25px; */
}
/* 第一个面 */
.father1{
transform:rotateX(-90deg) translatez(-100px);
justify-content: center;
align-items: center;
}
.father1 .son{
background-color: brown;
}
/* 第六个面 */
.father6{
transform:rotateX(-90deg) translatez(100px);
flex-direction:column;
justify-content: space-around;
}
.father6>div{
display: flex;
flex-direction:row;
justify-content:space-around;
}
/* 第二个面 */
.father2{
transform:rotateY(-90deg) translatez(100px);
justify-content: space-around;
}
.father2 .son:nth-child(2){
/* background-color: brown; */
align-self:flex-end;
}
/* 第五个面 */
.father5{
transform:rotateY(-90deg) translatez(-100px);
justify-content: space-around;
flex-direction: column;
}
.father5>div{
display: flex;
}
.father5 .son{
margin: 0px;
}
.five_1{
justify-content: space-around;
}
.five_2{
justify-content: center;
}
.five_3{
justify-content: space-around;
}
/* 第三个面 */
.father3{
transform: translatez(100px);
justify-content: space-around;
/* align-content:space-between; */
}
.father3 .son{
margin: 0px;
}
.father3 .son:nth-child(2){
align-self:center;
}
.father3 .son:nth-child(3){
align-self:flex-end;
}
/* 第四个面 */
.father4{
transform: translatez(-100px);
justify-content:space-around;
/* align-content:space-around; */
}
.father4 .son{
margin: 25px;
}
</style>
</head>
<body>
<div class="big">
<div class="father father1">
<div class="son son1"></div>
</div>
<div class="father father2">
<div class="son"></div>
<div class="son"></div>
</div>
<div class="father father3">
<div class="son son1"></div>
<div class="son son1"></div>
<div class="son son1"></div>
</div>
<div class="father father4">
<div class="son son1"></div>
<div class="son son1"></div>
<div class="son son1"></div>
<div class="son son1"></div>
</div>
<div class="father father5">
<div class="five_1">
<div class="son"></div>
<div class="son"></div>
</div>
<div class="five_2">
<div class="son"></div>
</div>
<div class="five_3">
<div class="son"></div>
<div class="son"></div>
</div>
</div>
<div class="father father6">
<div class="six_1">
<div class="son"></div>
<div class="son"></div>
</div>
<div class="six_2">
<div class="son"></div>
<div class="son"></div>
</div>
<div class="six_3">
<div class="son"></div>
<div class="son"></div>
</div>
</div>
</div>
</body>
</html>
css3的flex布局做骰子效果就实现啦,对你有帮助的话点个赞支持下哦~