前面的话

  transition过渡是通过初始和结束两个状态之间的平滑过渡实现简单动画的;而animation则是通过关键帧@keyframes来实现更为复杂的动画效果。本文将介绍关于animation动画的相关知识

定义

  和transition类似,animation也是一个复合属性,包括animation-name、animation-duration、animation-timing-function、animation-delay、animation-iteration-count、animation-direction、animation-play-state、animation-fill-mode共8个子属性

  [注意]IE9-不支持;safari4-8、IOS3.2-8.4、android2.1-4.4.4需要添加-webkit-前缀

  1. animation-name: 动画名称(默认值为none)
  2. animation-duration: 持续时间(默认值为0)
  3. animation-timing-function: 时间函数(默认值为ease)
  4. animation-delay: 延迟时间(默认值为0)
  5. animation-iteration-count: 循环次数(默认值为1)
  6. animation-direction: 动画方向(默认值为normal)
  7. animation-play-state: 播放状态(默认值为running)
  8. animation-fill-mode: 填充模式(默认值为none)
  1. div{
  2. width: 300px;
  3. height: 100px;
  4. background-color: pink;
  5. animation-name: test;
  6. animation-duration: 3s;
  7. animation-timing-function: ease;
  8. animation-delay: 0s;
  9. animation-iteration-count: infinite;
  10. animation-direction: normal;
  11. animation-play-state: running;
  12. animation-fill-mode: none;
  13. }
  14. /* 关于keyframes关键帧的内容稍后介绍 */
  15. @keyframes test{
  16. 0%{background-color: lightblue;}
  17. 30%{background-color: lightgreen;}
  18. 60%{background-color: lightgray;}
  19. 100%{background-color: black;}
  20. }

关键帧

  animation制作动画效果需要两步,首先用关键帧声明动画,再用animation调用动画

  关键帧的语法是以@keyframes开头,后面紧跟着动画名称animation-name。from等同于0%,to等同于100%。百分比跟随的花括号里面的代码,代表此时对应的样式

  1. @keyframes animation-name{
  2. from | %{}
  3. n%{}
  4. to | %{}
  5. }

【1】百分比顺序不一定非要从0%到100%排列,最终浏览器会自动按照0%-100%的顺序进行解析

  [注意]0%不可以省略百分号

  1. @keyframes test{
  2. %{background-color: black;}
  3. %{background-color: lightgray;}
  4. %{background-color: lightgreen;}
  5. %{background-color: lightblue;}
  6. }
  1. div{
  2. width: 300px;
  3. height: 100px;
  4. background-color: pink;
  5. animation-name: test;
  6. animation-duration: 3s;
  7. animation-iteration-count: infinite;
  8. }

【2】如果存在负百分数或高于100%的百分数,则该关键帧将被忽略

  1. /* -20%和120%对应的代码无效*/
  2. @keyframes test{
  3. -%{background-color: red;}
  4. %{background-color: lightblue;}
  5. %{background-color: lightgreen;}
  6. %{background-color: lightgray;}
  7. %{background-color: black;}
  8. %{background-color: yellow;}
  9. }

【3】如果0%或100%不指定关键帧,将使用该元素默认的属性值

  1. /* 0%和100%对应的颜色是默认值pink*/
  2. @keyframes test{
  3. %{background-color: lightgreen;}
  4. %{background-color: lightgray;}
  5. }

【4】若存在多个@keyframes,浏览器只识别最后一个@keyframes里面的值

  1. /* 后面覆盖前面 */
  2. @keyframes test{
  3. %{background-color: lightblue;}
  4. %{background-color: lightgreen;}
  5. %{background-color: lightgray;}
  6. %{background-color: black;}
  7. }
  8. @keyframes test{
  9. %{background-color: blue;}
  10. %{background-color: green;}
  11. %{background-color: gray;}
  12. %{background-color: black;}
  13. }

【5】空的keyframes规则是有效的,它们会覆盖前面有效的关键帧规则

  1. /* 后面覆盖前面 */
  2. @keyframes test{
  3. %{background-color: lightblue;}
  4. %{background-color: lightgreen;}
  5. %{background-color: lightgray;}
  6. %{background-color: black;}
  7. }
  8. @keyframes test{
  9. }

动画属性

动画名称

animation-name

  值: none | <single-animation-name> [, <single-animation-name> ]*

  初始值: none

  应用于: 所有元素

  继承性: 无

  1. <single-animation-name>: none | 自定义动画名称

