zoukankan      html  css  js  c++  java
  • 3d图片切换组件

    3d图片切换效果如下:

    一、要想完成这个效果,首先需要思考哪些东西:

      1.整体的dom布局.

      2.过渡动画效果:缩放

      3.原理:在做切换的时候,动态的改变了各个图片的样式,从而可以有切换的效果。

    二、dom布局:

      

    <div class="box">
            <div class="list">
                <ul>
                    <li class="p1">
                        <a href="#"><img src="img/1.png" alt="" /></a>
                    </li>
                    <li class="p2">
                        <a href="#"><img src="img/2.png" alt="" /></a>
                    </li>
                    <li class="p3">
                        <a href="#"><img src="img/3.png" alt="" /></a>
                    </li>
                    <li class="p4">
                        <a href="#"><img src="img/44.jpg" alt="" /></a>
                    </li>
                    <li class="p5">
                        <a href="#"><img src="img/55.jpg" alt="" /></a>
                    </li>
                    <li class="p6">
                        <a href="#"><img src="img/66.jpg" alt="" /></a>
                    </li>
                    <li class="p7">
                        <a href="#"><img src="img/77.jpg" alt="" /></a>
                    </li>
                </ul>
            </div>
    
            <a href="javascript:;" class="prev btn"><</a>
            <a href="javascript:;" class="next btn">></a>
        </div>

    布局的CSS如下:

    .box {
        position: relative;
        height: 380px;
        margin-top: 100px;
    }
    
    .list {
        position: absolute;
        width: 1200px;
        height: 300px;
        left: 50%;
        margin-left: -600px;
        overflow: hidden;
    }
    
    .list li {
        position: absolute;
        left: 0;
        top: 0;
        list-style: none;
        transition: all 0.3s ease-out;
    }
    
    .btn {
        position: absolute;
        width: 60px;
        height: 160px;
        line-height: 160px;
        text-align: center;
        top: 50%;
        margin-top: -80px;
        background: rgba(0, 0, 0, 0.4);
        text-decoration: none;
        color: white;
        font-size: 20px;
    }
    
    .next {
        right: 0;
    }
    
    .list img {
        width: 750px;
        height: 300px;
        border: none;
    }

    此时页面效果如下:

    图片现在全部重叠在元素list中。

    下面来规划一下元素里面各个li,我们给li添加了p1-p7各个类:

    我的想法是中间的p4元素作为主要显示的图片,p3,p5为左右两张图片,p1,p2,p6,p7可以全部隐藏起来:

    要做成上面效果,css如下(核心):

    .p1 {
        transform: translate3d(-450px, 0, 0) scale(0.8);
    }
    
    .p2 {
        transform: translate3d(-225px, 0, 0) scale(0.8);
    }
    
    .p3 {
        transform: translate3d(0px, 0, 0) scale(0.8);
        transform-origin: 0 50%;
        z-index: 2;
    }
    
    .p4 {
        transform: translate3d(225px, 0, 0) scale(1);
        z-index: 3;
    }
    
    .p5 {
        transform: translate3d(450px, 0, 0) scale(0.8);
        transform-origin: 100% 50%;
        z-index: 2;
    }
    
    .p6 {
        transform: translate3d(675px, 0, 0) scale(0.8);
    }
    
    .p7 {
        transform: translate3d(900px, 0, 0) scale(0.8);
    }

    先解释下这里的几个数据值:整个list元素宽1200,每一个图片宽度750,也就是说要让p4放在中间,需要让p4向右移动(1200-750)/2=225px;

    同时,要让p5在最右侧,需要让p5向右移动1200-750 = 450px;其余的移动距离可以自己计算一下。

    另外有一个关键点,p3,p5使用了transform-origin,如果不使用这个属性,页面效果如下:

    明明p3移动的是0px,p5移动的是450px,理论上是一个在最左端,一个在最右端,但此时,两个元素左右都有留一段距离;所以理解transform-origin属性很关键

    简单画了个草图:

     通过以上的操作及分析,界面已经达到需要的效果了,要想达到切换效果动态改变样式即可:

    $(function() {
    
        imgArr = ["p1", "p2", "p3", "p4", "p5", "p6", "p7"];
    
        $(".next").click(function() {
            next();
        })
    
        $(".prev").click(function() {
            prev();
        })
    
        /**
         * 上一张图片
         */
        function prev() {
            imgArr.unshift(imgArr[6]);
            imgArr.pop();
            $('li').each(function(i, e) {
                $(e).removeClass().addClass(imgArr[i]);
            })
        }
    
        /**
         * 下一张图片
         */
        function next() {
            imgArr.push(imgArr[0]);
            imgArr.shift();
            $('li').each(function(i, e) {
                $(e).removeClass().addClass(imgArr[i]);
            })
        }
    })
    联系作者: VX:Mm_Lewis
  • 相关阅读:
    模仿outlook快捷方式栏的一个控件
    买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))
    一个IE动画图标的小例子
    对水波特效实现原理的解释
    向量空间的几何变换
    一个简单Led控件
    【转载】配置(visual studio.net已检测到指定的web服务器运行的不是asp.net1.1版)
    最近学习ASP2.0相关的几个小问题(非创新性文章)
    一道c的面试题,大数相乘。
    Led控件(2)——Led显示屏模拟
  • 原文地址:https://www.cnblogs.com/lewis-messi/p/8980093.html
Copyright © 2011-2022 走看看