css3 animation实现逐帧动画

css3里面的animation属性非常强大,但是自己用的比较少,最近有次面试就刚好被问到了,趁现在有时间就对animation做一个小总结。同时实现一个逐帧动画的demo作为练习


animation属性一览

因为animation属性比较多,然后在w3c上看有点蛋疼,干脆也做了一份导图,以后想查看,就一目了然了


使用animation实现逐帧动画

熟悉了animation的属性之后,得找个简单的小项目实现下,逐帧动画好有意思,先跑一个满足下自己
思路很简单,就是给元素一个雪碧图的背景,然后添加的帧动画更改background-position,关键代码:

@keyframes run{
    from{
        background-position: 0 0;
    }
    to{
        background-position: -1540px 0 ;
    }
}
div{
    width:140px;
    height:140px;
    background: url(run.png) ;
    animation-name:run;
    animation-duration:1s;
    animation-iteration-count:infinite;
}

但是跑起来后我们发现,每帧动画之间帧动画都是滑动,并不是我们要的效果,为什么呢?
原来animation默认以ease方式过渡,它会在每个关键帧之间插入补间动画,所以动画效果是连贯性的
知道原因就好办了,解决思路就是:

@keyframes run{
    0%, 8%{  /*动作一*/  }
    9.2%, 17.2%{  /*动作二*/  }
    ...
}

step1:动作之间停留8帧,0%设置动作一,动作一结束在8%
step2:动作之间过渡1.2帧,9.2%设置动作二,动作二结束在17.2%

