先加个副标题XDcss
正是在项目中遇到副标题,才引发我更深刻的探寻css3
css3的动画实现是经过属性animation 与 @keyframes配合实现的git
具体能够参见这篇文章,这位女程序媛有着很是详尽与精彩的阐述程序员
https://24ways.org/2012/flashless-animation/github
最后实现了一张猫跑动在有视频滚动的画面上 浏览器
为何不用gif?css3动画
gif动画就是典型的帧动画,gif在各浏览器上也支持的很好。手机上表现也很好。app
惟一的缺点就是体积太大,继而致使低端机上吃内存卡顿。less
用css3来实现动画,会明显下降图片体积,即用sprite形式iphone
一般,网上文章介绍的动画都是用px作为大小或距离单位
css3的动画实现是经过属性animation 与 @keyframes配合实现的
具体能够参见这篇文章,这位女程序员有着很是详尽与精彩的阐述
https://24ways.org/2012/flashless-animation/
最后实现了一张猫跑动在有视频滚动的画面上
一般,网上文章介绍的动画都是用px作为大小或距离单位
@keyframes walk-cycle { 0% {background-position: 0 0; } 100% {background-position: -880px 0;} }
动画实现如:
.anim-div{ background-image: “那个蛋的图地址” animation: walk-cycle 1s steps(11) infinite; }
以上就是最简单实现帧动画的代码了..
嗯。。在pc上看起来貌似还行。
若是是在手机上,
为简单的适应不一样屏幕尺寸,咱们一般的作法是让美工大人出一张相对比较大的图,好比以iphone5为基准,320px宽度。
让美工提供640宽度的图给咱们。咱们经过设置background-size: 100%便可等比缩放来适应大部分的屏了,而没必要为每一个屏幕都设置不一样的背景图片。
那么就成了如下的代码
.anim-div{ background-image: “那个蛋的图地址” background-size: 100% animation: walk-cycle 1s steps(11) infinite; }
对,就加了一句background-size: 100%
结果就是,蒙逼了。。动画彻底不像预想的那样浪了。如今真是浪出新风格了..
搜了半天google才找到有相似的回答,而后解决方法是
@keyframes walk-cycle { 0% {background-position: 0 0; } 100% {background-position: 110% 0;} } .anim-div{ background-image: “那个蛋的图地址” background-size: 1100% animation: walk-cycle 1s steps(11) infinite; }
第一步:background-size设置为帧数*100%,即1100%
第二步:让关键帧也变换为百分比, 而且为其补上最后一帧
公式为: ((100/(2-1)) + 100) /100
公式为: ((100/(2-1)) + 100) /100
公式为: ((100/(2-1)) + 100) /100
重要的话说三遍,因此公式写三遍
此例子中即:
(100 / (11-1) +100) / 100 = 1.1
background-position: 110% 0;
带出了另外一个话题
在作biu动图社区HTML5展现页时,偶然发现keyframe实现的动图循环过程当中会丢失一帧,找了很久终于有一篇国外同行研究此现象的文章,
当使用css3的steps配合以百分比为值的background-position时,循环帧的过程当中最后一帧是不显示的
如下是我找到的国外网友分析的资料及实例测试,实例中查看源码便可看到如下的分析逻辑
http://willian12345.github.io/test-demo/step-keyframes/
或
http://sheldonwang.com/test-demo/step-keyframes/
接下来分析一下:
@keyframes countdown { 0% { background-position: 0 0; } 100% {background-position: 0 100%; } }
.flick { animation: countdown 1s steps(2) infinite; background: url(1-2.png) 0 0 no-repeat; }
你觉得.flick就可让动画在1和2之间跳动造成动画
然而并无,它只是在1和2中间一半处移来移去
让咱们试试加上”end”或“start”属性,看看行不行
.flick-end { animation: countdown 1s steps(1, end) infinite; } .flick-start { animation: countdown 1s steps(1, start) infinite; }
它们看起来直接跳过了开始或结束那一帧
综合查阅了相关资料,end和start控制的是一个帧循环结束后链接上继续循环的是哪一帧,现象是
若是设置的是end,那么最后一帧就被无视掉了,若是设置的是start,那么第一帧被无视了。W3c有个相应说明的图,反正我是没看明白。
让咱们用3帧的图来验证一下
.easy-as { animation: countdown 1s steps(2, end) infinite; background: url(1-2-3.png) 0 0 no-repeat; }
果真end效果是1与2之反复跳转,直接无视了3
要让它正常依次显示1,2,3那么须要补上一帧
@keyframes countdownTo3 { 0% { background-position: 0 0; } 100% {background-position: 0 150%; } } .easy-working { animation: countdownTo3 1s steps(3) infinite; }
设为150%,即补上了50%一格的高度(一帧)
因此当为两帧时
@keyframes countdownTo2 { 0% { background-position: 0 0; } 100% {background-position: 0 200%; } } .flick-working { animation: countdownTo2 1s steps(2) infinite; }
再用公式算一遍
background-position-y: (100 / (2-1) +100) / 100 = 200%
嗯,因此是y轴上是200% 即: background-position: 0 200%;
一开始还真没注意过这些小细节,直到写到才会碰到,碰到再解决。。so,只能说能多写就多写喽
直到财务自由!!!,财务自由!!!,财务自由!!!重要的话说三遍
祝看到这篇文章的小伙伴都能实现
=================================================傲娇分割线===============================================
转载注明,博客园
willian12345@126.com
sheldon.wang
github.com/willian12345