在百度搜索中有这样一个彩蛋:搜索“旋转”,“跳跃”,“反转”等词语,会出现相应的动画效果(搜索“反转”后的效果)。查看源码可以发现,这些效果正是通过CSS3的animation属性实现的。

实现这个彩蛋

  简单来说可以分三步:

  1.实现一些css动画类,等待调用;

  2.设立关键字与动画匹配方法;

  3.每当页面加载完成,根据关键字为body添加指定动画类。

  查看DEMO:百度搜索彩蛋

CSS3 Animation

  animation: name duration timing-function delay iteration-count direction;

  上面的式子是动画声明的缩写形式。一条CSS规则中只能有一条动画声明,如果多次声明,后者会覆盖前者。一个缩写的动画声明由上述几个部分组成,含义如下表所示(摘自W3School):

描述
animation-name 规定需要绑定到选择器的 keyframe 名称。
animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
animation-timing-function 规定动画的速度曲线。
animation-delay 规定在动画开始之前的延迟。
animation-iteration-count 规定动画应该播放的次数。
animation-direction 规定是否应该轮流反向播放动画。

  animation-duration设置动画的持续时间,单位可以为s或ms,不可为负值,需要注意的是其默认值为0,在创立一条动画声明时,属性值中必须设置持续时间,否则动画不会执行。

  animation-timing-function表示动画的运动方式,可以使用ease-in,ease-in-out等关键字,也可以通过cubic-bezier()函数自定义运动曲线,或者使用step()函数来做一个逐帧动画。默认值为ease。

  animation-delay的值可正可负,单位可以设置为s或ms,默认值为0(立即开始)。

    animation: 5s ease 1000ms normal none 1 myanimate;/*延迟1s开始*/animation: 5s ease 2s normal none 1 myanimate;/*延迟2s开始*//*立即开始但起始位置为原动画开始后1s处*/animation: 5s ease -1s normal none 1 myanimate;/*开始位置大于等于动画时常,快速切换到动画结束状态*/animation: 5s ease -5s normal none 1 myanimate;

  animation-iteration-count规定动画重复次数,可以设置为一个正整数或者关键字infinite,表示此动画应该重复播放无限次。默认值为1。

  animation-direction设置动画的播放方向,常用的几个属性如normal表示动画按正常播放,reverse表示动画按反向播放,alternate表示动画在奇数次(1、3、5...)正向播放,在偶数次(2、4、6...)反向播放。默认值为normal。

  在书写时,上述的animation的属性顺序可以错乱,可以不写某个值,浏览器会自动识别出相应的属性值。

    animation:demo 1s ease-in-out 10;animation:10 ease-in-out demo 1s;

  上面两条CSS声明都表示动画名demo以ease-in-out方式连续执行10次,每次持续1s。

  此外,animation还有两个属性值,animation-fill-mode规定了动画结束时的状态:可以设置动画保持最后时的状态或还原到最初时的状态。查看DEMO:animation-fill-mode DEMO;animation-play-state规定了动画当前的状态,如果不进行设置,不管动画播放中、播放完或delay时,此属性值均为“running”。假如animation-duration的值为5s,animation-delay的值为2s,则这个动画在这7s前后及7s中的animation-play-state值均为running。在动画播放或delay时,可以使用JavaScript修改此属性为“paused”将动画暂停,这意味着假如一个动画延迟10s执行,我们在delay到第8s时将动画暂停,2s后再将动画播放,此动画仍然会继续delay2s后再开始播放。查看DEMO:CSS3动画暂停与播放。

  上面提到animation有一个animation-name属性,表示动画的名称。在CSS中,所有的动画都是通过keyframes(关键帧)来定义的,我们不必定义动画每帧的效果,而是定义几个关键帧的状态即可,浏览器会根据定义的少数几个关键帧渲染出流畅的动画效果。

  例如,一个keyframes可以这样来定义:

     @keyframes animation-name {0% { /*注意0%后面没有冒号*/transform: rotate(0deg);}100% {transform: rotate(360deg);}}

  0%和100%还可以分别使用关键字from和to来描述。如果多个关键帧的效果相同,还可以像这样将它们写在一起:

     @keyframes animation-name {from,to {transform: rotate(0deg);}50% {transform: rotate(360deg);}}

  一个keyframes,可以被多条动画声明同时使用。

  一条动画声明,可以同时使用多个不同的keyframes。

  假如有两个keyframes的名称分别为key1和key2,这样的动画声明是合法的:

    animation: key1 20s , key2 .5s ;

  两个关键帧都会生效。DEMO:两个keyframes生成的文字输入动画。