完整代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>css3逐帧动画</title>
 6     <style>
 7     @keyframes run{
 8     0%, 8%{  background-position: 0 0;  }
 9     9.2%, 17.2%{  background-position: -140px 0;  }
10     18.4%, 26.4%{  background-position: -280px 0 ;  }
11     27.6%, 35.6%{  background-position: -420px 0 ;  }
12     36.8%, 44.8%{  background-position: -560px 0 ;  }
13     46%, 54%{  background-position: -700px 0 ;  }
14     55.2%, 63.2%{  background-position: -840px 0 ;  }
15     64.4%, 72.4%{  background-position: -980px 0 ;  }
16     73.6%, 81.6%{  background-position: -1120px 0 ;  }
17     82.8%, 90.8%{  background-position: -1400px 0 ;  }
18     92%, 100%{  background-position: -1540px 0 ;  }
19     }
20     @-webkit-keyframes run{
21     0%, 8%{  background-position: 0 0;  }
22     9.2%, 17.2%{  background-position: -140px 0;  }
23     18.4%, 26.4%{  background-position: -280px 0 ;  }
24     27.6%, 35.6%{  background-position: -420px 0 ;  }
25     36.8%, 44.8%{  background-position: -560px 0 ;  }
26     46%, 54%{  background-position: -700px 0 ;  }
27     55.2%, 63.2%{  background-position: -840px 0 ;  }
28     64.4%, 72.4%{  background-position: -980px 0 ;  }
29     73.6%, 81.6%{  background-position: -1120px 0 ;  }
30     82.8%, 90.8%{  background-position: -1400px 0 ;  }
31     92%, 100%{  background-position: -1540px 0 ;  }
32     }
33     div{
34         width:140px;
35         height:140px;
36         background: url(http://images2015.cnblogs.com/blog/754767/201606/754767-20160601000042992-1734972084.png) ;
37         animation:run 1s infinite;
38             -webkit-animation:run 1s infinite;
39         animation-fill-mode : backwards;
40             -webkit-animation-fill-mode : backwards;
41     }
42     </style>
43 </head>
44 <body>
45     <div></div>
46 </body>
47 </html>



还有另外一个实现方法,就是利用steps(),就是帧之间的阶跃动画,这个在w3c里面没有写,先贴个图

由上图可知:
steps(1,start):动画一开始就跳到 100% 直到这一帧(不是整个周期)结束
steps(1,end):保持 0% 的样式直到这一帧(不是整个周期)结束
另外也可以直接设置
animation-timing-function:step-start/step-end
step-start效果等同于steps(1,start),step-end效果等同于steps(1,end)

最终效果,因为录制的问题可能有点卡顿,有兴趣的同学可以直接复制代码去跑下:

完整代码:

  1 <!DOCTYPE html>
  2     <html lang="en">
  3     <head>
  4         <meta charset="UTF-8">
  5         <title>css3逐帧动画</title>
  6         <style>
  7         @keyframes run{
  8             0%{
  9                 background-position: 0 0;
 10             }
 11             8.333%{
 12                 background-position: -140px 0;
 13             }
 14             16.666%{
 15                 background-position: -280px 0 ;
 16             }
 17             25.0%{
 18                 background-position: -420px 0 ;
 19             }
 20             33.333%{
 21                 background-position: -560px 0 ;
 22             }
 23             41.666%{
 24                 background-position: -700px 0 ;
 25             }
 26             50.0%{
 27                 background-position: -840px 0 ;
 28             }
 29             58.333%{
 30                 background-position: -980px 0 ;
 31             }
 32             66.666%{
 33                 background-position: -1120px 0 ;
 34             }
 35             75.0%{
 36                 background-position: -1260px 0 ;
 37             }
 38             83.333%{
 39                 background-position: -1400px 0 ;
 40             }
 41             91.666%{
 42                 background-position: -1540px 0 ;
 43             }
 44             100%{
 45                 background-position: 0 0 ;
 46             }
 47         }
 48         @-webkit-keyframes run{
 49             0%{
 50                 background-position: 0 0;
 51             }
 52             8.333%{
 53                 background-position: -140px 0;
 54             }
 55             16.666%{
 56                 background-position: -280px 0 ;
 57             }
 58             25.0%{
 59                 background-position: -420px 0 ;
 60             }
 61             33.333%{
 62                 background-position: -560px 0 ;
 63             }
 64             41.666%{
 65                 background-position: -700px 0 ;
 66             }
 67             50.0%{
 68                 background-position: -840px 0 ;
 69             }
 70             58.333%{
 71                 background-position: -980px 0 ;
 72             }
 73             66.666%{
 74                 background-position: -1120px 0 ;
 75             }
 76             75.0%{
 77                 background-position: -1260px 0 ;
 78             }
 79             83.333%{
 80                 background-position: -1400px 0 ;
 81             }
 82             91.666%{
 83                 background-position: -1540px 0 ;
 84             }
 85             100%{
 86                 background-position: 0 0 ;
 87             }
 88         }
 89         div{
 90             width:140px;
 91             height:140px;
 92             background: url(http://images2015.cnblogs.com/blog/754767/201606/754767-20160601000042992-1734972084.png) ;
 93             animation:run 1s steps(1, start) infinite;
 94                 -webkit-animation:run 1s steps(1, start) infinite;
 95         }
 96         </style>
 97     </head>
 98     <body>
 99         <div></div>
100     </body>

时间: 2024-10-14 05:18:40

css3 animation实现逐帧动画的相关文章

Android动画效果之Frame Animation(逐帧动画)(二)(

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). Frame Animation(逐帧动画): 逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样.和补间动画一样可以通过xml实现也可以通过java代码实现.接下来借助目前项目中的一个开奖的动画来总结

Android动画效果之Frame Animation(逐帧动画)

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). 其他几种动画效果: Android动画效果之Tween Animation(补间动画) Android动画效果之Frame Animation(逐帧动画) Android动画效果之初识Property Animation(属性动画) Android动画效果之Prop

background-position和animation制作逐帧动画

利用background-position和animation制作逐帧动画,成品如下: html里面只要写一个元素就够了,动画我们把图片添加成背景做,再让背景在元素内移动.我用了一个整合图片,7个片段 *{margin:0;padding:0;} section{ width: 180px; height: 300px; background: url(images/charector.png) no-repeat; margin: 50px auto; border: 2px solid re

实现逐帧动画和补间动画两种动画效果

1.逐帧动画(Frame Animation)通常在Android项目的res/drawable/目录下面定义逐帧动画的XML模板文件.编码的时候,需要在动画模板文件的<animation-list>标签中依次放入需要播放的图片,并设置好播放的间隔时间. <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"

CSS3 animation 逐帧动画

前言 css3 loading动画 animation介绍 定义和用法 animation属性是一个简写属性,用于设置六个动画属性. animation: name duration timing-function delay interation-count direction; 值 描述 animation-name 规定需要绑定到选择器的keyframe名称 animation-duration 规定完成动画所花费的时间,以秒或毫秒为计 animation-timing-function

css3 实现逐帧动画

实现逐帧动画需要使用到的是Animation动画,该CSS3的Animation有八个属性:分别是如下:1: animation-name2: animation-duration3: animation-delay4: animation-iteration-count5: animation-direction6: animation-play-state7: animation-fill-mode8: animation-timing-function 含义分别如下:animation-n

Android Animation 动画Demo(Frame逐帧动画)

上一篇介绍了Animation动画其一:Tween补间动画. 这篇文章接下来介绍Animation另一种动画形式:Frame逐帧动画. Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现(后面会给出这两种实现方式的源代码Demo). 下面分别介绍: 一.定义在xml中实现: 实现效果图: 源代码: 布局文件:main.xml: <?xml version="1.0" encodin

Android笔记(六十三) android中的动画——逐帧动画( frame-by-frame animation)

就好像演电影一样,播放实现准备好的图片,来实现动画效果. 逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可. android提供两种方法为AnimationDrawable添加帧:XML定义和JAVA代码创建. XML 因为动画帧的资源需要是一个Drawable对象,所以需要把它放到Drawable目录下.在<animation-list>使用<item>来添加一帧 anima.xml <?xml

逐帧动画-AnimationDrawable的简单用法

将Animation设置为ImageView的backgrond即可 MainActivity.java: import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget