写css3动画的时候,我们经常用到animation来实现,默认情况下,animation是属于连贯性的ease动画。我们熟悉的animation动画有ease、ease-in、ease-out、linear、cubic-bezier等补间过段函数,当然还有我们可能不是很熟悉的steps跳帧函数。我们在做一些特殊的动画,比如一个飘动的旗子、一个奔跑的小人,这些动画不需要补间,这时候需要的是跳帧steps。

逐帧动画实现方法:

1、把动画帧切图合并在一起

2、通过CSS3的animation控制background-position

方法很简单,这里使用到的就是前面提到的过度函数steps

steps使用:

steps 函数指定了一个阶跃函数,第一个参数指定了时间函数中的间隔数量(必须是正整数);第二个参数可选,接受 start 和 end 两个值,指定在每个间隔的起点或是终点发生阶跃变化,默认为 end

比如:steps(1,start)、steps(1,end)或者steps(1)

这样讲很抽象,即使记住了,真正在做动画的时候也可能搞混

逐帧动画实例:

下面通过一个数字(1—5)变化动画来看看到底start和end两个会有什么不同的效果:

1、steps(1,start)效果

先看下背景合并图:

代码(这里只写webkit的前缀,其它的兼容前缀在实际项目中自己补全):

.ani1{
    height:200px;
    width:200px;
    background:url(img/bg.png) no-repeat 0 0;
    -webkit-animation:num_ani 2s steps(1,start) infinite;/*效果1*/
}
.ani2{
    height:200px;
    width:200px;
    background:url(img/bg.png) no-repeat 0 0;
    -webkit-animation:num_ani 2s steps(1) infinite;/*效果2*/
}
 
@-webkit-keyframes num_ani{
    0% {
        background-position:0;
    }
    20% {
       background-position:-200px 0;
    }
    40% {
       background-position:-400px 0;
    }
    60% {
       background-position:-600px 0;
    }
    80% {
       background-position:-800px 0;
    }
    100% {
       background-position:-1000px 0;
    }
}

效果gif截图:

分析:效果一里面的数字‘1’没有显示出来,而且后面那个边空白了,效果二达到预期效果。

通过上面的栗子,相信已经明白了steps的第二个参数的区别了。再看看上面keyframes的设置,我们要的效果其实是5个变化,但是我们写了6帧的时间点。我们的第五个数字的背景是 background-position:-800px 0,为什么上面的帧要写到background-position:-1000px 0;

一开始,我们可能按照以前连贯的动画写法,但是这里是以跳帧的形式运行动画的。比如说,我们要见到数字1(也是0%-20%之间),那么我们应该显示0到-200px之间的背景。也就是说我们的逐帧动画的帧数应该加1的。

点击在线demo:

css3逐帧动画DEMO》》》

旗子飘动例子:

细心的童鞋可以看到,上面例子的steps的第一个参数都是取值1,取值为1的意思是指动画在一步完成,然后具体的跳帧是需要我们自己在keyframes里面设置。

旗子飘动代码:

.ani3{
    height:55px;
    width:60px;
    margin:100px;
    background:url(images/flag.png) no-repeat 0 0;
    -webkit-animation:flag_ani 0.8s steps(5) infinite;
}
 
@-webkit-keyframes flag_ani{
    100% {
       background-position:0 -282px;
    }
}

从上面可以看到,keyframes代码比数字变化的动画写法简单了很多,这是因为用了steps(5),整个旗子的变化由5张图组成,下面是背景图的雪碧图:

steps里面指定动画的步数,然后在keyframes里面指定整个背景的position,像上面的旗子雪碧图的高度就是282px,然后steps函数就会把他平均分成5份,也就是282/5。平均这个词很重要,也是他和前面steps(1)的主要区别。前面我们把整个动画看做一步完成,然后在keyframes里面具体的定义各个帧。而steps(5)是代码帮你平均分,如果你的雪碧图合拼的间距不一致,会出现动画错位的问题。

效果gif截图:

点击在线demo:

css3逐帧动画DEMO》》》

