css3 弹性效果上下翻转demo

最近扒了一个有弹性效果上下翻转demo

上图:

上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    @-webkit-keyframes show
    {
        0%   {
                transform:rotateX(180deg);
                opacity:0;
             }
        50%   {
                transform:rotateX(-25deg);
                opacity:1;
             }
        60%   {
                transform:rotateX(18deg);
                opacity:1;
             }
        70%   {
                transform:rotateX(-13deg);
                opacity:1;
             }
        80%   {
                transform:rotateX(8deg);
                opacity:1;
             }
        90%   {
                transform:rotateX(-6deg);
                opacity:1;
             }
        100% {
                transform:rotateX(0deg);
                opacity:1;
             }
    }
    @-webkit-keyframes hide
    {
        0%   {
                transform:rotateX(0deg);
                opacity:1;
             }
        
        100% {
                transform:rotateX(-180deg);
                opacity:0;
             }
    }
    *{ margin:0; padding:0;}
    li{ list-style: none;}
    .box{ position:relative;  width:300px; height:200px; margin:100px auto; }
    .box-ul,.box li{width:300px; height:200px;}
    .box-ul{transform-style:preserve-3d;perspective:800px;}
    .box li{ position:absolute;  background-size:cover; background-position:-50% -50%;transform:rotateX(180deg);transform-origin:bottom ; opacity:0;}
    .box li.show{-webkit-transform:rotateX(0deg);-webkit-animation: show .6s; opacity:1;}
    .box li.hide{-webkit-transform:rotateX(180deg); -webkit-animation: hide .6s;opacity:0;}
    .box a{ position:absolute; top:50%;transform: translateY(-50%) ; width:50px; height:50px; line-height: 50px; font-size: 14px; text-decoration: none; color:#fff; text-align:center; border-radius:50%; background-color:red;}
    .box a:nth-of-type(1){left:-80px;}
    .box a:nth-of-type(2){right:-80px;}

    
    </style>
    <script>
    window.onload = function(){

        var aA = document.getElementsByTagName('a'),
            aLi = document.getElementsByTagName('li');
        var len = aLi.length-1,
            n = 0;

        aA[0].onclick = function(){
            aLi[n].className = "hide";
            n--;
            n = n < 0 ? len : n;
            aLi[n].className = "show";
        }
        aA[1].onclick = function(){
            aLi[n].className = "hide";
            n++;
            n = n > len ? 0 : n;
            aLi[n].className = "show";
        }

    }
    </script>
</head>
<body>
    <div class="box">
        <ul class="box-ul">
            <li class="show" style=" background-image:url(1.jpg)"></li>
            <li style=" background-image:url(2.jpg)"></li>
            <li style=" background-image:url(3.jpg)"></li>
            <li style=" background-image:url(4.jpg)"></li>
            <li style=" background-image:url(5.jpg)"></li>
        </ul>
        <a href="javascript:;">上一张</a>
        <a href="javascript:;">下一张</a>
    </div>
</body>
</html>

演示:demo

扒代码心得:

初次看到这个效果感觉主要是JS做的

因为翻转上来有弹性运动,直接想的是JS弹性运动 不知道CSS3也可是设置  当时仅仅知道 transition 过去 也知道 animation 仅仅理解成 从 A点到B点 

 

用 ul 用css3 转成 3D (transform-style:preserve-3d)同时加上景深 perspective:800px; (张鑫旭大神对景深的解释:http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/  )我个人简单粗暴的理解就是:给了一个三维的视角 ,

rotateX,rotateY,rotateZ 就能 X轴、Y轴、Z轴 设置3D了,换句话说不加其实还是2D平面。

li 初始X轴旋转 transform:rotateX(180deg) 在设置旋转的基点 根据li的底边旋转 (transform-origin:bottom);
然后 分别 有两个 class 分别 show(翻转上来)、hide(翻转下去);同时也写两个 animation 对应 keyframes show,keyframes hide
.show:虽然有keyframes show 运动 但是最后还要设置它的运动的最终点 transform:rotateX(0deg);
.hide:同理
keyframes show 是从 180deg 到 0deg 然后 弹性运动 其实就是 在 50% 的时候 运动 -25deg 10%的频率 来回的设置 deg 达到 弹性的运动,最开始一直这只不好,仔细看别人的代码发现是有规律逐次减少deg,
keyframes hide 仅仅是从 transform:rotateX(0deg); 到 transform:rotateX(-180deg); 同时还有透明度;

剩下的就是 JS 切换给class


 

posted @ 2015-04-03 15:50  uustoboy  阅读(1615)  评论(0编辑  收藏  举报