CSS3动画结合js实现3D轮播

Posted nurdun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSS3动画结合js实现3D轮播相关的知识,希望对你有一定的参考价值。

昨天晚上有个同行提出要做一个旋转式的3D轮播图(下面统称banner图)。我就为了帮他看了一下相关的技术贴发现符合要求的很少,所以只能自己去动手写了。看到有人写了CSS3立体旋转动画的博客,我就想把这个动画拆分成几个模块来做一个banner效果可不可以?最后自己动手写了一下还是可以的。不过这个banner效果还是存在一些bug,因为不是急用所以我也没有修复。以后有空我会修复的。

html部分代码

  <div class="container">
        <div class="carouse" id="carouse">
            <div class="pic1">1</div>
            <div class="pic2">2</div>
            <div class="pic3">3</div>
            <div class="pic4">4</div>
            <div class="pic5">5</div>
            <div class="pic6">6</div>
            <div class="pic7">7</div>
            <div class="pic8">8</div>
            <div class="pic9">9</div>
        </div>
    </div>
    <div class="btn-group">
        <button id="prev">上一个</button>
        <button id="next">下一个</button>
    </div>

css代码

*{
            margin:0;
            padding: 0;
        }
        .container{
            width: 210px;
            height:140px;
            position: relative;
            font-size: 32px;
            color: #FFFFFF;
            text-align: center;
            line-height: 90px;
            margin: 200px auto;
            perspective: 1000px;
        }
        .carouse{
            transform-style:preserve-3d;

        }
        .carouse div{
            display: block;
            position: absolute;
            width: 140px;
            height: 90px;
            border: 2px solid black;
        }
        .btn-group{
            display: block;
            margin:100px auto;
            width: 240px;
            height: 30px;
        }
        .btn-group button{
            width: 80px;
            height: 100%;
        }


        .carouse .pic1{
            background:rgba(255,9,15,0.7);
            transform: rotateY(0deg) translateZ(210px);
        }
        .carouse .pic2{
            background:rgba(100,9,100,0.7);
            transform: rotateY(40deg) translateZ(210px);
        }
        .carouse .pic3{
            background:rgba(50,50,15,0.7);
            transform: rotateY(80deg) translateZ(210px);
        }
        .carouse .pic4{
            background:rgba(150,100,200,0.7);
            transform: rotateY(120deg) translateZ(210px);
        }
        .carouse .pic5{
            background:rgba(120,120,120,0.7);
            transform: rotateY(160deg) translateZ(210px);
        }
        .carouse .pic6{
            background:rgba(110,9,250,0.7);
            transform: rotateY(200deg) translateZ(210px);
        }
        .carouse .pic7{
            background:rgba(80,200,15,0.7);
            transform: rotateY(240deg) translateZ(210px);
        }
        .carouse .pic8{
            background:rgba(180,150,100,0.7);
            transform: rotateY(280deg) translateZ(210px);
        }
        .carouse .pic9{
            background:rgba(255,150,0,0.7);
            transform: rotateY(320deg) translateZ(210px);
        }


        /*=== 下一个动画 ===*/
        @keyframes to-scroll1 {
            0%{
                transform: rotateY(0deg);
            }

            100%{
                transform: rotateY(-40deg);

            }

        }
        #carouse1{
            animation: to-scroll1  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll2 {
            0%{
                transform: rotateY(-40deg);
            }

            100%{
                transform: rotateY(-80deg);

            }

        }
        #carouse2{
            animation: to-scroll2  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll3 {
            0%{
                transform: rotateY(-80deg);
            }

            100%{
                transform: rotateY(-120deg);

            }

        }
        #carouse3{
            animation: to-scroll3  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll4 {
            0%{
                transform: rotateY(-120deg);
            }

            100%{
                transform: rotateY(-160deg);

            }

        }
        #carouse4{
            animation: to-scroll4  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll5 {
            0%{
                transform: rotateY(-160deg);
            }

            100%{
                transform: rotateY(-200deg);

            }

        }
        #carouse5{
            animation: to-scroll5  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll6 {
            0%{
                transform: rotateY(-200deg);
            }

            100%{
                transform: rotateY(-240deg);

            }

        }
        #carouse6{
            animation: to-scroll6  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll7 {
            0%{
                transform: rotateY(-240deg);
            }

            100%{
                transform: rotateY(-280deg);

            }

        }
        #carouse7{
            animation: to-scroll7  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll8 {
            0%{
                transform: rotateY(-280deg);
            }

            100%{
                transform: rotateY(-320deg);

            }

        }
        #carouse8{
            animation: to-scroll8  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll9 {
            0%{
                transform: rotateY(-320deg);
            }

            100%{
                transform: rotateY(-360deg);

            }

        }
        #carouse9{
            animation: to-scroll9  2s ease both;
            /*animation-fill-mode: both;*/
        }

       /* @keyframes to-scroll10 {
            0%{
                transform: rotateY(-360deg);
            }

            100%{
                transform: rotateY(-400deg);

            }

        }
        #carouse10{
            animation: to-scroll10  2s ease both;
            /*animation-fill-mode: both;*/
        }*/




        /* === 上一个动画 ===*/

        @keyframes to-scroll21 {
            0%{
                transform: rotateY(-40deg);
            }

            100%{
                transform: rotateY(0deg);

            }

        }
        #carouse21{
            animation: to-scroll21 2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll22 {
            0%{
                transform: rotateY(-80deg);
            }

            100%{
                transform: rotateY(-40deg);

            }

        }
        #carouse22{
            animation: to-scroll22  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll23 {
            0%{
                transform: rotateY(-120deg);
            }

            100%{
                transform: rotateY(-80deg);

            }

        }
        #carouse23{
            animation: to-scroll23  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll24 {
            0%{
                transform: rotateY(-160deg);
            }

            100%{
                transform: rotateY(-120deg);

            }

        }
        #carouse24{
            animation: to-scroll24  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll25 {
            0%{
                transform: rotateY(-200deg);
            }

            100%{
                transform: rotateY(-160deg);

            }

        }
        #carouse25{
            animation: to-scroll25  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll26 {
            0%{
                transform: rotateY(-240deg);
            }

            100%{
                transform: rotateY(-200deg);

            }

        }
        #carouse26{
            animation: to-scroll26  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll27 {
            0%{
                transform: rotateY(-280deg);
            }

            100%{
                transform: rotateY(-240deg);

            }

        }
        #carouse27{
            animation: to-scroll27  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll28 {
            0%{
                transform: rotateY(-320deg);
            }

            100%{
                transform: rotateY(-280deg);

            }

        }
        #carouse28{
            animation: to-scroll28  2s ease both;
            /*animation-fill-mode: both;*/
        }
        @keyframes to-scroll29 {
            0%{
                transform: rotateY(-360deg);
            }

            100%{
                transform: rotateY(-320deg);

            }

        }
        #carouse29{
            animation: to-scroll29  2s ease both;
            /*animation-fill-mode: both;*/
        }

        @keyframes to-scroll30 {
            0%{
                transform: rotateY(-400deg);
            }

            100%{
                transform: rotateY(-360deg);

            }

        }
        #carouse30{
            animation: to-scrol30  2s ease both;
            /*animation-fill-mode: both;*/
        }