总结

  我们可以在keyframes中更改元素任何CSS可控的属性,也可以让多个元素动画效果串联起来,这样便可以实现非常绚丽的视觉效果。下面有两个例子,展示了CSS3动画的实用和魅力。

  1.网站css4-selectors.com的loading效果。

  2.A pen by webzhao:花瓣的展开。

  CSS3动画的优点这么多,接下来我们将它与JavaScript动画相比,谈谈其主要缺点,以便在实际运用中和JavaScript动画各取所长,在合适的时机使用合适的方法。

  1.浏览器兼容性差。有的浏览器需要加专属前缀,本文中所有的demo需要在最新版现代浏览器及IE10+下查看,而JavaScript动画大多时候没有兼容性问题。Can I Use CSS3 Animation?

  2.交互性差或无交互性。CSS动画只能按照定义好的关键帧一步步进行,或者使用伪类进行鼠标悬浮等简单交互,事实上交互本来就不是CSS的范畴。

  3.粗粒度的动画控制。与JavaScript毫秒级的动画控制相比,CSS3的keyframes控制无疑是相当的粗粒度的,你无法单独控制元素的尺寸、位置和旋转,这些控制被统统塞到了transfrom一个属性里。你也无法在动画运行时改变或控制一些东西,例如改变动画方向,寻找特定的时间点,或者绑定回调函数做一些其它事情。

  4.声明无法复用。假如两个动画仅仅是数值不同,但是控制的对象完全相同,你仍然需要重新书写一遍keyframes。尽管现代开发中可以利用sass等手段减少代码书写,但这并不影响生成后的css文件代码重复率很高。

  5.有些效果无法实现。例如复杂的缓动曲线,基于物理的动作等无法通过CSS3动画实现。

  在我之前一篇博客《JavaScript动画知多少?》中,曾将CSS动画与JavaScript动画相比,文中提到CSS3动画可以启用硬件加速,事实上这种说法并不严谨。

  首先,用一个3D特性的触发器(比如translate3d()或者matrix3d())来让浏览器为这个元素开辟一个GPU层,就可以让JavaScript动画同样使用GPU加速;其次,不是所有的CSS属性在CSS3动画中都能够获得GPU加速,事实上大多数是不能的。

  一些简单的动画效果利用CSS3来实现比JavaScript要方便很多,而一些较新的JavaScript动画库例如GSAP与CSS3的动画性能相比有过之而无不及,并且还能克服上述几个CSS3动画的缺点。

  我们好像都无法免俗,经常将CSS3动画与JavaScript动画相比,试图分个孰优孰劣。事实上认清两者各自的优缺点后,根据实际需求选择合适的方案才是最重要的(听起来是废话,但真的无法反驳)。

  上述的比较部分引自css-tricks上的一篇文章,虽然我认为有的缺点过于牵强,但我还是把它列举了出来。比如说交互性和动画控制,CSS本身是一个为了排版和样式而存在标记性语言,它与负责交互的编程语言JavaScript应该是相辅相成的,如果把JavaScript可以做到的事情而CSS做不到的事情当作CSS的缺陷,那么恐怕难以服众。吴双Orange翻译了这篇文章并发布在他的GitHub博客中,感兴趣的人可以继续阅读:消除疑问:CSS动画 VS JavaScript。

  (完)

转载于:https://www.cnblogs.com/dongtianee/p/css-animation.html

