css3之实现网红正方体相册弹开动画

这里讲解实现抖音网红的正方体相册的动画制作(大正方体包裹小正方体,鼠标点击大正方体弹开展现小正方体)。

先上效果图:
在这里插入图片描述在这里插入图片描述

1. 基础结构
老规矩,先写好基础结构。这里关于3D动画制作原理及正方体简单旋转制作的知识还不清楚的话可以参考我上一篇文章。首先父元素cube用来接收3D动画的视觉属性;然后box子元素包裹正方体内容并规定动画形式为3D;然后写进大正方体的6个面div和小正方体元素inner-box,并用flex将其定位于父元素box的中央;最后写进小正方体的6个面div。

<div class="cube">
    <div class="box">
        <div class="child child-th1">
            <img src="./static/cube1.jpg" >
        </div>
        <div class="child child-th2">
            <img src="./static/cube1.jpg" >
        </div>
        <div class="child child-th3">
            <img src="./static/cube1.jpg" >
        </div>
        <div class="child child-th4">
            <img src="./static/cube1.jpg" >
        </div>
        <div class="child child-th5">
            <img src="./static/cube1.jpg" >
        </div>
        <div class="child child-th6">
            <img src="./static/cube1.jpg" >
        </div>
        <div class="inner-box">
            <div class="inner inner-th1">
                <img src="./static/cube2.jpg" >
            </div>
            <div class="inner inner-th1">
                <img src="./static/cube2.jpg" >
            </div>
            <div class="inner inner-th1">
                <img src="./static/cube2.jpg" >
            </div>
            <div class="inner inner-th1">
                <img src="./static/cube2.jpg" >
            </div>
            <div class="inner inner-th1">
                <img src="./static/cube2.jpg" >
            </div>
            <div class="inner inner-th1">
                <img src="./static/cube2.jpg" >
            </div>
        </div>
    </div>
</div>

2. 样式形态
接下来就是主要的css部分。对于父级元素以及一些基础样式我就不重复讲解了,大小、图片、颜色等不定可根据个人喜好。主要是两个正方体的6个面,用transform属性将他们分别旋转和调节位置,以组成正方体结构。

.cube {
    width: 200px;
    height: 200px;
    margin: 200px auto;
    perspective: 800px;
}
.box {
    transform-style: preserve-3d;
    width: 100%;
    height: 100%;
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
}
.child {
    position: absolute;
    opacity: 0.8;
}
.child img {
    width: 200px;
    height: 200px;
}
.child-th6{
    transform: rotateX(90deg) translateZ(100px);
}
.child-th5{
    transform: rotateX(-90deg) translateZ(100px);
}
.child-th4{
    transform: rotateY(-90deg) translateZ(100px);
}
.child-th3{
    transform: rotateY(90deg) translateZ(100px);
}
.child-th2{
    transform: translateZ(100px);
}
.child-th1{
    transform: rotateY(180deg) translateZ(100px);
}
.inner-box {
    width: 90px;
    height: 90px;
}
.inner {
    position: absolute;
    opacity: 0.8;
}
.inner img {
    width: 90px;
    height: 90px;
}
.inner-box div:nth-child(1) {
    transform: rotateY(180deg) translateZ(45px);
}
.inner-box div:nth-child(2) {
    transform: translateZ(45px);
}
.inner-box div:nth-child(3) {
    transform: rotateY(90deg) translateZ(45px);
}
.inner-box div:nth-child(4) {
    transform: rotateY(-90deg) translateZ(45px);
}
.inner-box div:nth-child(5) {
    transform: rotateX(-90deg) translateZ(45px);
}
.inner-box div:nth-child(6) {
    transform: rotateX(90deg) translateZ(45px);
}

3. 基础动画
上面我们已经完成正方体的制作了,现在是静止的,需要我们添加上基础的旋转动画。这里我选择css3的@keyframes动画属性来实现。首先规定一个动画并赋予名字;然后在box元素上添加该动画,并设置相应的时间、自动播放、速率、反向等属性值。注意,不要添加错地方,只能在box元素上,两个正方体才会同时转动。

@keyframes cubeAction {
    0% {
        transform: rotateX(0) rotateY(0);
    }
    50% {
        transform: rotateX(180deg) rotateY(180deg);
    }
    100% {
        transform: rotateX(360deg) rotateY(360deg);
    }
}
.box {
    transform-style: preserve-3d;
    width: 100%;
    height: 100%;
    animation: cubeAction 20s linear infinite alternate;
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
}

4. 响应动画
做到这一步,你的正方体已经在原地360度地不停旋转了,那么就剩最后一步,为box元素添加click事件,使鼠标点击时大正方体的6个面同时弹开,展示小正方体。不难,只需要在响应函数中分别设置6个面的transform属性值就可以了。

