前言

是不是很多人认为只有连续的变化才叫动画。

上图是连续旋转变化,下图是断断续续切换状态,请查看以下两个动画:

是否认知的感觉又强烈了一点呢?

假设我把下图的 loading 播放速度加快,继续看:

是否发现和图一的 loading 一样了,是否发现认知出现了偏差?

这种肉眼可见的断断续续的动画(如图一的下图,图二的下图其实也是,只是速度快而已,感知不明显)称为帧动画,又叫序列帧动画,定格动画,逐帧动画等,是一种动画技术,其原理为将每帧不同的图像连续播放,从而产生动画效果。

简而言之,实现帧动画需要两个条件:

1. 相关联的不同图像,即动画帧;

2. 连续播放。


原理

CSS 帧动画是通过不断变换 keyframes 中每个阶段的属性来实现,如上图的例子 0% 处和 100% 处分别使用不同的 transform 属性的 rotate 实现了 loading 效果。然而 CSS 动画默认的动画过渡方式的平滑的,平滑的过渡对逐帧动画会造成类似滑动的效果,所以需要动画时间函数 animation-timing-function 中的阶梯函数 steps 属性来设置过渡方式。

PS:steps 函数衍生出了 step-start 和 step-end 两个封装函数;cubic-bezier 函数则有linear,ease,ease-in,ease-out 以及 ease-in-out。


steps

steps 指定了一个阶梯函数,接受两个参数:

1. 第一个参数接受一个整数值,表示两个关键帧之间分几步完成;

2. 第二个参数可选,接受 start 和 end 两个值,默认值为 end,指定在每个间隔的起点或是终点发生阶跃变化;

PS:step-start 等同于 step(1, start)。step-end 等同于 step(1, end)。

动画时间函数 animation-timing-function 中的阶梯函数 steps 兼容性如下:

由上图可知,无论在移动端还是 PC 浏览器中,steps 的兼容性都是非常好的。

那么来理解 steps 的工作机制,如下图:

举个栗子,方便粉友们理解,有如下CSS3动画keyframes,定义了一段从0~100px的位移:

@keyframes move {    0% { left: 0; }    100% { left: 100px; }}

假设 steps 函数第一个参数值是5,则相当于把 100px 分成了 5 段,如下示例图:

假设 steps 函数第二个参数值是 start,如下示例图:

假设 steps 函数第一个参数值是 end,如下示例图:

是否瞬间思路清晰,必须感谢 CSS 大佬张鑫旭,栗子取自他的文章,有兴趣的粉友在文末找到本文相关参考文献。

稍微补充一个 animation-fill-mode 相关知识,后续会使用到。

CSS 属性的 animation-fill-mode 设置 CSS 动画在执行之前和之后如何将样式应用于其目标。

animation-fill-mode 的属性值为 forwards 目标将保留由执行期间遇到的最后一个关键帧计算值,使用其则表示如下示例图:

了解上述相关知识,那么赶紧来看个小姐姐的栗子,效果图如下:

示例代码如下:

        CSS 逐帧动画               html, body { width: 100%;height: 100% }      html, body, div { margin: 0; padding: 0; }      .box { margin: 50px auto; }      .sister {         width: 204px;         height: 133.3px;         background: url('./images/sister.png') no-repeat 0 0 / 204px 800px;         animation: smile 3s steps(1, end) 0s forwards;      }      @keyframes smile {         0% { background-position-y: 0px; }         20% { background-position-y: -133.3px; }         40% { background-position-y: -266.6px; }         60% { background-position-y: -400px; }         80% { background-position-y: -533.3px; }         100% { background-position-y: -667px; }      }    

示例代码中图片如下:

那么为什么上述小姐姐案例代码中的 step 第一个参数是1?

steps 是 animation-timing-function 的一个属性值,animation-timing-function 应该于两个 keyframes 之间,而非整个动画。在上述案例代码中的 keyframes 中,已经把每个帧都写出来了,因此两个 keyframes 之间的间隔是1。

于是就有了更简洁的写法,可以把 keyframes 的计算直接交给 steps 来完成。

可以把上述案例的 keyframes 处调整如下,

.sister {  animation: smile 3s steps(5, end) 0s forwards;}@keyframes smile {    100% { background-position-y: -667px; }}

运行效果一样,而且写法更简洁。


应用场景

CSS 帧动画可以用于实现复杂点的动画效果,动画效果更细腻,并且设计师有更多自由的发挥空间,甚至可以定义到每一个时间刻度上的展现内容。可以应用于页面的 Loading、小人物及小物体元素的简单动画。具有以下优点:

1. 可以自由控制播放、暂停和停止

2. 可以控制播放次数,播放速度

3. 可以添加交互,在播放完成后添加事件

4. 浏览器兼容性好


注意事项

素材:帧动画素材图片宽高最好是偶数,合成雪碧图的素材数量最好是偶数,帧数最好是偶数,图片拼接处最好有一定的留白。

适配:移动端适配不推荐使用 rem,因为 rem 的计算会造成小数四舍五入,造成一定的抖动效果,建议直接用 px 作为单位,同时辅助以scale(zoom)媒体查询进行适配。如果使用 rem 适配,试试使用 transform 的方案,抖动问题可以得到优化解决。

关于上述提及的 rem 布局导致帧与帧之间的盈亏互补现象导致动画抖动,若想要深入了解,推荐阅读凹凸实验室的《CSS技巧:逐帧动画抖动解决方案》。

