纯CSS3 实现 3D旋转相册

纯CSS3 实现 3D旋转相册

思路:

  1. 首先要有一个可以转动的父级元素
  2. 要有若干个子元素
  3. 通过父级元素给子元素开启三维立体空间
  4. 将子元素围父元素摆放:三维空间y轴排列,就是钢管舞运动,y轴旋转的度数=360 / 图片的个数-1,然后累加
  5. 为了使元素具有立体感,所有z轴都往前移动
  6. 使用过渡
  7. 创建动画阶段0%-100%肯定是没问题的,但是中间的阶段为:每次旋转90°,360/90=4次,100/4=25,也就是说每次是25%,到100%一共4次+0%=5次
  8. 让大盒子旋转其他子盒子面就会跟着旋转,因为是左右旋转的所有是按照y轴旋转,也就是钢管舞运动
  9. 为了让旋转更加富有效果,我们可以小幅度旋转x轴达到以上一下的效果
  10. 父盒子调用动画,父盒子转动子盒子就转动了

源码:

<!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>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            background: #000000;
        }
        
        .photo {
            width: 280px;
            height: 400px;
            /* 绝对定位 */
            position: fixed;
            /* 占满整个body */
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
            background: url(./images/12.jpg) no-repeat;
            background-size: 100%;
            /* 居中 */
            margin: 150px auto;
            /* 子元素开启三维立体空间 */
            transform-style: preserve-3d;
            /* 开启动画,动画匀速,5s完成一次,不断执行 */
            animation: animation 5s linear infinite;
        }
        
        img {
            width: 250px;
            height: 350px;
            /* 边框 */
            border: 5px solid #cccccc;
            /* 圆角边框 */
            border-radius: 5px;
            /* 绝对定位 */
            position: absolute;
            /* 定位到父盒子的左上端 */
            left: 0;
            top: 0;
            background-color: blue;
        }
        /* 
        设置每个图片元素的位置
        1、设置每个img元素旋转后的位置:Y轴:360/(11-1) = 36
        2、注意:11张图片,i = 0; 36 * i
        3、为了让每个图形向外扩散适当的距离,所以Z轴设置500px
         */
        
        .photo img:nth-child(1) {
            transform: rotateY(0deg) translateZ(500px);
        }
        
        .photo img:nth-child(2) {
            transform: rotateY(36deg) translateZ(500px);
        }
        
        .photo img:nth-child(3) {
            transform: rotateY(72deg) translateZ(500px);
        }
        
        .photo img:nth-child(4) {
            transform: rotateY(108deg) translateZ(500px);
        }
        
        .photo img:nth-child(5) {
            transform: rotateY(144deg) translateZ(500px);
        }
        
        .photo img:nth-child(6) {
            transform: rotateY(180deg) translateZ(500px);
        }
        
        .photo img:nth-child(7) {
            transform: rotateY(216deg) translateZ(500px);
        }
        
        .photo img:nth-child(8) {
            transform: rotateY(252deg) translateZ(500px);
        }
        
        .photo img:nth-child(9) {
            transform: rotateY(288deg) translateZ(500px);
        }
        
        .photo img:nth-child(10) {
            transform: rotateY(324deg) translateZ(500px);
        }
        
        .photo img:nth-child(11) {
            transform: rotateY(360deg) translateZ(500px);
        }
        /* 创建动画
        1、Y轴每次旋转90deg,最大到360
        2、为了达到一上一下的效果,让X轴旋转10deg
         */
        
        @keyframes animation {
            0% {
                transform: rotateX(0deg) rotateY(0deg);
            }
            25% {
                transform: rotateX(10deg) rotateY(90deg);
            }
            50% {
                transform: rotateX(0deg) rotateY(180deg);
            }
            75% {
                transform: rotateX(-10deg) rotateY(270deg);
            }
            100% {
                transform: rotateX(0deg) rotateY(360deg);
            }
        }
    </style>
</head>

<body>
    <div class="photo">
        <img src="./images/01.jpg" alt="">
        <img src="./images/02.jpg" alt="">
        <img src="./images/03.jpg" alt="">
        <img src="./images/04.jpg" alt="">
        <img src="./images/05.jpg" alt="">
        <img src="./images/06.jpg" alt="">
        <img src="./images/07.jpg" alt="">
        <img src="./images/08.jpg" alt="">
        <img src="./images/09.jpg" alt="">
        <img src="./images/10.jpg" alt="">
        <img src="./images/11.jpg" alt="">
    </div>
    <audio autoplay="autoplay" loop="loop" controls>
        <source src="./audio/弹钢琴的楠楠 - 【钢琴】windy hill(翻自 羽肿).mp3" type="audio/mp3">
        <source src="./audio/弹钢琴的楠楠 - 【钢琴】windy hill(翻自 羽肿).ogg" type="audio/ogg">
    </audio>

</body>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

御弟謌謌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值