1 在开始介绍Animation之前我们有必要先来了解一个特殊的东西,那就是"Keyframes",我们把他叫做“关键帧”,玩过flash的朋友可能对这个东西并不会陌生。下面我们就一起来看看这个“Keyframes”是什么东西。前面我们在使用transition制作一个简单的transition效果时,我们包括了初始属性和最终属性,一个开始执行动作时间和一个延续动作时间以及动作的变换速率,其实这些值都是一个中间值,如果我们要控制的更细一些,比如说我要第一个时间段执行什么动作,第二个时间段执行什么动作(换到flash中说,就是第一帧我要执行什么动作,第二帧我要执行什么动作),这样我们用Transition就很难实现了,此时我们也需要这样的一个“关键帧”来控制。那么CSS3的Animation就是由“keyframes”这个属性来实现这样的效果。下面我们一起先来看看Keyframes: 2 3 Keyframes具有其自己的语法规则,他的命名是由"@keyframes"开头,后面紧接着是这个“动画的名称”加上一对花括号“{}”,括号中就是一些不同时间段样式规则,有点像我们css的样式写法一样。对于一个"@keyframes"中的样式规则是由多个百分比构成的,如“0%”到"100%"之间,我们可以在这个规则中创建多个百分比,我们分别给每一个百分比中给需要有动画效果的元素加上不同的属性,从而让元素达到一种在不断变化的效果,比如说移动,改变元素颜色,位置,大小,形状等,不过有一点需要注意的是,我们可以使用“fromt”“to”来代表一个动画是从哪开始,到哪结束,也就是说这个 "from"就相当于"0%"而"to"相当于"100%",值得一说的是,其中"0%"不能像别的属性取值一样把百分比符号省略,我们在这里必须加上百分符号(“%”)如果没有加上的话,我们这个keyframes是无效的,不起任何作用。因为keyframes的单位只接受百分比值。 4 5 Keyframes可以指定任何顺序排列来决定Animation动画变化的关键位置。其具体语法规则如下: 6 7 keyframes-rule: '@keyframes' IDENT '{' keyframes-blocks '}'; 8 keyframes-blocks: [ keyframe-selectors block ]* ; 9 keyframe-selectors: [ 'from' | 'to' | PERCENTAGE ] [ ',' [ 'from' | 'to' | PERCENTAGE ] ]*; 10 11 12 我把上面的语法综合起来 13 14 @keyframes IDENT { 15 from { 16 Properties:Properties value; 17 } 18 Percentage { 19 Properties:Properties value; 20 } 21 to { 22 Properties:Properties value; 23 } 24 } 25 或者全部写成百分比的形式: 26 @keyframes IDENT { 27 0% { 28 Properties:Properties value; 29 } 30 Percentage { 31 Properties:Properties value; 32 } 33 100% { 34 Properties:Properties value; 35 } 36 } 37 38 39 40 其中IDENT是一个动画名称,你可以随便取,当然语义化一点更好,Percentage是百分比值,我们可以添加许多个这样的百分比,Properties为css的属性名,比如说left,background等,value就是相对应的属性的属性值。值得一提的是,我们from和to 分别对应的是0%和100%。这个我们在前面也提到过了。到目前为止支技animation动画的只有webkit内核的浏览器,所以我需要在上面的基础上加上-webkit前缀,据说Firefox5可以支持css3的 animation动画属性。 41 42 我们来看一个W3C官网的实例 43 44 @-webkit-keyframes 'wobble' { 45 0% { 46 margin-left: 100px; 47 background: green; 48 } 49 40% { 50 margin-left: 150px; 51 background: orange; 52 } 53 60% { 54 margin-left: 75px; 55 background: blue; 56 } 57 100% { 58 margin-left: 100px; 59 background: red; 60 } 61 } 62 63 64 65 这里我们定义了一个叫“wobble”的动画,他的动画是从0%开始到100%时结束,从中还经历了一个40%和60%两个过程,上面代码具体意思是:wobble动画在0%时元素定位到left为100px的位置背景色为green,然后40%时元素过渡到left为150px的位置并且背景色为orange,60%时元素过渡到left为75px的位置,背景色为blue,最后100%结束动画的位置元素又回到起点left为100px处,背景色变成red。假设置我们只给这个动画有10s的执行时间,那么他每一段执行的状态如下图所示: 66 67 68 69 Keyframes定义好了以后,我们需要怎么去调用刚才定义好的动画“wobble” 70 71 CSS3的animation类似于transition属性,他们都是随着时间改变元素的属性值。他们主要区别是transition需要触发一个事件(hover事件或click事件等)才会随时间改变其css属性;而animation在不需要触发任何事件的情况下也可以显式的随着时间变化来改变元素css的属性值,从而达到一种动画的效果。这样我们就可以直接在一个元素中调用animation的动画属性,基于这一点,css3的animation就需要明确的动画属性值,这也就是回到我们上面所说的,我们需要keyframes来定义不同时间的css属性值,达到元素在不同时间段变化的效果。 72 73 下面我们来看看怎么给一个元素调用animation属性 74 75 .demo1 { 76 width: 50px; 77 height: 50px; 78 margin-left: 100px; 79 background: blue; 80 -webkit-animation-name:'wobble';/*动画属性名,也就是我们前面keyframes定义的动画名*/ 81 -webkit-animation-duration: 10s;/*动画持续时间*/ 82 -webkit-animation-timing-function: ease-in-out; /*动画频率,和transition-timing-function是一样的*/ 83 -webkit-animation-delay: 2s;/*动画延迟时间*/ 84 -webkit-animation-iteration-count: 10;/*定义循环资料,infinite为无限次*/ 85 -webkit-animation-direction: alternate;/*定义动画方式*/ 86 } 87 88 89 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一样,最后出现的权根是最大的。当动画结束后,样式回到默认效果。 90 91 我们可以看一张来自w3c官网有关于css3的animation对属性变化的过程示意图 92 93 94 95 从上面的Demo中我们可以看出animation和transition一样有自己相对应的属性,那么在animation主要有以下几种:animation-name;animation-duration;animation-timing-function;animation-delay;animation-iteration-count;animation-direction;animation-play-state。下面我们分别来看看这几个属性的使用 96 97 一、animation-name: 98 99 语法: 100 101 animation-name: none | IDENT[,none | IDENT]*; 102 103 104 取值说明: 105 106 animation-name:是用来定义一个动画的名称,其主要有两个值:IDENT是由Keyframes创建的动画名,换句话说此处的IDENT要和Keyframes中的IDENT一致,如果不一致,将不能实现任何动画效果;none为默认值,当值为none时,将没有任何动画效果。另外我们这个属性跟前面所讲的transition一样,我们可以同时附几个animation给一个元素,我们只需要用逗号“,”隔开。 107 108 二、animation-duration: 109 110 语法: 111 112 animation-duration: <time>[,<time>]* 113 114 115 取值说明: 116 117 animation-duration是用来指定元素播放动画所持续的时间长,取值:<time>为数值,单位为s (秒.)其默认值为“0”。这个属性跟transition中的transition-duration使用方法是一样的。 118 119 三、animation-timing-function: 120 121 语法: 122 123 animation-timing-function:ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>) [, ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(<number>, <number>, <number>, <number>)]* 124 125 126 取值说明: 127 128 animation-timing-function:是指元素根据时间的推进来改变属性值的变换速率,说得简单点就是动画的播放方式。他和transition中的transition-timing-function一样,具有以下六种变换方式:ease;ease-in;ease-in-out;linear;cubic-bezier。具体的使用方法大家可以点这里,查看其中transition-timing-function的使用方法。 129 130 四、animation-delay: 131 132 语法: 133 134 animation-delay: <time>[,<time>]* 135 136 137 取值说明: 138 139 animation-delay:是用来指定元素动画开始时间。取值为<time>为数值,单位为s(秒),其默认值也是0。这个属性和transition-delayy使用方法是一样的。 140 141 五、animation-iteration-count 142 143 语法: 144 145 animation-iteration-count:infinite | <number> [, infinite | <number>]* 146 147 148 取值说明: 149 150 animation-iteration-count是用来指定元素播放动画的循环次数,其可以取值<number>为数字,其默认值为“1”;infinite为无限次数循环。 151 152 六、animation-direction 153 154 语法: 155 156 animation-direction: normal | alternate [, normal | alternate]* 157 取值说明: 158 159 animation-direction是用来指定元素动画播放的方向,其只有两个值,默认值为normal,如果设置为normal时,动画的每次循环都是向前播放;另一个值是alternate,他的作用是,动画播放在第偶数次向前播放,第奇数次向反方向播放。 160 161 七、animation-play-state 162 163 语法: 164 165 animation-play-state:running | paused [, running | paused]* 166 167 168 取值说明: 169 170 animation-play-state主要是用来控制元素动画的播放状态。其主要有两个值,running和paused其中running为默认值。他们的作用就类似于我们的音乐播放器一样,可以通过paused将正在播放的动画停下了,也可以通过running将暂停的动画重新播放,我们这里的重新播放不一定是从元素动画的开始播放,而是从你暂停的那个位置开始播放。另外如果暂时了动画的播放,元素的样式将回到最原始设置状态。这个属性目前很少内核支持,所以只是稍微提一下。 171 172 上面我们分别介绍了animation中的各个属性的语法和取值,那么我们综合上面的内容可以给animation属性一个速记法: 173 174 animation:[<animation-name> || <animation-duration> || <animation-timing-function> || <animation-delay> || <animation-iteration-count> || <animation-direction>] [, [<animation-name> || <animation-duration> || <animation-timing-function> || <animation-delay> || <animation-iteration-count> || <animation-direction>] ]* 175 176 177 如下图所示 178 179 180 181 兼容的浏览器 182 183 前面我也简单的提过,CSS3的animation到目前为止只支持webkit内核的浏览器,因为最早提出这个属性的就是safari公司,据说Firefox5.0+将支持Animation。如图所示 184 185 186 187 那么到此为止,我们主要一起学习了有关animation的理论知识,下面我们一起来看两个实例制作过程,来加强对animation的实践能力 188 189 DEMO一:发光变色的button 190 191 我们这个demo主要是通过在keyframes中改变元素的background;color;box-shadow三个属性,来达到一种发光变色的button效果,我们来看看其实现代码 192 193 HTML Code: 194 195 <a href="" class="btn">发光的button</a> 196 197 198 CSS Code 199 200 /*给这个按钮创建一个动名名称:buttonLight,然后在每个时间段设置不同的background,color来达到变色效果,改变box-shadow来达到发光效果*/ 201 @-webkit-keyframes 'buttonLight' { 202 from { 203 background: rgba(96, 203, 27,0.5); 204 -webkit-box-shadow: 0 0 5px rgba(255, 255, 255, 0.3) inset, 0 0 3px rgba(220, 120, 200, 0.5); 205 color: red; 206 } 207 25% { 208 background: rgba(196, 203, 27,0.8); 209 -webkit-box-shadow: 0 0 10px rgba(255, 155, 255, 0.5) inset, 0 0 8px rgba(120, 120, 200, 0.8); 210 color: blue; 211 } 212 50% { 213 background: rgba(196, 203, 127,1); 214 -webkit-box-shadow: 0 0 5px rgba(155, 255, 255, 0.3) inset, 0 0 3px rgba(220, 120, 100, 1); 215 color: orange; 216 } 217 75% { 218 background: rgba(196, 203, 27,0.8); 219 -webkit-box-shadow: 0 0 10px rgba(255, 155, 255, 0.5) inset, 0 0 8px rgba(120, 120, 200, 0.8); 220 color: black; 221 } 222 to { 223 background: rgba(96, 203, 27,0.5); 224 -webkit-box-shadow: 0 0 5px rgba(255, 255, 255, 0.3) inset, 0 0 3px rgba(220, 120, 200, 0.5); 225 color: green; 226 } 227 } 228 a.btn { 229 /*按钮的基本属性*/ 230 background: #60cb1b; 231 font-size: 16px; 232 padding: 10px 15px; 233 color: #fff; 234 text-align: center; 235 text-decoration: none; 236 font-weight: bold; 237 text-shadow: 0 -1px 1px rgba(0,0,0,0.3); 238 -moz-border-radius: 5px; 239 -webkit-border-radius: 5px; 240 border-radius: 5px; 241 -moz-box-shadow: 0 0 5px rgba(255, 255, 255, 0.6) inset, 0 0 3px rgba(220, 120, 200, 0.8); 242 -webkit-box-shadow: 0 0 5px rgba(255, 255, 255, 0.6) inset, 0 0 3px rgba(220, 120, 200, 0.8); 243 box-shadow: 0 0 5px rgba(255, 255, 255, 0.6) inset, 0 0 3px rgba(220, 120, 200, 0.8); 244 /*调用animation属性,从而让按钮在载入页面时就具有动画效果*/ 245 -webkit-animation-name: "buttonLight"; /*动画名称,需要跟@keyframes定义的名称一致*/ 246 -webkit-animation-duration: 5s;/*动画持续的时间长*/ 247 -webkit-animation-iteration-count: infinite;/*动画循环播放的次数*/ 248 } 249 250 251 效果: 252 253 效果一变化中效果二 254 255 为了更好的看出这个demo的效果,你可以把上面的代码复制到你本过的页面上,并使用safari和chrome,你会觉得很有意思,整个按钮好像在不停的呼吸一样。 256 257 Demo二:方形旋转变成圆型 258 259 我们这个demo是通过transform的rotate和border-radius不同值,把一个方型图片随着时间的推移,慢慢的转换成了个圆型效果,下面我们来看看其具体实现的效果 260 261 HTML Code: 262 263 <a href="#" class="box"></a> 264 <span class="click-btn">Click</span> 265 266 267 CSS Code: 268 269 /*定义方型转化为圆型的动画round*/ 270 @-webkit-keyframes 'round' { 271 from{ 272 -webkit-transform: rotate(36deg); 273 -webkit-border-radius: 2px; 274 } 275 10%{ 276 -webkit-transform: rotate(72deg); 277 -webkit-border-radius: 4px; 278 } 279 20% { 280 -webkit-transform: rotate(108deg); 281 -webkit-border-radius: 6px; 282 } 283 30% { 284 -webkit-transform: rotate(144deg); 285 -webkit-border-radius: 9px; 286 } 287 40%{ 288 -webkit-transform: rotate(180deg); 289 -webkit-border-radius: 12px; 290 } 291 50%{ 292 -webkit-transform: rotate(216deg); 293 -webkit-border-radius: 14px; 294 } 295 60% { 296 -webkit-transform: rotate(252deg); 297 -webkit-border-radius: 16px; 298 } 299 70% { 300 -webkit-transform: rotate(288deg); 301 -webkit-border-radius: 19px; 302 } 303 80%{ 304 -webkit-transform: rotate(324deg); 305 -webkit-border-radius: 22px; 306 } 307 to { 308 -webkit-transform: rotate(360deg); 309 -webkit-border-radius: 25px; 310 } 311 } 312 /*给方型box一个初步样式*/ 313 a.box { 314 display: block; 315 width: 50px; 316 height: 50px; 317 background: red; 318 margin-bottom: 20px; 319 } 320 /*圆型box的样式,并在这里应用animation*/ 321 a.round { 322 -webkit-border-radius: 25px; 323 -moz-border-radius: 25px; 324 border-radius: 25px; 325 background: green; 326 -webkit-animation-name: 'round'; /*动画名称*/ 327 -webkit-animation-duration: 60s;/*播放一次所持续时间*/ 328 -webkit-animation-timing-function: ease;/*动画播放频率*/ 329 -webkit-animation-iteration-count: infinite;/*动画播放次涒为无限次*/ 330 } 331 332 /*click button效果*/ 333 .click-btn { 334 background: rgba(125,220,80,0.8); 335 -moz-border-radius: 5px; 336 -webkit-border-radius: 5px; 337 border-radius: 5px; 338 -webkit-box-shadow: inset 0 0 8px rgba(255,255,255,0.8),0 0 10px rgba(10,255,120,0.3); 339 -moz-box-shadow: inset 0 0 8px rgba(255,255,255,0.8),0 0 10px rgba(10,255,120,0.3); 340 box-shadow: inset 0 0 8px rgba(255,255,255,0.8),0 0 10px rgba(10,255,120,0.3); 341 padding: 5px 10px; 342 color: #369; 343 font-size: 16px; 344 font-weight: bold; 345 text-align: center; 346 text-shadow: 0 -1px 0 rgba(0,0,0,0.5); 347 cursor: pointer; 348 } 349 350 351 jQuery Code: 352 353 <script type="text/javascript"> 354 $(document).ready(function(){ 355 $(".click-btn").click(function(){ 356 $(this).siblings().addClass("round"); 357 }); 358 }); 359 </script> 360 361 362374 原文: http://www.w3cplus.com/content/css3-animation © w3cplus.com