PS:使用 will-change 可以在元素属性真正发生变化之前提前做好对应准备。


总结

CSS 帧动画技术对于一些复杂的动画有了新的答案,甚至你的一些天马星空的想法,在它面前可能就变得轻而易举。

总的来说一句话,真香!!!


参考

  • 张鑫旭

  • 掘金-小玛丽在隔壁

  • 掘金-迅雷前端

  • 凹凸实验室-燕婷


炒粉不加蛋,香味少一半

css图片滑动切换图_CSS帧动画相关推荐

  1. html5中Canvas、绘制线条模糊、常见绘制工具、绘制基本图形、绘制图片、面向对象的方式绘制图形图片、绘制文本、帧动画绘制

    Canvas容器: canvas标签用来定义图像的容器,必须配合脚本来绘制图像,canvas也运用于游戏开发.注意:canvas绘制图时会出现线条模糊情况,这是因为显示屏像素和canvas中定义的一个 ...

  2. android实现滑动切换图,Android:使用ViewPager实现左右滑动切换图片加点点

    图片发自简书App 1.引入android-support-v4.jar包,在主布局里加入 < ?xml version="1.0" encoding="utf-8 ...

  3. 原生css页面滑动到指定位置开始动画_html/css 滚动到元素位置,显示加载动画

    每次滚动到元素时,都显示加载动画,如何添加? 元素添加初始参数 以上图中的动画为例,添加俩个左右容器,将内容放置在容器内部. 添加初始数据,默认透明度0.左右分别移动100px.//左侧容器 .ite ...

  4. php图片滑动的属性,使用css怎么实现图片的滑动效果?(示例)

    本篇文章主要给大家介绍关于css实现图片的滑动效果示例,希望大家阅读完本篇后对css滑动效果的相关知识有所了解. 下面给大家举一个简单的css图片滑动效果示例(自下而上滑动): css怎么实现图片滑动 ...

  5. css逐帧动画图片太大怎么办,不建议使用 CSS3 keyframe transform 实现逐帧动画

    © Young 2018-12-26 21:43 Welcome to My GitHub 一般在使用 CSS3 keyframe transform 实现逐帧动画时,往往会先把逐帧动画图片合成精灵图 ...

  6. [练习]利用CSS steps 实现逐帧动画

    网页逐帧动画的实现方式 网页中的逐帧动画,大致可分为两大类的实现方式, 分别是使用JS控制,和单纯使用CSS实现,两者的优劣总体概括来说就是: JS动画可控性更强,但开销大,实现复杂. CSS动画实现 ...

  7. python做flash帧动画_[练习]利用CSS steps 实现逐帧动画

    网页逐帧动画的实现方式 网页中的逐帧动画,大致可分为两大类的实现方式, 分别是使用JS控制,和单纯使用CSS实现,两者的优劣总体概括来说就是: JS动画可控性更强,但开销大,实现复杂. CSS动画实现 ...

  8. css animation 平移,CSS动画相关(打字动画、逐帧动画、环形路径平移)

    一. 逐帧动画 很多时候,我们需要一个很难只通过CSS属性来实现的动画,比如一个复杂的进度提示框,在这样场景下基于图片的逐帧动画才是王道. 看到动画,你可能会想:[直接用GIF不就得了嘛,搞这么复杂的 ...

  9. android 喇叭帧动画,CSS动画效果——语音播放小喇叭

    写业务代码经常会碰到要自己实现一些设计交给的小动画,今天我们就来看下小喇叭那种类似倒过来的wifi图标一样的效果: 语音播放效果 对于这个有几种实现方案:一种是直接把图标.png文件放在下面,然后再在 ...

最新文章

  1. 基础学习总结(四)--SQLite
  2. I.MX6 修改调试串口号(ttymx0 - ttymxc2)
  3. cocos2d-x中几种存储数据的方式
  4. Spring Cloud 微服务入门(二)--Spring Cloud 架构
  5. 【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用
  6. CISCN2020初赛_Web
  7. Spring框架集成mybatis框架的配置(笔记)
  8. java不带package和带package的编译方式
  9. android中prop配置参数名,【01-19 技术】安卓系统优化Build.prop 系统参数属性详解...
  10. AIL(Android init Language)
  11. node封装一个图片拼接插件
  12. 函数连续、可导、可微、连续可微
  13. 为什么很多人不喜欢甚至排斥用中文编程?
  14. APP安全测试点分析
  15. hihoCoder 1039:字符消除(字符串处理)
  16. 事业单位采购计算机的申请报告,事业单位采购申请报告
  17. 平阳县抖音平台直播运营主播带货第三期培训提升班开班啦!
  18. 微信小程序车牌组件代码
  19. sqlServer服务器名称
  20. shellmad-18_C++新特性 智能指针的简易实现及添加模板

热门文章

  1. trackerslist GitHub12月无重复更新版
  2. 实体店运用互联网思维进行客户裂变,不到8个月净赚2000万
  3. win10提示无法通过电话激活怎么办?
  4. 关闭tomcat6下的stdout日志
  5. 记录从指尖悄悄流逝的时间
  6. 安卓巴士总结了近百个Android优秀开源项
  7. iOS16 系统bug汇总,续航发热情况,各机型升级建议
  8. Bootrom -> bootloader -> kernel -> init >android
  9. threejs fire 火焰与烟雾效果
  10. 达梦数据库聚合拼接函数