今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了“天下没有不散的宴席...”,在我的世界里又多了一次离别的伤感(虽然还在隔壁工作)。加入了微信产品中心后,开始新的团队生活,工作比以前忙多了,有时周六也要上班,需要更快更高效的完成任务,除了重构页面,需要主动参与边缘外的工作,承担更多。最近比较忙,给自己敲个响钟:注意身体。

说完题外话,开始近期的主题动画设计。虽然css3动画基础知识学习过,但以前项目使用场景比较少,并没有太多的实践,加入新团队以来,做得几个项目与动画有关,尝试用css3来实现,过程中遇到了不少坑。

大学学过一个月画画,但没有这方面天赋,连简单卡通动画也画不好,于是在国外网站找来如下动画,利用它来做例子,并把这次用 css3 实现动画的原理分享给大家~

来自 dribbble 某位大师的作品,GIF图中一个小女孩抱着一只猫在跑步,非常可爱,动作轻巧,过渡自然。

回到项目需求,要实现类似上图卡通人物跑步动画,分析结果如下:

1.跑步动画可以应用在不同的场景

要求人物的背景是透明的,图片保证高清,避免边缘杂边

2.跑步动画运动速度与动作成正比关系

人物跑步速度越快,身体动作越快;人物跑步速度为零时,身体动作马上停止在当前的状态

3.跑步动画效果流畅

不会出现卡顿现象

GIF实现跑步

用PS打开该大师的 GIF 图,在时间轴窗口中有 24 张不同的图片,通过一帧一帧的播放来实现跑步动画,很简单得说明做一个精细的动画需要多费点心思和劳动力啊,向大师表示敬礼~

项目组要求的动画跟上图人物大小差不多,一开始跟交互和视觉的同事讨论时,尝试使用 gif 来实现动画,使用7张图片轮播,间隔 0.2 秒可满足的动画效果,简单实现如下:

分析下gif动画

好处:实现简单、可维护性高、工作成本低

缺点:只适合简单的动画效果,不能动态控制动画

那么项目的硬性要求(控制动画的暂停、速度等)让我放弃了对gif实现跑步的想法~

CSS3实现跑步

放弃了 gif,而 swf 也不是我们的选择,canvas 实现也是可以的,这里不做介绍,本次主题是 css3 动画~

跑步动画的实现

方式一:通过切换 7 张图片来实现

  1. @-webkit-keyframes charector-1{
  2. 0% {background-image: url(charector_1.png);}
  3. 14.3% {background-image: url(charector_2.png);}
  4. 28.6% {background-image: url(charector_3.png);}
  5. 42.9% {background-image: url(charector_4.png);}
  6. 57.2% {background-image: url(charector_5.png);}
  7. 71.5% {background-image: url(charector_6.png);}
  8. 85.8% {background-image: url(charector_7.png);}
  9. 100% {background-image: url(charector_1.png);}
  10. }

方式二:7 张图片合成 1 张,通过切换背景图片位置来实现

  1. @-webkit-keyframes charector-1{
  2. 0% {background-position: 0 0;}
  3. 14.3% {background-position: -180px 0;}
  4. 28.6% {background-position: -360px 0;}
  5. 42.9% {background-position: -540px 0;}
  6. 57.2% {background-position: -720px 0;}
  7. 71.5% {background-position: -900px 0;}
  8. 85.8% {background-position: -1080px 0;}
  9. 100% {background-position: 0 0;}
  10. }

分析这2种方式

方式一:

实现起来会比较简单,但带来额外的 7 个请求数

7 张图片总大小为:50k

方式二:

需要设计雪碧图,并量取背景位置,请求数少

雪碧图大小为:37k

可以看出多张图片合成的雪碧图比 7 张图片还少 13k 外,还可以减少 7 个HTTP请求,那么切换背景位置方式是比较好的,代码如下:

HTML:

  1. <div class="charector"></div>

CSS:

  1. .charector{
  2. position: absolute;
  3. width: 180px;
  4. height: 300px;
  5. background: url(../img/charector.png) 0 0 no-repeat;
  6. -webkit-animation-name: charector-1;/* 动画名称 */
  7. -webkit-animation-iteration-count: infinite;/* 动画无限播放 */
  8. -webkit-animation-timing-function: step-start;/* 马上跳到动画每一结束桢的状态 */
  9. -webkit-animation-duration: 950ms;/* 动画运行的时间 */
  10. }
  11. @-webkit-keyframes charector-1{
  12. 0% {background-position: 0 0;}
  13. 14.3% {background-position: -180px 0;}
  14. 28.6% {background-position: -360px 0;}
  15. 42.9% {background-position: -540px 0;}
  16. 57.2% {background-position: -720px 0;}
  17. 71.5% {background-position: -900px 0;}
  18. 85.8% {background-position: -1080px 0;}
  19. 100% {background-position: 0 0;}
  20. }

