《CSS Secrets》是@Lea Verou最新著作,这本书讲解了有关于CSS中一些小秘密。是一本CSSer值得一读的一本书,经过一段时间的阅读,我、@南北和@彦子一起将在W3cplus发布一系列相关的读后感,与大家一起分享。

问题

通常,我们需要一个动画效果是比较难的或者说使用CSS的transition是不可能实现的。例如,一个卡通移动或一个复杂的进度条。在这种情况下,基于图像的逐帧动画是完美的,但是实现这种效果是具有挑战性的。

在这一点上,你可能会说:难道我们不能使用gif动画?很多情况下,答案是肯定的,gif动画是完美的。然而,他们也有一些缺点,可能在一些地方无法使用:

所有帧中被限制使用256色调色板

他们不能具有透明度,这是一个很大的问题。例如,下图所示的效果是很常见的。

在CSS中有些方面无法做修改,比如时间、重复和停顿等等。一旦生成gif文件,一切都存在文件中,只能通过一个图像编辑器来做修改或生成另一个文件。

上图是一个半透明的进度指示器(dabblet.com),这个是Gif图无法实现的效果。

早在2004年,Mozilla团队就解决了前两个问题,他们通过逐帧动画PNG文件,实现类似静态的方式或者动画的GIF文件。他们把这种设计称为APNG。但是,直到今天,支持APNG的浏览器和制图软件都非常有限。

开发人员甚至通过使用一个Sprite图和使用JavaScript脚本来动态更改background-position值,在浏览器中实现灵活的逐帧动画。你甚至可以找到一个小的库来完成,那么有没有一个简单的方法,使用CSS来实现这样的效果呢?

解决方案

假设我们所有帧动画用到的Sprites的PNG图如下所示:

我们有一个元素,用来制作加载动画(别忘了,在元素里面放些文本,提搞可访性!),元素大小是单帧动画的尺寸:

Loading...

.loader {

width: 100px;

height: 100px;

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%,-50%);

text-indent: 999px;

overflow: hidden;

background: url(http://www.w3cplus.com/sites/default/files/blogs/2015/1507/loader.png) 0 0;

}

目前结果如下图所示:

将显示的是第一帧,但是没有动画效果。如果我们对background-position进行不同值的设置,比如-100px,0是第二帧,-200px 0是第三帧等等。这样一来,首先想到的他可能是一个动画:

@keyframes loader {

to { background-position: -800px 0; }

}

.loader {

animation: loader 1s infinite linear;

/*省略其他样式*/

}

然而,正如下图所看到的图片(每167ms),这并不是真正需要的效果:

当我们不需要关键帧之间的插值时,我们最初尝试的逐帧动画效果失败了。

虽然我们还没有实现逐帧动画效果,但实际上我们已经非常接近解决方案。这里有一个秘密,将使用steps()时间函数来替代前面介绍的“Bézier-based”时间函数。

你可能会问,这是什么时间函数?正如上一节介绍的,我们看到的都是有关于“Bézier-based”时间函数来控制关键帧之间的平滑过渡。通常情况之下,在transition和animation都可以实现平滑过渡。然而,在这种情况这下,这种平滑过渡时间函数直接摧毁了我们使用Sprite制作的动画。

steps()时间函数和“Bézier-based”很不一样,他可以根据整个动画的关键帧步骤指定步骤的数量,并且可以对插值进行开关的设置。在CSS中,有关于steps()讨论不太多。至于CSS中有关于时间函数功能,“Bézier-based”才是亲妈的生,很受欢迎,但steps()是后妈的,一直不受人待。然而,在这种情况下,steps()才正是我们需要的。一旦把这个用到加载的动画中,动画才变得正常,也是我们需要的效果:

animation: loader 1s infinite steps(8);

请记住,steps()还可以接受第二个参数,而且这个参数是可选的。start或end(默认的),用来设定每个时间间隔开关,如下图所示:

如果我们只需要一个步骤,也可以通过step-start和step-end快捷键,其相当于steps(1,start)和steps(1,end)。

提示:Simurai给Sprites动画提供了一个使用steps()技术。

