方块等待框的实现

87 阅读2分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

今天来实现一下方块等待框,代码已放码上掘金!

页面结构

我们这里使用无序列表进行实现,因为是有两个方块,一个是X轴旋转,一个是Y轴旋转

     <ul>
        <li></li>
        <li></li>
    </ul>

初始样式

先清除body元素的外边距内边距,在通过定位结合transform: translate的方式将无序列表盒子垂直水平定位到页面的正中间,设置好宽高,在清除一下无序列表的默认样式,最后通过transform-style: preserve-3d;设置所有子元素在3D空间中呈现

body {
            margin: 0;
            padding: 0;
        }

        ul {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 300px;
            height: 300px;
            list-style: none;
            transform-style: preserve-3d;
        }

旋转小方块实现

旋转小方块我们通过无序列表的子元素进行实现,我们将子元素利用固定定位结合transform: translate的方式定位在无序列表大盒子的正中间,然后设置好边框大小和背景颜色

   ul li {
            position: absolute;
            top: 50%;
            left: 50%;
            border: 20px solid #BEE7E9;
            transform: translate(-50%, -50%);
        }

旋转小方块的两色方格,我们用伪元素进行实现,先给伪元素设置跟边框大小的样式,然后给上定位,最后我们通过定位的方式,定位到合适的位置,在给上合适的背景颜色

        ul li::after,
        ul li::before {
            content: '';
            width: 20px;
            height: 20px;
            position: absolute;
            background: #D1BA74;
        }

给旋转小方块伪元素定位到不同的位置

        ul li::before {
            top: -20px;
            left: -20px;
        }
        ul li::after {
            bottom: -20px;
            right: -20px;
        }

给第一个旋转方块不设置宽高,第二元素需要完全承载住第一个盒子的宽高,并且第二个盒子的伪元素高度要进行改变到适当的高度

    ul li:nth-child(1) {
            width: 0px;
            height: 0px;
        }

        ul li:nth-child(2) {
            width: 40px;
            height: 40px;
        }

        ul li:nth-child(2)::after,
        ul li:nth-child(2)::before {
            height: 60px;
        }

旋转动画

我们通过css动画进行操作transform中的旋转属性,写出X轴旋转动画和Y轴旋转动画

    @keyframes Xrotate {
            0% {
                transform: translate(-50%, -50%) rotateX(0deg);
            }

            100% {
                transform: translate(-50%, -50%) rotateX(360deg);
            }
        }

        @keyframes Yrotate {
            0% {
                transform: translate(-50%, -50%) rotateY(0deg);
            }

            100% {
                transform: translate(-50%, -50%) rotateY(360deg);
            }
        }

最后我们在给第一个选装小方块和第二个选装小方块设置上对应的动画且无限执行即可

   ul li:nth-child(1) {
            width: 0px;
            height: 0px;
            animation: Xrotate 1s linear infinite;
        }

        ul li:nth-child(2) {
            width: 40px;
            height: 40px;
            animation: Yrotate 2s linear infinite;

        }