CSS3中Animation属性的使用详解


Posted in HTML / CSS onAugust 06, 2015

在开始介绍Animation之前我们有必要先来了解一个特殊的东西,那就是”Keyframes”,我们把他叫做“关键帧”,玩过flash的朋友可能对这个东西并不会陌生。下面我们就一起来看看这个“Keyframes”是什么东西。前面我们在使用transition制作一个简单的transition效果时,我们包括了初始属性和最终属性,一个开始执行动作时间和一个延续动作时间以及动作的变换速率,其实这些值都是一个中间值,如果我们要控制的更细一些,比如说我要第一个时间段执行什么动作,第二个时间段执行什么动作(换到flash中说,就是第一帧我要执行什么动作,第二帧我要执行什么动作),这样我们用Transition就很难实现了,此时我们也需要这样的一个“关键帧”来控制。那么CSS3的Animation就是由“keyframes”这个属性来实现这样的效果。下面我们一起先来看看Keyframes:

Keyframes具有其自己的语法规则,他的命名是由”@keyframes”开头,后面紧接着是这个“动画的名称”加上一对花括号“{}”,括号中就是一些不同时间段样式规则,有点像我们css的样式写法一样。对于一个”@keyframes”中的样式规则是由多个百分比构成的,如“0%”到”100%”之间,我们可以在这个规则中创建多个百分比,我们分别给每一个百分比中给需要有动画效果的元素加上不同的属性,从而让元素达到一种在不断变化的效果,比如说移动,改变元素颜色,位置,大小,形状等,不过有一点需要注意的是,我们可以使用“fromt”“to”来代表一个动画是从哪开始,到哪结束,也就是说这个 “from”就相当于”0%”而”to”相当于”100%”,值得一说的是,其中”0%”不能像别的属性取值一样把百分比符号省略,我们在这里必须加上百分符号(“%”)如果没有加上的话,我们这个keyframes是无效的,不起任何作用。因为keyframes的单位只接受百分比值。

Keyframes可以指定任何顺序排列来决定Animation动画变化的关键位置。其具体语法规则如下:

CSS Code复制内容到剪贴板
  1. keyframes-rule: '@keyframes' IDENT '{' keyframes-blocks '}';   
  2.  keyframes-blocks: [ keyframe-selectors block ]* ;   
  3.  keyframe-selectors: [ 'from' | 'to' | PERCENTAGE ] [ ',' [ 'from' | 'to' | PERCENTAGE ] ]*;  

把上面的语法综合起来

CSS Code复制内容到剪贴板
  1. @keyframes IDENT {   
  2.      from {   
  3.        Properties:Properties value;   
  4.      }   
  5.      Percentage {   
  6.        Properties:Properties value;   
  7.      }   
  8.      to {   
  9.        Properties:Properties value;   
  10.      }   
  11.    }  

   或者全部写成百分比的形式:

CSS Code复制内容到剪贴板
  1. @keyframes IDENT {   
  2.    0% {   
  3.       Properties:Properties value;   
  4.    }   
  5.    Percentage {   
  6.       Properties:Properties value;   
  7.    }   
  8.    100% {   
  9.       Properties:Properties value;   
  10.    }   
  11.  }  

其中IDENT是一个动画名称,你可以随便取,当然语义化一点更好,Percentage是百分比值,我们可以添加许多个这样的百分比,Properties为css的属性名,比如说left,background等,value就是相对应的属性的属性值。值得一提的是,我们from和to 分别对应的是0%和100%。这个我们在前面也提到过了。到目前为止支技animation动画的只有webkit内核的浏览器,所以我需要在上面的基础上加上-webkit前缀,据说Firefox5可以支持css3的 animation动画属性。

我们来看一个实例:

CSS Code复制内容到剪贴板
  1. @-webkit-keyframes 'test' {   
  2.      0% {   
  3.         margin-left100px;   
  4.         backgroundgreen;   
  5.      }   
  6.      40% {   
  7.         margin-left150px;   
  8.         background: orange;   
  9.      }   
  10.      60% {   
  11.         margin-left75px;   
  12.         backgroundblue;   
  13.      }   
  14.      100% {   
  15.         margin-left100px;   
  16.         backgroundred;   
  17.      }   
  18.   }  

