纯CSS3 实现3D魔方

纯CSS3 实现3D魔方

1、思路

  1. 父盒子给子盒子开启立体空间,并开启透视,设置视距
  2. 子盒子设置摆放位置,与我们画的正方体类似,按照平面正方体每个面的拜访位置,我们通过旋转、平移达到摆放的效果
  3. 父盒子设置过渡
  4. 鼠标悬停到父盒子,子盒子做出的行为,分别向各自的方向扩散,并且侧面要有一定的旋转,为90°,使其达到我们想看到的打开效果
  5. 创建动画,0%-100%没问题,x轴和y轴旋转一周或者两周,即360°或者720°
  6. 大盒子调用动画,大盒子旋转,子盒子就跟着转了

2、源码

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D魔方</title>
    <style>
        /* 清除浏览器内外边距 */
        
        * {
            padding: 0;
            margin: 0;
        }
        
        body {
            background-color: #000000;
            /* 子元素开启三维立体空间 */
            transform-style: preserve-3d;
        }
        /* 公共样式开始了 */
        /* 设置大盒子的样式 */
        
        .photo {
            /* 固定定位 */
            position: fixed;
            /* 使其最后可以在显示器中央 */
            left: 0;
            right: 0;
            bottom: 0;
            top: 0;
            /* 子元素开启三维立体空间 */
            transform-style: preserve-3d;
            /* 开启动画,10s执行完成,匀速,无限运行,自动返回 */
            animation: animation 20s linear infinite alternate;
        }
        /* 设置鼠标移动到img元素后行为的过度事件 */
        
        .photo1 img {
            transition: all 1s;
        }
        /* 公共样式结束了 */
        /* 外层魔方开始了 */
        
        .photo1 {
            /* 正方形 */
            width: 200px;
            height: 200px;
            /* 水平垂直居中 */
            margin: 200px auto;
        }
        
        .photo1 img {
            /* 正方形 */
            width: 200px;
            height: 200px;
            /* 绝对定位 */
            position: absolute;
            top: 0;
            left: 0;
            opacity: 0.9;
            background-color: pink;
            border: 2px solid #333333;
        }
        /*设置正方形的6个面的位置 
            1、前后两个面的XY轴不动,只改变Z轴从自身向外扩散的距离(可视区为+,否则为-)
            2、左右两个面Y轴旋转90deg,呈竖着的状态,Z轴从自身向外扩散(可视区为+,否则为-)
            3、上下两个面X轴旋转90deg,呈平行的状态,Z轴从自身向外扩散(可视区为+,否则为-)
        */
        
        .photo1 #before {
            transform: translateZ(100px);
        }
        
        .photo1 #after {
            transform: translateZ(-100px);
        }
        
        .photo1 #top {
            transform: rotateX(90deg) translateZ(100px);
        }
        
        .photo1 #bottom {
            transform: rotateX(90deg) translateZ(-100px);
        }
        
        .photo1 #right {
            transform: rotateY(90deg) translateZ(100px);
        }
        
        .photo1 #left {
            transform: rotateY(90deg) translateZ(-100px);
        }
        /* 鼠标悬停在大盒子上,则出现的效果 
            1、分别向自身方向的Z轴向外移动
            2、自身的带有的XY轴数据继续正方向旋转90deg,使其视觉更有动态效果
        */
        
        .photo1:hover #before {
            transform: translateZ(160px);
        }
        
        .photo1:hover #after {
            transform: translateZ(-160px);
        }
        
        .photo1:hover #top {
            transform: rotateX(90deg) translateZ(160px);
        }
        
        .photo1:hover #bottom {
            transform: rotateX(90deg) translateZ(-160px);
        }
        
        .photo1:hover #right {
            transform: rotateY(90deg) translateZ(160px);
        }
        
        .photo1:hover #left {
            transform: rotateY(90deg) translateZ(-160px);
        }
        /* 外层魔方结束了了 */
        /* 内层魔方开始了 */
        
        .photo2 {
            width: 100px;
            height: 100px;
            margin: 250px auto;
        }
        
        .photo2 img {
            width: 100px;
            height: 100px;
            position: absolute;
            top: 0;
            left: 0;
            opacity: 0.9;
            border: 2px solid #333333;
        }
        
        .photo2 #before {
            transform: translateZ(50px);
        }
        
        .photo2 #after {
            transform: translateZ(-50px);
        }
        
        .photo2 #top {
            transform: rotateX(90deg) translateZ(50px);
        }
        
        .photo2 #bottom {
            transform: rotateX(90deg) translateZ(-50px);
        }
        
        .photo2 #right {
            transform: rotateY(90deg) translateZ(50px);
        }
        
        .photo2 #left {
            transform: rotateY(90deg) translateZ(-50px);
        }
        /* 内层魔方结束了了 */
        /* 创建动画
            1、开始的时候在即原点
            2、结束时XY轴旋转。旋转720deg是为了多旋转一圈,并且速度能快一点
         */
        
        @keyframes animation {
            form {
                transform: rotateX(0deg) rotateY(0deg);
            }
            to {
                transform: rotateX(360deg) rotateY(720deg);
            }
        }
    </style>
</head>

<body>
    <!-- 外层魔方开始了 -->
    <!-- 大盒子==>控制其旋转 -->
    <div class="photo1 photo">
        <!-- 照片==>摆放到合适的位置 -->
        <img src="./images/01.jpg" alt="" id="before">
        <img src="./images/02.jpg" alt="" id="after">
        <img src="./images/03.jpg" alt="" id="top">
        <img src="./images/04.jpg" alt="" id="bottom">
        <img src="./images/05.jpg" alt="" id="left">
        <img src="./images/06.jpg" alt="" id="right">
    </div>
    <!-- 外层魔方结束了 -->

    <!-- 内层魔方开始了 -->
    <!-- 大盒子==>控制其旋转 -->
    <div class="photo2 photo">
        <!-- 照片==>摆放到合适的位置 -->
        <img src="./images/01.jpg" alt="" id="before">
        <img src="./images/02.jpg" alt="" id="after">
        <img src="./images/03.jpg" alt="" id="top">
        <img src="./images/04.jpg" alt="" id="bottom">
        <img src="./images/05.jpg" alt="" id="left">
        <img src="./images/06.jpg" alt="" id="right">
    </div>
    <!-- 内层魔方结束了 -->
    <audio controls autoplay loop>
        <source src="./audio/弹钢琴的楠楠 - 【钢琴】windy hill(翻自 羽肿).mp3" type="audio/mp3">
        <source src="./audio/弹钢琴的楠楠 - 【钢琴】windy hill(翻自 羽肿).ogg" type="audio/ogg">
    </audio>
</body>s

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值