【1】如果多个动画试图修改相同的属性,那么动画列表的后面覆盖前面

  1. /* animation-name的顺序是test1,test2,且它们修改的是同样的属性,后面覆盖前面,所以test2有效,test1无效 */
  2. div{
  3. width: 300px;
  4. height: 100px;
  5. background-color: pink;
  6. animation-name: test1,test2;
  7. animation-duration: 3s;
  8. animation-iteration-count: infinite;
  9. }
  10. @keyframes test2{
  11. %{background-color: blue;}
  12. %{background-color: green;}
  13. %{background-color: gray;}
  14. %{background-color: black;}
  15. }
  16. @keyframes test1{
  17. %{background-color: lightblue;}
  18. %{background-color: lightgreen;}
  19. %{background-color: lightgray;}
  20. %{background-color: black;}
  21. }

【2】如果动画的其他7个子属性和动画名称的长度不同,动画名称列表的长度决定最终的长度,多余的值无余,缺少的值按照顺序进行重复

  1. div{
  2. width: 300px;
  3. height: 100px;
  4. position: relative;
  5. background-color: pink;
  6. animation-name: test1,test2,test3;
  7. animation-duration: 3s,1s;
  8. animation-iteration-count: infinite;
  9. }
  10. @keyframes test1{
  11. %{background-color: lightblue;}
  12. %{background-color: lightgreen;}
  13. %{background-color: lightgray;}
  14. %{background-color: black;}
  15. }
  16. @keyframes test2{
  17. %{font-size: 20px;}
  18. %{font-size: 30px;}
  19. %{font-size: 40px;}
  20. %{font-size: 50px;}
  21. }
  22. @keyframes test3{
  23. %{left: 0px;}
  24. %{left: 30px;}
  25. %{left: 40px;}
  26. %{left: 50px;}
  27. }
  1. <div>测试文字</div>

持续时间

  持续时间指完成动画的时间

animation-duration

  值: <time> [, <time>]*

  初始值: 0s

  应用于: 所有元素

  继承性: 无

  1. animation-duration: <time>[,<time>]*

  0s意味着动画没有时间,持续时间不能为负值

  1. animation-name: test1,test2;
  2. /*test1的持续时间设置为负值,将使得整个动画持续时间都失效,因此test2也将没有动画效果 */
  3. animation-duration: -1s,1s;

时间函数

animation-timing-function

  值: <single-timing-function> [, <single-timing-function>]*

  初始值: ease

  应用于: 所有元素

  继承性: 无

  animation的时间函数类似于transition的时间函数。时间函数可以应用于整个动画中,也可以应用于关键帧的某两个百分比之间

  1. div{
  2. width: 300px;
  3. height: 100px;
  4. position: relative;
  5. background-color: pink;
  6. animation-name: test;
  7. animation-duration: 5s;
  8. animation-iteration-count: infinite;
  9. }
  10.  
  11. @keyframes test{
  12. %{left: 0px;animation-timing-function: ease;}
  13. %{left: 50px;animation-timing-function: linear;}
  14. %{left: 100px;animation-timing-function: ease-in;}
  15. %{left: 150px;animation-timing-function: ease-out;}
  16. %{left: 200px;animation-timing-function: step-start;}
  17. %{left: 250px;animation-timing-function: step-end;}
  18. }

循环次数

animation-iteration-count

  值: infinite | <number>[,infinite | <number>]*

  初始值: 1

  应用于: 所有元素

  继承性: 无

  默认为1,可以是整数也可以小数,但不能是0和负数。如果为infinite则表示无限次动画

动画方向

  动画方向用来定义是否动画需要反向播放

animation-direction

  值: <single-animation-direction>[,<single-animation-direction> ]*

  初始值: normal

  应用于: 所有元素

  继承性: 无

  1. <single-animation-direction> = normal | reverse | alternate | alternate-reverse
  2. normal: 正向播放
  3. reverse: 反向播放
  4. alternate: 若动画只播放一次,则和正向播放一样。若播放两次以上,偶数次效果为反向播放
  5. alternate-reverse: 若动画只播放一次,则和反向播放一样。若播放两次以上,偶数次效果为正向播放

  [注意]safari浏览器不支持reverse属性和alternate-reverse属性

动画状态

animation-play-state

  值:running | paused[,running | paused]*

  初始值: running

  应用于: 所有元素

  继承性: 无

  running表示播放中,paused表示动画暂停

延迟时间

  定义延迟多少时间后动画开始播放