实现了一个百度首页的彩蛋——CSS3 Animation简介相关推荐

  1. 关于淘宝新首页代码彩蛋中的那个妹纸

    众所周知,淘宝首页在近期做了一次较大的更新.淘宝UED的各位大神们,很有意思的在首页代码中放入了一个小彩蛋,引起网友惊呼"前端工程师在HTML中竟然撸出一个妹纸来",上jb: 是不 ...

  2. 这两道大厂题,让我偶然发现百度的小彩蛋

    点击上方"程序员黑叔",选择"置顶或者星标" 你的关注意义重大! 文/黑叔 阅读本文需要 3分钟 前言 最近,好像面试文满天飞,瞄了一眼后,动不动就手写各类函数 ...

  3. 【摸鱼系列】如何用Python做一个有趣的Loading彩蛋游戏~

    嗨害大家好鸭!我是小熊猫❤ 不知道大家有没有在摸鱼的时候玩过它~ 这是谷歌流量器中很有名的彩蛋: 当你网络出现问题时,就会出现一个"小恐龙游戏". 当然你如果想要直接进行游戏,可以 ...

  4. 淘宝彩蛋--CSS3、Console、web彩蛋指南

    听闻淘宝有了自己的蛋,于是赶忙就先复制一下,看看是怎么工作的,最后也就有了自己的彩蛋 至于用法,打开淘宝首页, 至于原因你运行一下就会知道个大概了~~,css3各种特效轮换,对于我等苦逼的学生来说. ...

  5. 那些有意思的网站彩蛋

    苏生不惑第 88 篇原创文章 很多电影会在结尾留下彩蛋,比如电影<无问西东>片尾的一段七分钟读懂中国大师的彩蛋,还有去年周杰伦新歌<说好不哭>,知乎网友挖出的一系列彩蛋 . 在 ...

  6. 今天的彩蛋来的有点急,请抓住!

    前几日,漫威英雄斯坦·李离开了他的英雄世界.对于漫威迷来说,最大的满足就是在热映影片<毒液:致命守护者>中看到了他. 斯坦·李创造了漫威宇宙,缔造了无数英雄.他也是不折不扣的"老 ...

  7. 说好的敬畏每一行代码呢?Antd代码彩蛋炸翻一圈人

    对于开源项目来说,一个细微的改动就会影响到无数使用该项目的产品.公司.生产环境.阿里是中国开源的先锋公司,对于事故的处理也一直都很有担当,阿里云"敬畏每一行代码,敬畏每一份托付"曾 ...

  8. 华为鸿蒙手机版要2021开源,鸿蒙系统再起疑云:开源版和手机版完全不同,后者还有安卓彩蛋...

    随着华为正式发布鸿蒙系统2.0,同时宣布在上百款华为设备上升级鸿蒙,鸿蒙再次成为了人们关注的焦点.关于鸿蒙是否安卓套壳的疑问一直以来都不绝于耳,当然华为自己多次否认了鸿蒙是安卓套壳的说法,并且表示已经 ...

  9. 《让子弹飞》系列——《让子弹飞》中最大的彩蛋

    让子弹飞中,藏了一个非常隐秘的彩蛋,如果没有发现彩蛋,大部分人会认为这是一部喜剧电影. 可是,如果发现了这枚彩蛋,就会知道这不仅是一部悲剧,甚至可以说是一部烧脑的恐怖电影. 这个彩蛋,就是黄四郎送给张 ...

最新文章

  1. 使用Vue动态生成form表单的实例代码
  2. .net core vs java_VS Code 1.19.3调试.net core 2并始终满足“只能调试64位进程”
  3. 计算机机械应用,浅析计算机技术在机械自动化的应用(原稿)
  4. 关于form组件的补充-------formChoice
  5. linux-shell命令之rmdir(remove dir)【删除目录】
  6. CSS之左定宽度右自适应宽度并且等高布局
  7. git常用命令,项目删除原有github连接并重新连接,回滚,下拉分支代码,切换分支
  8. 火狐最实用的几款插件介绍[含附件]
  9. 数学思想 —— 对称性思维
  10. vue cli3 项目中解决跨域
  11. 【转】.NET对象序列化2
  12. (1)Matplotlib_xticks, yticks
  13. matlab怎么构建函数模型,matlab数学模型建立(如何用matlab建立数学模型及求解。哪位高手给个模版。)...
  14. 网上赚钱的方法门路有哪些?盘点网上赚钱最可靠的10种方法!
  15. 各层电子数排布规则_电子数的排布规律
  16. 微信小程序豆瓣电影学习知识总结
  17. git 提交代码防止尾行序列LF转为CRLF
  18. MyBatis Generator报错:Cannot instantiate object of type
  19. 赵丽颖冯绍峰官宣 | 微博服务器瘫痪!运维:该拿什么拯救我?
  20. 基于百度飞桨的单/多镜头行人追踪(非官方Baseline)

热门文章

  1. Sonible smart:bundle Mac - 智能音频插件合集
  2. Makefile的宏
  3. iOS小技能:RSA签名、验签、加密、解密的原理
  4. iOS应用程序安全(11)-分析使用HTTP/HTTPS的网络流量
  5. UI一揽子计划 2 (UITextField  UIButton)
  6. 企业税务筹划的注意事项
  7. Mysql中int、bigint、smallint 和 tinyint的区别详细介绍
  8. python画图显示中文_Python的matplotlib库画图不能显示中文问题解决
  9. 【死磕 Redis】----- 主从复制(二):全量复制和部分复制
  10. java丝袜_丝袜哥 --- swagger的使用