demo,这里下载(请使用 webkit 内核的浏览器打开)

加快跑步速度、暂停跑步的实现

加快跑步速度:可以通过快速切换背景图片位置,animation-duration 可以控制动画运行的时间,那么减少动画的时间可以提升跑步的速度,通过在父级动态加载不同的功能 class 来运行不同的动画,从而改变跑步速度

详细内容请看代码,留意注释

HTML:

  1. <div class="charector-wrap " id="js_wrap">
  2. <div class="charector"></div>
  3. </div>
  4.  
  5. <a class="run-xfast" href="#none">最快</a>
  6. <a class="run-fast" href="#none"></a>
  7. <a class="run-normal" href="#none">正常</a>
  8. <a class="run-slow" href="#none"></a>
  9. <button class="btn-paused">暂停</button>

CSS:

  1. .charector{
  2. position: absolute;
  3. width: 180px;
  4. height:300px;
  5. background: url(../img/charector.png) 0 0 no-repeat;
  6. -webkit-animation-iteration-count: infinite;/* 动画无限播放 */
  7. -webkit-animation-timing-function:step-start;/* 马上跳到动画每一结束桢的状态 */
  8. }
  9. /* 跑步动画名称 */
  10. @-webkit-keyframes person-xfast{/* 超快 */
  11. 0% {background-position: 0 0;}
  12. 14.3% {background-position: -180px 0;}
  13. 28.6% {background-position: -360px 0;}
  14. 42.9% {background-position: -540px 0;}
  15. 57.2% {background-position: -720px 0;}
  16. 71.5% {background-position: -900px 0;}
  17. 85.8% {background-position: -1080px 0;}
  18. 100% {background-position: 0 0;}
  19. }
  20. @-webkit-keyframes person-fast{/* 快 */
  21. 0% {background-position: 0 0;}
  22. 14.3% {background-position: -180px 0;}
  23. 28.6% {background-position: -360px 0;}
  24. 42.9% {background-position: -540px 0;}
  25. 57.2% {background-position: -720px 0;}
  26. 71.5% {background-position: -900px 0;}
  27. 85.8% {background-position: -1080px 0;}
  28. 100% {background-position: 0 0;}
  29. }
  30. @-webkit-keyframes person-normal{/* 正常 */
  31. 0% {background-position: 0 0;}
  32. 14.3% {background-position: -180px 0;}
  33. 28.6% {background-position: -360px 0;}
  34. 42.9% {background-position: -540px 0;}
  35. 57.2% {background-position: -720px 0;}
  36. 71.5% {background-position: -900px 0;}
  37. 85.8% {background-position: -1080px 0;}
  38. 100% {background-position: 0 0;}
  39. }
  40. @-webkit-keyframes person-slow{/* 慢 */
  41. 0% {background-position: 0 0;}
  42. 14.3% {background-position: -180px 0;}
  43. 28.6% {background-position: -360px 0;}
  44. 42.9% {background-position: -540px 0;}
  45. 57.2% {background-position: -720px 0;}
  46. 71.5% {background-position: -900px 0;}
  47. 85.8% {background-position: -1080px 0;}
  48. 100% {background-position: 0 0;}
  49. }
  50. /* 跑步动作频率控制 */
  51. .xfast .charector{/* 超快 */
  52. -webkit-animation-name: person-xfast;
  53. -webkit-animation-duration: 500ms;
  54. }
  55. .fast .charector{/* 快 */
  56. -webkit-animation-name: person-fast;
  57. -webkit-animation-duration: 650ms;
  58. }
  59. .normal .charector{/* 正常 */
  60. -webkit-animation-name: person-normal;
  61. -webkit-animation-duration: 800ms;
  62. }
  63. .slow .charector{/* 慢 */
  64. -webkit-animation-name: person-slow;
  65. -webkit-animation-duration: 950ms;
  66. }

暂停跑步:使用 animation-play-state:paused 可以暂停正在进行的动画,并停留到当前的动作,那么当用户停止操作时,给父级加上功能 class 来停止动画

