CSS3 动画之关键帧动画

2,105 阅读2分钟

先看一个Demo

取材于 慕课网

七夕言情动画 - code

animation-timing-function

  • 是控制状态变化的时间属性(作用于每两个关键帧之间,而不是整个动画)
  • steps(n,[start/end]) - 越阶函数,默认第二个参数为end,steps(1, start) 等于step-start
  • 0%{}20%{},steps(3),表示0%到20%之间变换时,用了3步完成
  • start: 以下一帧的显示效果来填充间隔动画
  • end:以上一帧的显示效果来填充间隔动画

什么是逐帧动画?

废话不多说,直接上图

au80t-1ev4e.gif

这怎么玩的?

通过现象看本质:其实就是,在肉眼可见的范围内,不停地更换背景图片,background-image

  • 假设一张一张地更换图片,那么势必会有卡顿的现象

  • 那么咱们可以使用雪碧图 CSS Sprite(backgound-image、background-position)

    • 运动 = 关键帧动画 + 雪碧图背景坐标变化

x77u5-wi2wb.gif

-   图片 384 x 192,每一个人物为 96 x 96,`backgound-image` 的左顶点为原点(0,0)
-   设置图片大小为96px
-   第一行第一列:backgorund-position: 0 0时
-   第一行第二列:backgorund-position: -96px 0px
-   第二行第一列:backgorund-position: 0px -96px
  • 用雪碧图做精灵动画会有一个问题,必须通过绝对尺寸获取图片坐标,否则就会出错

    • 雪碧图的自适应两种方案:background-size(推荐),scale

38ce8275-d68f-4e1c-a634-1016cd10d9cd.png

  • 现在,开始让雪碧图动起来吧

    • 运动 = 关键帧动画 + 雪碧图背景坐标变化

318748ec-1c80-47d8-b5f1-9d1e41e2641b.png

.bird {
   min-width: 140px;
   min-height: 95px;
   top: 10%;
   right: 10%;
   position: absolute;
   z-index: 10;
   background: url(bird.png);
   background-size: 300% 100%;
   /*写法1  400ms 换一次位置,一共3个图*/
   animation: bird-slow 400ms steps(3) infinite;
   /*写法1*/
   /* animation: bird-slow 400ms steps(1, start) infinite; */
}

/*写法一*/
bird-slow {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: -300% 0;
  }
}

/*写法二*/
/* @-webkit-keyframes bird-slow {
   0%{background-position:0 0;}
   50%{background-position:-100% 0;}
   75%{background-position:-200% 0;}
   100%{background-position:-300% 0;}
 } */

CSS Sprite 小工具