html逐帧动画,CSS秘密花园: 逐帧动画相关推荐

  1. css动画结束闪烁,CSS秘密花园: 闪烁动画

    <CSS Secrets>是@Lea Verou最新著作,这本书讲解了有关于CSS中一些小秘密.是一本CSSer值得一读的一本书,经过一段时间的阅读,我.@南北和@彦子一起将在W3cplu ...

  2. matlab实现振动弹簧的实时动画,CSS如何实现弹簧动画效果

    CSS Animation在Web Animation中已不是新技术,不过在制作动画的时候,或许常常纠结timing-function如何使用.一般情况之下,都会使用animation-timing- ...

  3. css制作逐帧动画-案例

    网页动画图像.Flash 动画和 JavaScript 实现的效果图片,我们用最基础的CSS也能实现.制作一个简单的gif动画图,上图就是效果图. 用CSS3制作动画图,你需要了解两个css属性. 一 ...

  4. [css3动画教程]:逐帧自适应精灵图

    一.animation属性设置 要启用css3动画,就要先了解 animation 属性, animation 属性是一个简写属性,用于设置六个动画属性: animation-name 规定 @key ...

  5. Android—逐帧、补间、属性动画

    1.Tween Animation 补间动画 这类动画比较简单,一般就是平移.缩放.旋转.透明度,或者其组合,可以用代码或者xml文件的形式,推荐使用xml文件形式,因为可以复用. 四个动画效果实现类 ...

  6. Android中的动画2(逐帧动画)

    逐帧动画就比较简单了,就是一帧一帧的播放动画,每一帧都是有我们来定义的. 在res/drawable文件夹下新建一个Root element为animation-list的xml文件,命名为anima ...

  7. Android 动画解析(一) 逐帧动画(Frame Animation)

    简介 开发Android的同学都知道,Android中的动画有逐帧动画(Frame Animation).补间动画(Tween Animation)以及属性动画.其中,逐帧动画(Frame Anima ...

  8. 【Android笔记25】Android中的动画效果之逐帧动画

    这篇文章,主要介绍Android中的动画效果之逐帧动画. 目录 一.逐帧动画 1.1.什么是逐帧动画 1.2.逐帧动画的使用 (1)创建drawable动画资源<

  9. iOS 动画原理与实现--帧动画、逐帧动画、CALayer

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能"动"的画. 人的眼睛对图像有短暂的记 ...

最新文章

  1. 剑桥大学:机器学习模型部署都有哪些坑?
  2. 基于Virtex-6 FPGA的三种串行通信协议测试及对比
  3. Angular动态表单生成(八)
  4. 50%的次日留存率,没有评论留言功能的same是如何做到的?
  5. Android-----Activity生命周期
  6. MFC中字符间相互转换总结
  7. 区块链技术指南 第一章 区块链和比特币的初体验
  8. flex柱状图和折线图的混合图使用
  9. oracle中 使用不了,Oracle 中不使用NOT IN 和 NOT EXISTS的另一种方法
  10. 安卓9去掉搜索栏_android9.0隐藏虚拟按键跟状态栏,除去google搜索栏.
  11. python 日历控件_PyQt5每天必学之日历控件QCalendarWidget
  12. 联想拯救者 Legion Y7000P 安装 Ubuntu 18.04.2 LTS amd64 遇到的问题解决
  13. 对于计算机课程的期待,关于初中计算机论文
  14. swf to html5 movie maker,楠妈妈教大家用windowsxp自带的Movie maker软件做视频
  15. pageX/pageY、clientX/clientY、screenX/screenY的区别
  16. 微信小程序创建直播间流程
  17. AntDesignVue表格中列的自定义隐藏与展示
  18. hdu4069 Squiggly Sudoku
  19. 2022长安杯-wp
  20. 实现图片加载先模糊后清晰的效果

热门文章

  1. 女生怎么培养自己的气质
  2. Java自定义拦截器处理防抖
  3. 数据分析方法08用户画像
  4. 这款基于 Core ML 的开源二次元神器,可以深入学习一下
  5. pdo mysql 建库_pdo 创建数据库
  6. 微信小程序_把chatgpt聊天数据复制到剪切板
  7. 智能路灯平台灯具控制系统的设计与实现
  8. LinuxCNC性能剖析
  9. java中将word流化,Microsoft Word - 2015最新java面试题.doc
  10. ubuntu域名解析错误