animation-delay

  值: <single-animation-delay>[,<single-animation-delay> ]*

  初始值: 0s

  应用于: 所有元素

  继承性: 无

  1. <single-animation-delay>= <time>[,<time>]*

  [注意]该延迟时间是指整个动画的延迟时间,而不是每个循环的延迟时间,只在动画开始时进行一次时间延迟

  如果该值是负值,则表示动画的起始时间从0s变为延迟时间的绝对值

填充模式

  定义动画开始帧之前和结束帧之后的动作

  [注意]android2.1-3不支持animation-fill-mode

animation-fill-mode

  值: <single-animation-fill-mode>[,<single-animation-fill-mode> ]*

  初始值: none

  应用于: 所有元素

  继承性: 无

  1. <single-animation-fill-mode> = none | forwards | backwards | both
  1. none: 动画结束后,元素移动到初始状态
  2. [注意]初始状态并不是指0%的元素状态,而是元素本身属性值
  3. forwards: 元素停在动画结束时的位置
  4. [注意]动画结束时的位置并不一定是100%定义的位置,因为动画有可能反向运动,也有可能动画的次数是小数
  5. backwards:在animation-delay的时间内,元素立刻移动到动画开始时的位置。若元素无animation-delay时,与none的效果相同
  6. [注意]动画开始时的位置也不一定是0%定义的位置,因为动画有可能反向运动。
  7. both: 同时具有forwardsbackwards的效果

  [注意]当持续时间animation-duration为0s时,animation-fill-mode依然适用,当animation-fill-mode的值为backwards时,动画填充在任何animation-delay的阶段。当animation-fill-mode的值为forwards时,动画将保留在100%的关键帧上

多值

animation

  值: <single-animation>[,<single-animation> ]*

  初始值: 无

  应用于: 所有元素

  继承性: 无

  1. <single-animation> = <single-animation-name> || <single-animation-duration> || <single-animation-timing-function> || <single-animation-delay> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state>

  [注意]持续时间在前,延迟时间在后,若只存在一个时间,则是持续时间

  1. div{
  2. width: 300px;
  3. height: 100px;
  4. background-color: pink;
  5. animation: 1s test1,infinite test2 2s 1s;
  6. }
  7. @keyframes test1{
  8. %{background-color: red;}
  9. %{background-color: blue;}
  10. %{background-color: green;}
  11. }
  12. @keyframes test2{
  13. %{color: white;}
  14. }

API

  animation涉及到的事件有animationstart、animationend、animationiteration三个。这三个事件的bubbles都是yes,cancelable都是no

  [注意]对于safari浏览器,animation的事件为webkitAnimationStart、webkitAnimationEnd、webkitAnimationIteration

  [注意]动画事件只支持DOM2级事件处理程序的写法

animationstart

  发生在动画开始时

  【1】如果存在delay,且delay为正值,则元素等待延迟完毕后,再触发该事件

  【2】如果delay为负值,则元素先将初始值变为delay的绝对值时,再触发该事件

  1. oSb.addEventListener('animationstart',function(){
  2. this.innerHTML = '动画开始';
  3. this.style.background = 'lightgreen';
  4. },false);

animationend

  发生在动画结束时

  1. test.addEventListener('animationend',function(){
  2. this.style.background="lightgreen";
  3. this.innerHTML = '动画结束';
  4. },false);

animationiteration

  发生在动画的一次循环结束时,只有当iteration-count循环次数大于1时,触发该事件

  1. var i = ;
  2. oSb.addEventListener('animationiteration',function(){
  3. i++;
  4. this.innerHTML = i;
  5. },false);

【补充】

  只有改变animation-name时,才会使animation动画效果重新触发

  1. oSb.style.animationName = 'none';
  2. setTimeout(function(){
  3. oSb.style.animationName = 'test';
  4. },);

属性

  这三个事件的事件对象,都有animationName和elapsedTime属性这两个私有属性

  1. animationName属性:返回产生过渡效果的CSS属性名
  2. elapsedTime属性:动画已经运行的秒数

  [注意]对于animationstart事件,elapsedTime属性等于0,除非animation-delay属性等于负值

  1. <style>
  2. #test{height:100px;width:300px;background-color:lightblue;animation:anim 2s 3;}
  3. @keyframes anim{
  4. 0%{height: 100px;}
  5. 50%{height: 50px;}
  6. 100%{height: 0;}
  7. }
  8. </style>
  9.  
  10. <button id='reset'>还原</button>
  11. <div id="test"></div>
  12. <script>
  13. reset.onclick = function(){
  14. history.go();
  15. }
  16. test.addEventListener("animationstart", listener, false);
  17. test.addEventListener("animationend", listener, false);
  18. test.addEventListener("animationiteration", listener, false);
  19. function listener(e){
  20. e = e || event;
  21. var li = document.createElement("li");
  22. switch(e.type) {
  23. case "animationstart":
  24. li.innerHTML = "Started: elapsed time is " + e.elapsedTime;
  25. break;
  26. case "animationend":
  27. li.innerHTML = "Ended: elapsed time is " + e.elapsedTime;
  28. break;
  29. case "animationiteration":
  30. li.innerHTML = "New loop started at time " + e.elapsedTime;
  31. break;
  32. }
  33. test.appendChild(li);
  34. }
  35. </script>

