css3技巧——实现一个正方体

CSS3为我们提供了很多以往没办法实现的功能,如动画、transform、transition等等,今天,我们就来使用CSS3的transform和transition配合实现一个正方体的构建

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        html,
        body {
            height: 100%;
            overflow: hidden;
        }
        
        body {
            background: linear-gradient(45deg, #222, #333, #444);
        }
        
        .box {
            margin: 0 auto;
            width: 200px;
            padding-top: 200px;
            box-sizing: border-box;
        }
        
        .cube {
            /* 设置正方体的转换类型是3d转换模式*/
            transform-style: preserve-3d;
            /* 为了方便我们观察每一个面,将正方体旋转一定的角度 */
            transform: rotateX(-35deg) rotateY(45deg);
        }
        /* 每个面通用的基础样式 */
        
        .site {
            background: rgba(0, 188, 166, .6);
            color: #FFFFFF;
            width: 200px;
            height: 200px;
            border: 1px solid #333333;
            text-align: center;
            line-height: 200px;
            position: absolute;
            font-size: 64px;
            font-weight: bold;
            transition: transform 1.5s;
            cursor: pointer;
            box-shadow: 0 0 5px #FFFFFF;
        }
        /* 以下为默认的前后左右上下6个面的厨师状态,设置一下延时,方便我们观看正方体构建的过程 */
        
        .front {
            transform: scale(0) translateZ(300px);
            transition-delay: 100ms;
        }
        
        .back {
            transform: scale(0) translateZ(-300px);
            transition-delay: 1600ms;
        }
        
        .left {
            transform: scale(0) rotateY(-90deg) translateZ(300px);
            transition-delay: 3100ms;
        }
        
        .right {
            transform: scale(0) rotateY(90deg) translateZ(-300px);
            transition-delay: 4600ms;
        }
        
        .top {
            transform: scale(0) rotateX(90deg) translateZ(300px);
            transition-delay: 6100ms;
        }
        
        .bottom {
            transform: scale(0) rotateX(-90deg) translateZ(-300px);
            transition-delay: 7600ms;
        }
        /* 添加active类名后,开始构建正方体 */
        
        .active.front {
            transform: scale(1) translateZ(100px);
        }
        
        .active.back {
            transform: scale(1) translateZ(-100px) rotateY(180deg);
        }
        
        .active.left {
            transform: scale(1) rotateY(-90deg) translateZ(100px);
        }
        
        .active.right {
            transform: scale(1) rotateY(90deg) translateZ(100px);
        }
        
        .active.top {
            transform: scale(1) rotateX(90deg) translateZ(100px);
        }
        
        .active.bottom {
            transform: scale(1) rotateX(-90deg) translateZ(100px);
        }
        
        .site.active:hover,
        .finish {
            transition-delay: 0ms!important;
        }
        
        .active.site:hover.front {
            transform: scale(1.2) translateZ(100px);
        }
        
        .active.site:hover.back {
            transform: scale(1.2) translateZ(-100px);
        }
        
        .active.site:hover.left {
            transform: scale(1.2) rotateY(-90deg) translateZ(100px);
        }
        
        .active.site:hover.right {
            transform: scale(1.2) rotateY(-90deg) translateZ(-100px);
        }
        
        .active.site:hover.top {
            transform: scale(1.2) rotateX(90deg) translateZ(100px);
        }
        
        .active.site:hover.bottom {
            transform: scale(1.2) rotateX(90deg) translateZ(-100px);
        }
        
        .control {
            position: fixed;
            bottom: 30px;
            left: 0;
            text-align: center;
            width: 100%;
        }
        
        button {
            width: 100px;
            height: 30px;
            background: linear-gradient(45deg, rgb(11, 108, 187), rgb(3, 61, 109));
            border-radius: 5px;
            border: 1px solid #FFFFFF;
            outline: none;
            color: #FFFFFF;
            font-size: 18px;
            cursor: pointer;
        }
        
        button:disabled {
            opacity: .6;
            cursor: not-allowed;
        }
        
        button:hover {
            opacity: .8;
        }
        
        button:hover:disabled {
            opacity: .6;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="cube" id="cube">
            <div class="site front">1</div>
            <div class="site back">2</div>
            <div class="site left">3</div>
            <div class="site right">4</div>
            <div class="site top">5</div>
            <div class="site bottom">6</div>
        </div>
        <div class="control">
            <button id="left" disabled>←</button>
            <button id="up" disabled>↑</button>
            <button id="down" disabled>↓</button>
            <button id="right" disabled>→</button>
            <button id="reset" disabled>重置</button>
        </div>
    </div>

    <script>
        var sites = document.querySelectorAll('.site');


        var left = document.getElementById('left');
        var right = document.getElementById('right');
        var up = document.getElementById('up');
        var down = document.getElementById('down');
        var reset = document.getElementById('reset');
        var cube = document.getElementById('cube');


        var degX = -35,
            degY = 45;

        function start() {
            for (var i = 0; i < sites.length; i++) {
                var site = sites[i];
                site.classList.add('active');
            }
        }

        function finish() {
            for (var i = 0; i < sites.length; i++) {
                var site = sites[i];
                site.classList.add('finish');
            }
            left.removeAttribute('disabled');
            right.removeAttribute('disabled');
            up.removeAttribute('disabled');
            down.removeAttribute('disabled');
            reset.removeAttribute('disabled');

        }

        function doReset(cb) {
            deg = -35;
            degY = 45;
            changeDeg(degX, degY);
            for (var i = 0; i < sites.length; i++) {
                var site = sites[i];
                site.classList.remove('active', 'finish');
            }
            setTimeout(() => {
                cb && cb();
            }, 9100);
        }

        function changeDeg(degX, degY) {
            cube.style.transform = `rotateX(${degX}deg) rotateY(${degY}deg)`;
        }

        reset.onclick = function() {
            doReset(() => {
                init();
            });
        };
        left.onclick = function() {
            degY -= 5;
            changeDeg(degX, degY);
        };
        right.onclick = function() {
            degY += 5;
            changeDeg(degX, degY);
        };
        up.onclick = function() {
            degX -= 5;
            changeDeg(degX, degY);
        };
        down.onclick = function() {
            degX += 5;
            changeDeg(degX, degY);
        };


        function init() {
            start();
            setTimeout(() => {
                finish();
            }, 9100)
        }

        setTimeout(() => {
            init();
        }, 1000);
    </script>
</body>

</html>
示意图
示意图
发布了32 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u010651383/article/details/104649602