CSS:

  1. /* 暂停动画 */
  2. .paused .charector{
  3. -webkit-animation-play-state:paused;
  4. }

最后再通过 js 控制不同的跑步速度。

jQuery:

  1. $(document).ready(function(){
  2. $("a").on("click",function(e){
  3. $("#js_wrap").find(".charector-wrap").removeClass("paused");
  4. $("#js_wrap").attr("class","charector-wrap " + $(e.target).attr("class").split("-")[1])
  5. })
  6. $(".btn-paused").click(function(){
  7. $("#js_wrap").addClass("paused");
  8. })
  9. })

最后界面:

demo,这里下载(请使用 webkit 内核的浏览器打开)

总结:

animation 适合相对简单的动画,使用起来比较灵活,如支持切换不同的动画名、暂定动画等

animation-timing-function 的 step-start 属性等不完全支持 android 2.1~4.3 、ios 4.3 系统

ok~ 跑步动画到此结束~

【原】移动web动画设计的一点心得——css3实现跑步的更多相关文章

  1. 【Web动画】CSS3 3D 行星运转 && 浏览器渲染原理

    承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...

  2. 流畅web动画的十个法则

    from me: web动画能够带来一个非常酷炫的效果,能够让页面有一个更好的用户体验.对于良好的动画性能没有高招,除了将大量的时间放在测试和优化,当然最重要的还是要易于维护. 流畅web动画的十大法 ...

  3. 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得

    谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...

  4. Web 动画原则及技巧浅析

    在 Web 动画方面,有一套非常经典的原则 -- Twelve basic principles of animation,也就是关于动画的 12 个基本原则(也称之为迪士尼动画原则),网上对它的解读 ...

  5. [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考

    一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...

  6. GOTO Berlin: Web API设计原则

    在邮件列表和讨论区中有很多与REST和Web API相关的讨论,下面仅是我个人对这些问题的一些见解,并没有绝对的真理,InnoQ的首席顾问Oliver Wolf在GOTO Berlin大会上开始自己的 ...

  7. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  8. 必胜宅急送Web app设计背后的思考

    O2O模式是餐饮业在移动消费趋势下主动拥抱互联网的方向,迎合餐饮消费者从以往经验判断为主转变为依靠移动设备.lbs.社交网络进行立体决策的过程.继App客户端之后,手机web app也逐渐成为O2O中 ...

  9. 重构HTML改善web应用设计

    本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和做法.部分参考自<重构HTML改善Web应用设计>. 重构.什么是重构?为什么要 ...

随机推荐

  1. jquery css事件编程 位置 操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. VGA colorbar显示

    module VGAcolorbar(clk,rst,hsync,vsync,vga_r,vga_g,vga_b ); input clk; input rst; output hsync; outp ...

  3. iOS面试用到的知识点和技术点--第二章

    接着第一章的继续  昨天没有更新,很抱歉 1.Socket编程 以及一些第三方框架Socket-IO GCDAsyncSocket通信框架? 1.使用系统自带的CFsocket 2.第三方Socket ...

  4. Could not publish server configuration for Tomcat v6.0 Server at localhost.

    经常在使用tomcat服务器的时候 总会发生一些莫名其妙的错误. 就像下面这个错误: 在配置文件中存在多个/MyWeb的配置,导致不能发布服务. 错误信息: Could not publish ser ...

  5. Linux tree命令

    Linux tree命令用于以树状图列出目录的内容. 执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件. 语法 tree [-aACdDfFgilnNpqstux][-I <范 ...

  6. JS高程3.基本概念(4)操作符

    ECMA-262用于操作数据值的操作符包括: 算术操作符 位操作符 关系操作符 相等操作符 ECMAScript操作符的不同之处在于:它能够适用于很多值,包括字符串,数字值,布尔值,甚至是对象.(在应 ...

  7. iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)

    从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示. 并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效. 出现以下情况: Failed to locate or generat ...

  8. Thread多线程(二):Runnable

        如果要让其他类使用线程就要用到runnable,其他thread就是实现了runnbale接口,其中run()方法就是对runnable接口中的run()方法的具体实现.有两个构造函数分别是: ...

  9. 如何获取ios 设备名字 model

    由于需要获取设备名字,在网上找了一些方法,发现能够解决问题,但是需要做一个匹配,然后设备年年都会出新款,而且设备的种类又很多,所以在获取设备信息后我又做了一个操作,--->我在google上找到 ...

  10. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...