深入理解CSS动画animation的更多相关文章

  1. amazeui学习笔记--css(常用组件15)--CSS动画Animation

    amazeui学习笔记--css(常用组件15)--CSS动画Animation 一.总结 1.css3动画封装:CSS3 动画封装,浏览器需支持 CSS3 动画. Class 描述 .am-anim ...

  2. css动画-animation各个属性详解(转)

    CSS3的animation很容易就能实现各种酷炫的动画,虽然看到别人的成果图会觉得很难,但是如果掌握好各种动画属性,做好酷炫吊炸天的动画都不在话下,好,切入正题. 一.动画属性: 动画属性包括:①a ...

  3. CSS动画 animation与transition

    一.区分容易混淆的几个属性和值 先区分一下css中的几个属性:animation(动画).transition(过渡).transform(变形).translate(移动). CSS3中的trans ...

  4. css动画 animation

    今天用css做了一个简单的三角上下移动的一个小动画,说白了就是在改变该物体的height值.除了这个方法,还可以用js. 一.在用css写动画时,一定要记住兼容性问题.如何解决该兼容性?在前面加内核前 ...

  5. CSS动画animation

    transition: 过渡动画transition-property: 属性transition-duration: 间隔transition-timing-function: 曲线transiti ...

  6. css 动画animation基本属性(干货)

    /* 动画名称 */ animation-name: cloud; /* 属性定义动画完成一个周期所需要的时间,以秒或毫秒计 */ animation-duration:1s; /* 属性定义动画何时 ...

  7. CSS动画-transition/animation

    HTML系列: 人人都懂的HTML基础知识-HTML教程(1) HTML元素大全(1) HTML元素大全(2)-表单 CSS系列: CSS基础知识筑基 常用CSS样式属性 CSS选择器大全48式 CS ...

  8. 使用css动画实现领积分效果

    最近项目中要做一个领积分的效果,根据老板的描述,这个效果类似于支付宝蚂蚁森林里的领取能量.整体效果是就是在树周围飘着几个积分元素,上下滑动,类似星星闪烁,点击领取后,沿着树中心的位置滑动并消失,树上的 ...

  9. 前端深入之css篇丨2020年前,彻底掌握css动画【animation】

    写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...

随机推荐

  1. TODO:搭建Laravel VueJS SemanticUI

    TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...

  2. iOS热更新-8种实现方式

    一.JSPatch 热更新时,从服务器拉去js脚本.理论上可以修改和新建所有的模块,但是不建议这样做. 建议 用来做紧急的小需求和 修复严重的线上bug. 二.lua脚本 比如: wax.热更新时,从 ...

  3. OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)

    上一节我们启用了 Open vSwitch,本节将查看当前的网络状态并介绍 Open vSwitch 涉及的各种网络设备 初始网络状态 查看一下当前的网络状态. 控制节点 ifconfig 显示控制节 ...

  4. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

  5. Flexible 弹性盒子模型之CSS flex-grow 属性

    实例 让第二个元素的宽度为其他元素的三倍: div:nth-of-type(1){flex-grow:1;} div:nth-of-type(2){flex-grow:3;} div:nth-of-t ...

  6. 中国CIO最关心的八大问题(下)

    中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...

  7. 非技术1-学期总结&ending 2016

    好久好久没写博客了,感觉动力都不足了--12月只发了一篇博客,好惭愧-- 今天是2016年最后一天,怎么能不写点东西呢!! 学期总结 大学中最关键一年的第一个学期,共4个月.前20天在学网络方面的,当 ...

  8. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  9. ES6 箭头函数中的 this?你可能想多了(翻译)

    箭头函数=>无疑是ES6中最受关注的一个新特性了,通过它可以简写 function 函数表达式,你也可以在各种提及箭头函数的地方看到这样的观点——“=> 就是一个新的 function”. ...

  10. Java:Double Brace Initialization

    在我刚刚接触现在这个产品的时候,我就在我们的代码中接触到了对Double Brace Initialization的使用.那段代码用来初始化一个集合: final Set<String> ...