css3逐帧动画的更多相关文章

  1. css3 animation实现逐帧动画

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

  2. css3 实现逐帧动画

    css3 实现逐帧动画 实现逐帧动画需要使用到的是Animation动画,该CSS3的Animation有八个属性:分别是如下:1: animation-name2: animation-durati ...

  3. CSS3 animation属性中的steps实现GIF动图(逐帧动画)

    相信 animation 大家都用过很多,知道是 CSS3做动画用的.而我自己就只会在 X/Y轴 上做位移旋转,使用 animation-timing-function 规定动画的速度曲线,常用到的 ...

  4. animation中的steps()逐帧动画

    在我们平时做宽高确定,需要背景图片切换的效果时,我如果用的是一张大的png图片.而且恰好是所有小图都是从左向右排列的,那么 我们只需测量出某一个小图距左侧有多少像素(x),然后我们banckgroun ...

  5. 利用css3-animation来制作逐帧动画

    前言 趁着还没有元旦之前先码一篇文章,不然到时候估计又被各种虐了,所以趁现在还有力气先来一篇.今天来聊聊css3中的动画属性animation,对这个属性懵懂是在很早的时候有前辈用这个 animati ...

  6. 使用node.js开发一个生成逐帧动画小工具

    在实际工作中我们已经下下来不下于一万个npm包了,像我们熟悉的 vue-cli,react-native-cli 等,只需要输入简单的命令 vue init webpack project,即可快速帮 ...

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

    前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...

  8. Android 逐帧动画

    原理: 逐帧动画是最简单的一种动画.原理就是把几张图片连续显示出来,以达到动画的效果.就相当于下面这种手绘翻页动画啦~ 实现: 1.需要建立一个animation-list来设置静态图片资源.持续时间 ...

  9. 逐帧动画(Frame-by-frame Animations)

    1.这一类动画可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示. xml定义方法 <animation-list xmlns:android=" ...

随机推荐

  1. Python使用pip安装Numpy模块

    安装Numpy模块一般有两种安装方法: 一:下载模块对应的.exe文件,直接双击运行安装 二:下载模块对应的.whl文件,使用pip安装 对于exe文件的安装比较简单,都是双击运行,这里就不说了. 这 ...

  2. JQuery DOM操作(属性操作/样式操作/文档过滤)

    jQuery——入门(三)JQuery DOM操作(属性操作/样式操作/文档过滤) 一.DOM属性操作 1.属性 (1).attr() 方法 语法:$(selector).attr(name|prop ...

  3. POJ - 3728:The merchant (Tarjan 带权并查集)

    题意:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 思路 ...

  4. jQuery 查找和过滤

    通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤. 最常见的查找是在某个节点的所有子节点中查找,使用find()方法,它本身 ...

  5. djiango-异步发送邮件--celery

    安装 pip install celery==4.2.0 # celery4.x支持django1.11以上版本 试了好几个版本 就4.2.0能发送成功 1.项目目录里新建一个celery的包cele ...

  6. Cocos2d-x学习小结 开始篇

    Cocos2d-x学习小结 开始篇 想要学习Cocos2d-x,是因为在高中物理课上找不到某些物理定律的证明,例如欧姆定律. 为此,我翻阅了稍高等级的物理教材,其中关于欧姆定律\(R=\frac{U} ...

  7. TED演讲:别不信,你只需20个小时,就能学会任何事情!

    https://www.bilibili.com/video/av50668972/?spm_id_from=333.788.videocard.3 two years ago, my life ch ...

  8. h5自带的日期类型input

    在很多页面和web应用中都有输入日期和时间的地方,最典型的是订飞机票,火车票,酒店,批萨等网站. 在HTML5之前,对于这样的页面需求,最常见的方案是用Javascript日期选择组件.这几乎是无可争 ...

  9. box-sizing 盒子模型

    一.概念 ①外加模式: box-sizing: content-box 这是由 CSS2.1 规定的宽度高度行为.宽度和高度分别应用到元素的内容,在宽度和高度之外绘制元素的内边距,即宽和高不包括内边距 ...

  10. linux命令之------Find命令

    Find命令 1)作用:用来在指定目录下查找文件. 2)案例:将当前目录及其子目录下所有延申档名是c的文件列出来. Find -name “*.txt” 其中:*表示通配任意个字符:?表示通配单个字符 ...