20 January 2015

今天突然翻出自己之前做的一个项目,看看了之前的需求有一个动画条需要在用户播放时动画条就闪动,暂停就停止不动。当时自己年少无知,以为实现不了就利用一个gif蒙混过去了。自从在移动端写了大量的animation动画后,发现animation可以实现此需求,所以决定将gif给废掉,自己模仿一个。

为什么不使用gif,而要使用animation来模仿了。

我们知道每个动画都是由三个过程来组成的:“开始——过渡——结束”,然而我们使用gif图的时候无法获取这些状态,可是css3却可以。我们可以利用这三个过程来控制我们想要的效果,这样使用的灵活度就高了。

制作之前,首先我们需要了解css3的amimation是啥东西,简单来说就是逐帧动画。以下是amimation的属性。

1、animation-name  引用动画名称

2、animation-duration  动画的持续时间

3、animation-timing-function   时间函数简单来说就是过渡效果

4、animation-delay  动画延迟时间

5、animation-iteration-count  动画播放次数

6、animation-direction  动画运动方向

7、animation-fill-mode  动画时间之外的状态

8、animation-play-state  动画当前的状态

下面我们开始来模拟gif,首先我们先简单的布一个局

html code:
    <div class="m-gif">
        <div class="inner"></div>
    </div>
    <div class="m-btn">
        <div class="btn-play" id="J_btn_play">播放</div>
        <div class="btn-pause" id="J_btn_pause">暂停</div>
    </div>

css code:
    body,html{
        width: 100%;
        height: 100%;
        overflow: hidden;
        background-color: #000;
    }
    .m-gif{
        position: relative;
        width: 200px;
        height: 200px;
        margin: 0 auto;
        top:50%;
        display: -webkit-box;
        -webkit-box-align:center;
        -webkit-box-pack:center;
        margin-top: -101px;
        border: 1px solid #fff;
    }
    .m-gif .inner{
        width: 18px;
        height: 13px;
    }
    .m-btn{
        position: relative;
        margin: 0 auto;
        width: 200px;
        color: #fff;
        top:50%;
        margin-top:20px;
        display: -webkit-box;
        -webkit-box-pack:justify;
    }
    .m-btn > div{
        border: 1px solid #fff;
        width: 50px;
        text-align: center;
        line-height: 50px;
        cursor: pointer;
        -webkit-user-select:none;
    }

布局做好了,然后我们将所需要的图片拼成一张雪碧图,为何?相信很多人都知道了,原因很简单,假如你的动画条是由10个动画组合而成,而每一个动画都是一个图片。也就是说你浏览器需要请求10次,然后拼成雪碧图后浏览器只会请求一次,再利用background-position改变所要显示的图片即可。

我们需要动画条动起来靠上面的是实现不了的,所要我们需要加上amimation。

css code:
    .m-gif .inner{
        background: url(music.png) no-repeat;
        -webkit-amintion-name:gif;
        -webkit-animation-duration:1s;
        -webkit-animation-iteration-count:infinite;
        -webkit-animation-play-state:running;
    }

动画的运动过程:

keyframes code:

    @-webkit-keyframes gif{
        from{
            background-position: 0 0;
        }
        10%{
            background-position: -25px 0;
        }
        20%{
            background-position: -50px 0;
        }
        30%{
            background-position: -75px 0;
        }
        40%{
            background-position: -100px 0;
        }
        50%{
            background-position: 0px -19px;
        }
        60%{
            background-position: -25px -19px
        }
        70%{
            background-position: -50px -19px
        }
        80%{
            background-position: -75px -19px
        }
        90%{
            background-position: -100px -19px
        }
        to{
            background-position: 0 0;
        }
    }

写完之后我们发现背景会连续的平移过去,这不是我们想要的效果。这里就要用到animation-timing-function这个属性,因为我们想要的效果是从第一帧直接跳转到下一帧,而不是连续的。所以我们需要一个用到animation-timing-function中steps这个值。简单来说就是一个阶跃时间函数。

steps可以有两个取值,
第一个参数设定时间函数中的间隔次数,必须为正数。
第二个参数可选,设定动画在间隔的开始还是结束发生阶跃变化,默认end。

有了这个我们就可以来实现我们所需要的效果。

css code:
    .m-gif .inner{
        animation-timing-function:step-start; /*相当于steps(1, start)*/
    }

这样我们的‘gif’就出来了。不过还有最后一个需求,就是控制动画条的播放与暂停。

amimation为我们提供了animation-play-state这个属性。作用主要是来控制动画的播放与暂停。

当取值为running时动画播放。

当取值为paused时动画播放。

最后我们完善我们的代码将播放暂停功能加上。因为打开页面动画条就是播放的,所以当我们按下暂停添加class来使动画条停止。

css code:    
    .m-gif.pause .inner{
        -webkit-animation-play-state:paused;
    }

到此我们的‘gif’就模拟成功了。



blog comments powered by Disqus