<div class="box" onclick="boom()">
<script>
    function boom() {
        var box = document.getElementsByClassName('box')[0]
        box.childNodes[1].style.transform = "rotateY(180deg) translateZ(171px)";
        box.childNodes[3].style.transform = "translateZ(171px)";
        box.childNodes[5].style.transform = "rotateY(90deg) translateZ(171px)";
        box.childNodes[7].style.transform = "rotateY(-90deg) translateZ(171px)";
        box.childNodes[9].style.transform = "rotateX(-90deg) translateZ(171px)";
        box.childNodes[11].style.transform = "rotateX(90deg) translateZ(171px)";
    }
</script>

大功告成!需要源码的可以拿去参考,有问题请留言交流:
源代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>cube</title>
</head>
<body>
    <div class="cube">
        <div class="box" onclick="boom()">
            <div class="child child-th1">
                <img src="./static/cube1.jpg" >
            </div>
            <div class="child child-th2">
                <img src="./static/cube1.jpg" >
            </div>
            <div class="child child-th3">
                <img src="./static/cube1.jpg" >
            </div>
            <div class="child child-th4">
                <img src="./static/cube1.jpg" >
            </div>
            <div class="child child-th5">
                <img src="./static/cube1.jpg" >
            </div>
            <div class="child child-th6">
                <img src="./static/cube1.jpg" >
            </div>
            <div class="inner-box">
                <div class="inner inner-th1">
                    <img src="./static/cube2.jpg" >
                </div>
                <div class="inner inner-th1">
                    <img src="./static/cube2.jpg" >
                </div>
                <div class="inner inner-th1">
                    <img src="./static/cube2.jpg" >
                </div>
                <div class="inner inner-th1">
                    <img src="./static/cube2.jpg" >
                </div>
                <div class="inner inner-th1">
                    <img src="./static/cube2.jpg" >
                </div>
                <div class="inner inner-th1">
                    <img src="./static/cube2.jpg" >
                </div>
            </div>
        </div>
    </div>
</body>
<style>
    @keyframes cubeAction {
        0% {
            transform: rotateX(0) rotateY(0);
        }
        50% {
            transform: rotateX(180deg) rotateY(180deg);
        }
        100% {
            transform: rotateX(360deg) rotateY(360deg);
        }
    }
    .cube {
        width: 200px;
        height: 200px;
        margin: 200px auto;
        perspective: 800px;
    }
    .box {
        transform-style: preserve-3d;
        width: 100%;
        height: 100%;
        animation: cubeAction 20s linear infinite alternate;
        position: relative;
        display: flex;
        justify-content: center;
        align-items: center;
    }
    .child {
        position: absolute;
        opacity: 0.8;
    }
    .child img {
        width: 200px;
        height: 200px;
    }
    .child-th6{
        transform: rotateX(90deg) translateZ(100px);
    }
    .child-th5{
        transform: rotateX(-90deg) translateZ(100px);
    }
    .child-th4{
        transform: rotateY(-90deg) translateZ(100px);
    }
    .child-th3{
        transform: rotateY(90deg) translateZ(100px);
    }
    .child-th2{
        transform: translateZ(100px);
    }
    .child-th1{
        transform: rotateY(180deg) translateZ(100px);
    }
    .inner-box {
        width: 90px;
        height: 90px;
    }
    .inner {
        position: absolute;
        opacity: 0.8;
    }
    .inner img {
        width: 90px;
        height: 90px;
    }
    .inner-box div:nth-child(1) {
        transform: rotateY(180deg) translateZ(45px);
    }
    .inner-box div:nth-child(2) {
        transform: translateZ(45px);
    }
    .inner-box div:nth-child(3) {
        transform: rotateY(90deg) translateZ(45px);
    }
    .inner-box div:nth-child(4) {
        transform: rotateY(-90deg) translateZ(45px);
    }
    .inner-box div:nth-child(5) {
        transform: rotateX(-90deg) translateZ(45px);
    }
    .inner-box div:nth-child(6) {
        transform: rotateX(90deg) translateZ(45px);
    }
</style>
</html>
<script>
    function boom() {
        var box = document.getElementsByClassName('box')[0]
        box.childNodes[1].style.transform = "rotateY(180deg) translateZ(171px)";
        box.childNodes[3].style.transform = "translateZ(171px)";
        box.childNodes[5].style.transform = "rotateY(90deg) translateZ(171px)";
        box.childNodes[7].style.transform = "rotateY(-90deg) translateZ(171px)";
        box.childNodes[9].style.transform = "rotateX(-90deg) translateZ(171px)";
        box.childNodes[11].style.transform = "rotateX(90deg) translateZ(171px)";
    }
</script>
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值