在小时候我们都有这一个赌侠梦,今天我们就用css来实现一下筛子吧
效果图
实现思路
筛子一共拥有六个面,这里我们就用无序列表盒子进行承载,无序列表里面总共有六个盒子,筛子的点我们通过伪元素的方式实现,由于我们的伪元素只有两个可以操控,所以我们在点数不够的情况下在往里面添加盒子,利用添加盒子的伪元素进行其他点数的实现,这里我们往无序列表中添加i元素作为多余盒子,在通过flex布局结合定位的方式实现点数的布局排列,最后通过css中的transform-style: preserve-3d;属性实现让子元素在3D空间中展示,这样比较好看,然后再通过css属性进行控制每个子元素的排列位置,以此来实现一个方形筛子的六个面,在利用css设置好筛子的旋转点,最后在声明一个css动画,让ul元素通过css属性进行转动
页面结构
<ul> <!-- 一个点 --> <li></li> <!-- 二个点 --> <li></li> <!-- 三个点 --> <li> <i></i> </li> <!-- 四个点 --> <li> <i></i> <i></i> </li> <!-- 五个点 --> <li> <i></i> <i></i> </li> <!-- 六个点 --> <li> <i></i> <i></i> </li> </ul>
页面初始样式
消除页面初始样式且清除无序列表的默认样式
* { margin: 0; padding: 0; list-style: none; }
筛子
给父元素设置样式,父元素通过定位的方式居于页面的正中间,设置开启3D属性且设置旋转中心
ul { position: absolute; top: calc(50% - 50px); left:calc(50% - 50px); width: 100px; height: 100px; transform-style: preserve-3d; display: flex; justify-content: center; flex-wrap: wrap; transform-origin: center center; animation: rotate 3s linear infinite; }
给子元素设置统一的边框背景等样式,开启定位便于后续实现3D的效果
ul>li { box-sizing: border-box; position: absolute; padding: 10px; width: 100px; height: 100px; background: rgb(199, 185, 185); border: 2px solid #000; }
点数,这里样式基本一样,使用并集选择器
ul>li:nth-child(1)::after, ul>li:nth-child(2)::after, ul>li:nth-child(2)::before, ul>li:nth-child(3)::after, ul>li:nth-child(3)::before, ul>li:nth-child(3) i, ul>li:nth-child(4) i::after, ul>li:nth-child(4) i::before, ul>li:nth-child(5)::after, ul>li:nth-child(5) i::after, ul>li:nth-child(5) i::before, ul>li:nth-child(6)::before, ul>li:nth-child(6)::after, ul>li:nth-child(6) i::after, ul>li:nth-child(6) i::before { content: ''; width: 15px; height: 15px; border-radius: 50%; background: #000; }
给每个子元素开启flex布局,可以操控伪元素和i标签的伪元素,通过他们作为筛子的点数,在通过定位的方式定位点数的位置
一个点
ul>li:nth-child(1) { display: flex; justify-content: center; align-items: center; transform: translateZ(50px); }
二个点
ul>li:nth-child(2) { display: flex; justify-content: space-around; align-items: center; transform: rotateY(180deg) translateZ(50px); }
三个点
ul>li:nth-child(3) { display: flex; flex-direction: column; justify-content: space-around; align-items: center; transform: rotateY(90deg) translateZ(50px); }
四个点
ul>li:nth-child(4) { display: flex; flex-direction: column; justify-content: space-between; align-items: center; transform: rotateY(-90deg) translateZ(50px); } ul>li:nth-child(4) i { width: 100%; display: flex; justify-content: space-between; }
五个点
ul>li:nth-child(5) { display: flex; flex-direction: column; justify-content: space-between; align-items: center; transform: rotateX(90deg) translateZ(50px); } ul>li:nth-child(5) i { width: 100%; display: flex; justify-content: space-between; } ul>li:nth-child(5)::after { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
六个点
ul>li:nth-child(6) { display: flex; flex-direction: column; justify-content: space-between; align-items: center; transform: rotateX(-90deg) translateZ(50px); } ul>li:nth-child(6) i { width: 100%; display: flex; justify-content: space-between; } ul>li:nth-child(6)::after { position: absolute; top: 50%; right: 10px; transform: translate(0, -50%); } ul>li:nth-child(6)::before { position: absolute; top: 50%; left: 10px; transform: translate(0, -50%); }
声明一个动画且让父元素进行使用
ul { animation: rotate 3s linear infinite; } @keyframes rotate { 0% { transform: rotate3d(1, 1, 1, 0deg); } 100% { transform: rotate3d(1, 1, 1, 360deg); } }
代码我已经放到码上掘金上了,快来看看吧
我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!