js代码

var prevBut = document.getElementById("prev");
    var nextBut = document.getElementById("next");
    var carouse = document.getElementsByClassName("carouse")
    var state = 1;  //id的变化状态

    prevBut.addEventListener("click",function() {
        prev();
    }) ;

    nextBut.addEventListener("click",function() {
        next();
    }) ;



    function prev(){
        if( state == 1||state == 21){
            state = 29;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 2||state == 22){
            state = 21;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 3 || state == 23){
            state = 22;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 4 || state == 24){
            state = 23;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 5||state == 25){
            state = 24;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 6 || state == 26){
            state = 25;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 7 || state == 27){
            state = 26;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 8||state == 28){
            state = 27;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 9 || state == 29){
            state = 28;
            carouse.item(0).id = \'carouse\'+state;
        }else if(state == 10 || state == 30){
            state = 29;
            carouse.item(0).id = \'carouse\'+state;
        }
    }

    function next() {
        if( state == 1||state == 21){
            state = 1;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 2||state == 22){
            state = 2;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 3 || state == 23){
            state = 3;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 4 || state == 24){
            state = 4;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 5||state == 25){
            state = 5;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 6 || state == 26){
            state = 6;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 7 || state == 27){
            state = 7;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 8||state == 28){
            state = 8;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 9 || state == 29){
            state = 9;
            carouse.item(0).id = \'carouse\'+state;
            state++;
        }else if(state == 10 || state == 30){
            state = 1;
            carouse.item(0).id = \'carouse\'+state;
        }
    }

效果图

 

  

以上是关于CSS3动画结合js实现3D轮播的主要内容,如果未能解决你的问题,请参考以下文章

js动画之轮播图

css3 实现动画,变换基点及3D效果~

利用轮播原理结合hammer.js实现简洁的滑屏功能

CSS3实现炫酷游戏3D翻转动画制作

CSS3 3D酷炫立方体变换动画

JS自动渐变轮播