CSS3动画的一些小总结
总结的内容有的是一些平时自己遇到过的容易被忽略的,有的是个人觉得简单实用的,特此分享!
1、过渡
简单的状态变化只用transition就可以方便地实现:
1 2 3 4 | transition-property: 规定应用过渡的 CSS 属性的名称; transition-duration:定义过渡效果花费的时间,默认是 0 ; transition-timing-function : 规定过渡效果的时间曲线。 transition-delay: 规定过渡效果何时开始,默认是 0 |
在用的时候遇到一个问题,就是transition在动画退场时会有退场动画,相当于强制加上了反向播放,可是我并不想要这个反向播放,这时候就加上一个transition:none就好了,之后再用到动画的时候再给它加上transition。下图中的黄色框框的交互就是这样实现的。链接在此
2、多个动画效果的叠加
有时候动画可能不是一个keyframes可以实现的,比如一个先淡入淡出,再无限上下浮动的效果,就需要将动画分解,写两个keyframes动画帧:
1 2 3 | .keyframes(fadeIn,{……}); .keyframes(float,{……}); .element{animation:fadeIn 1 s,float 0.5 s 1 s infinate;}//先执行第一个 1 s后执行第二个,完美 |
另一个实现方法:标签嵌套,动画独立
1 2 3 4 5 | <div class= "element_wrap" ><div class= "element" ></div></div> .keyframes(fadeIn,{……}); .keyframes(float,{……}); .element_wrap{animation:fadeIn 1 s;} .element{animation:float 0.5 s 1 s infinate;} |
可能你要问为什么要这么写呢,明明上面这样的写法可以少写两行代码,可是有时候会有以下的情况:
同一个父元素中多个子元素都有不同的动画要执行,它们的前半节动画都是淡出,后面的半节有的上下浮动,有的左右浮动,有的旋转……
1 2 3 4 5 6 7 8 9 10 | //如果用上面一种方法来写,就是 .element 1 {aimation:fadeIn 1 s,float 0.5 s 1 s infinite;} .element 2 {aimation:fadeIn 1 s,floatLeft 0.5 s 1 s infinite;} .element 3 {aimation:fadeIn 1 s,rotate 0.5 s 1 s infinite;} //公用的动画不能统一维护,不如把公用部分放在父元素中 .element_wrap { animation: fadeIn 1 s; } /* 大家都1秒淡出 */ .element 1 { animation: float . 5 s 1 s infinite; } .element 2 { animation: size . 5 s 1 s infinite; } .element 3 { animation: move . 5 s 1 s infinite; } |
在用到transform的时候避免冲突,如果要实现一边旋转一边浮动的效果(如果不太复杂可以用transform:rotate... scale...)叠加的写法)
1 2 3 4 5 6 7 | .keyframes(rotate,{transform(rotate(...))}); .keyframes(float,{transform(translate(...))}); .element{animation:rotate 1 s float 1 s;} //前面的旋转会被后面的浮动覆盖掉 // 这个时候就可以这样写: .element_wrap{animation:rotate 1 s;} .element{animation:float 1 s;} |
3、不用动画去做定位
之前老是爱偷懒,爱用fill-mode属性去决定动画的起始位置,移动用用也就算了,一时用得高兴,在PC端也用。之后看了下IE,整个人都不好了。但是这样的写法有时候会带来一些不方便,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @keyframes spin-trans { 0% { transform: rotate( 0 )} 100% { transform: rotate( 360 deg) } } .element{ transform:translate( 50px , 50px );//这里的transform会被rotate动画里面的transform效果覆盖 animation:rotate 1 s;//是的没错,就是我覆盖的 } //机智如我,马上又改成了另一种写法 @keyframes spin-trans { 0% { transform: rotate( 0 ) translate( 50px , 50px );} 100% { transform: rotate( 360 deg) translate( 50px , 50px );} } .element{ animation:rotate 1 s forwards; } |
这样用动画来定位,降低动画的重用率,导致后面如果有同样的效果,这个动画也不能重用,而且在IE下得重新去给元素写定位,所以不要偷懒用动画去给元素定位。这个时候如果非要用transform去定位,可以在元素外层加一层父元素来做定位。
4、小插曲,与CSS无关
在IE8及以下版本的IE中如果img.src = src放在onload前面,如果图片是从缓存里面取到的,会出现图片已经预加载完了但是还没触发onload事件,所以在写预加载时要将onload放在给src赋值之前。
暂时只想到这么多,以后补充!
手机阅读请扫描下方二维码:
12345678

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
12345678

555
1
12345678

12345678

12345678

12345678

12345678

edlngkjjmjtlykmgjoww
12345678

12345678

12345678

1

1

1

1

1

1

1

1

1

1
1
555
1
1
1
1
1
1

1

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1