这里我们定义了一个叫“test”的动画,他的动画是从0%开始到100%时结束,从中还经历了一个40%和60%两个过程,上面代码具体意思是:test动画在0%时元素定位到left为100px的位置背景色为green,然后40%时元素过渡到left为150px的位置并且背景色为orange,60%时元素过渡到left为75px的位置,背景色为blue,最后100%结束动画的位置元素又回到起点left为100px处,背景色变成red。假设置我们只给这个动画有10s的执行时间,那么他每一段执行的状态如下图所示:
CSS3中Animation属性的使用详解

Keyframes定义好了以后,我们需要怎么去调用刚才定义好的动画“test”

CSS3的animation类似于transition属性,他们都是随着时间改变元素的属性值。他们主要区别是transition需要触发一个事件(hover事件或click事件等)才会随时间改变其css属性;而animation在不需要触发任何事件的情况下也可以显式的随着时间变化来改变元素css的属性值,从而达到一种动画的效果。这样我们就可以直接在一个元素中调用animation的动画属性,基于这一点,css3的animation就需要明确的动画属性值,这也就是回到我们上面所说的,我们需要keyframes来定义不同时间的css属性值,达到元素在不同时间段变化的效果。

下面我们来看看怎么给一个元素调用animation属性

CSS Code复制内容到剪贴板
  1. .demo1 {   
  2.      width50px;   
  3.      height50px;   
  4.      margin-left100px;   
  5.      backgroundblue;   
  6.      -webkit-animation-name:'wobble';/*动画属性名,也就是我们前面keyframes定义的动画名*/  
  7.      -webkit-animation-duration: 10s;/*动画持续时间*/  
  8.      -webkit-animation-timing-function: ease-in-out; /*动画频率,和transition-timing-function是一样的*/  
  9.      -webkit-animation-delay: 2s;/*动画延迟时间*/  
  10.      -webkit-animation-iteration-count: 10;/*定义循环资料,infinite为无限次*/  
  11.      -webkit-animation-direction: alternate;/*定义动画方式*/  
  12.   }  

CSS Animation动画效果将会影响元素相对应的css值,在整个动画过程中,元素的变化属性值完全是由animation来控制,动画后面的会覆盖前面的属性值。如上面例子:因为我们这个demo只是在不同的时间段改变了demo1的背景色和左边距,其默认值是:margin-left:100px;background: blue;但当我们在执行动画0%时,margin-left:100px,background:green;当执行到40%时,属性变成了:margin-left:150px;background:orange;当执行到60%时margin-left:75px;background:blue;当动画 执行到100%时:margin-left:100px;background: red;此时动画将完成,那么margin-left和background两个属性值将是以100%时的为主,他不会产生叠加效果,只是一次一次覆盖前一次出将的css属性。就如我们平时的css一样,最后出现的权根是最大的。当动画结束后,样式回到默认效果。

HTML / CSS 相关文章推荐
css背景图片的背景裁切、背景透明度、背景变换等效果运用
Dec 24 HTML / CSS
详解CSS3阴影 box-shadow的使用和技巧总结
Dec 03 HTML / CSS
CSS3 分类菜单效果
May 27 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
Oct 08 HTML / CSS
基于HTML5的WebSocket的实例代码
Aug 15 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
May 25 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
Oct 26 HTML / CSS
html5设计原理(推荐收藏)
May 17 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
Sep 01 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
Apr 24 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
Mar 22 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
Dec 27 HTML / CSS
利用CSS3的transition属性实现滑动效果
Aug 05 #HTML / CSS
详解CSS3中@media的实际使用
Aug 04 #HTML / CSS
CSS3的RGBA中关于整数和百分比值的转换
Aug 04 #HTML / CSS
CSS3中使用RGBA设置透明度的示例
Aug 04 #HTML / CSS
详解CSS中iconfont的使用
Aug 04 #HTML / CSS
使用CSS3来匹配横屏竖屏的简单方法
Aug 04 #HTML / CSS
CSS3的一个简单导航栏实现
Aug 03 #HTML / CSS
You might like
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
PHP最常用的正则表达式
2017/02/13 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
Jquery弹出窗口插件 LeanModal的使用方法
2012/03/10 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
如何使用python进行pdf文件分割
2019/11/11 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
毕业设计论文评语
2014/12/31 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android