CSS3动画 animation
动画(animation)
兼容性
IE10+ | Firefox 16+ | Chrome 43+ | Sapafi 9+ | Opera 30+ | Android(-webkit) |
animation-name
检索或设置对象所应用的动画名称
语法
animation-name: keyframesname | none;
keyframesname
: 指定要绑定到选择器的关键帧的名称none
: 指定有没有动画(可用于覆盖从级联的动画)
.box{
-webkit-animation-name: circle;
animation-name: circle;
}
@keyframes circle {
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-duration
检索或设置对象动画的持续时间
语法
animation-duration: time;
time
: 指定动画播放完成花费的时间。默认值为0,即没有动画效果
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-timing-fuction
检索或设置对象动画的过渡类型
语法
animation-timing-fuction: ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(n,n,n,n);
ease
(默认) : 动画以低速开始,然后加快,在结束前变慢linear
: 动画从头到尾的速度是相同的ease-in
: 动画以低速开始ease-out
: 动画以低速结束ease-in-out
: 动画以低速开始和结束cubic-bezier(n,n,n,n)
: 在 cubic-bezier 函数中定义自己的值。可能的值是 0 至 1 之间的数值
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-delay
检索或设置对象动画的过渡类型
语法
animation-delay: time;
delay
: 可选,定义动画开始前等待的时间,以秒或毫秒计,默认为0
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
-webkit-animation-delay: 2s;
animation-delay: 2s;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-iteration-count
检索或设置对象动画的循环次数
语法
animation-iteration-count: infinite | <number>;
infinite
: 无限循环<number>
: 循环次数,默认值为1
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
-webkit-animation-delay: 2s;
animation-delay: 2s;
-webkit-animation-iteration-count: 4;
animation-iteration-count: 4;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-direction
检索或设置对象动画的在循环中是否反向运动
语法
animation-direction: normal | reverse | alternate | alternate-reverse | initial | inherit;
normal
: 正常方向reverse
: 反方向运行alternate
: 动画先正常方向运行,再反方向运行,并持续交替进行alternate-reverse
: 动画先反方向运行,再正常方向运行,并持续交替进行alternate
和alternate-reverse
依赖于循环次数animation-iteration-count
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
-webkit-animation-delay: 2s;
animation-delay: 2s;
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-webkit-animation-direction: alternate-reverse;
animation-direction: alternate-reverse;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-fill-mode
规定动画在播放之前或之后,其动画效果是否可见
语法
animation-fill-mode: none | forwards | backwards | both;
none
: 不改变默认行为forwards
: 当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)backwards
: 在 animation-delay 所指定的一段时间内,在动画显示之前,应用开始属性值(在第一个关键帧中定义)both
: 向前和向后填充模式都被应用
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
-webkit-animation-delay: 2s;
animation-delay: 2s;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation-play-state
规定动画正在运行还是暂停
语法
animation-fill-mode: paused | running;
paused
: 规定动画已暂停running
: 规定动画正在播放,默认值
利用
:hover
或者Javascript
来控制动画的暂停或播放
.box{
-webkit-animation-name: circle;
animation-name: circle;
-webkit-animation-duration: 2s;
animation-duration: 2s;
-webkit-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
-webkit-animation-delay: 2s;
animation-delay: 2s;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
-webkit-animation-play-state: paused;
animation-play-state: paused;
}
.box:hover{
-webkit-animation-play-state: running;
animation-play-state: running;
}
@keyframes circle{
from {transform: rotateX(0deg); }
to {transform: rotateX(180deg);}
}
animation属性简写
语法
animation: name duration timing-function delay iteration-count direction;
.box{
-webkit-animation: circle 10s ease-in-out 2s infinite alternate;
animation: circle 10s ease-in-out 2s infinite alternate;
}
@keyframes circle{
from {transform: rotate(0deg); }
to {transform: rotate(180deg);}
}
CSS3 @keyframes
关键帧,可以指定任何排列顺序来决定Animation动画变化的关键位置
以百分比来规定改变发生的时间,或者通过关键词 “from” 和 “to”,等价于 0% 和 100%
语法
@keyframes animationname {keyframes-selector {css-styles;}}
animationname
必需,定义动画的名称keyframes-selector
必需。动画时长的百分比。0-100% | from(与 0% 相同)| to(与 100% 相同)
css-styles
必需。一个或多个合法的 CSS 样式属性。
@-webkit-keyframes circle {
form { transform: rotateX(0deg); }
25% { transform: rotateX(45deg); }
75% { transform: rotateX(315deg); }
to { transform: rotateX(360deg); }
}
@keyframes circle {
form { transform: rotateX(0deg); }
25% { transform: rotateX(45deg); }
75% { transform: rotateX(315deg); }
to { transform: rotateX(360deg); }
}
动画性能优化 will-change
position-fixed
代替background-attachment
- 带图片的元素放在伪元素中
- 巧用
will-change
.front::before {
content: '';
position: fixed; // 代替background-attachment
width: 100%;
height: 100%;
top: 0;
left: 0;
background-color: white;
background: url(/img/front/mm.jpg) no-repeat center center;
background-size: cover;
will-change: transform; // 创建新的渲染层
z-index: -1;
}
作用
提前通知浏览器元素将要做什么动作,让浏览器提前准备合适的优化设置
目标
增强页面渲染性能
语法
/* 关键字值 */
will-change: auto;
will-change: scroll-position; /*将要改变元素的滚动位置*/
will-change: contents; /*将要改变元素的内容*/
will-change: transform; /* <custom-ident>示例 ,明确指定将要改变的属性与给定的名称*/
will-change: opacity; /* <custom-ident>示例 */
will-change: left, top; /* 两个<animateable-feature>示例 ,可动画的一些特殊值*/
/* 全局值 */
will-change: inherit;
will-change: initial;
will-change: unset;
就目前而言,使用的基本上都是:
.example {
will-change: transform;
}
使用注意事项
will-change
的使用要谨慎,遵循最小化影响原则,所以,上面的例子,才使用伪元素去搞,独立渲染
可以让父元素hover的时候,声明will-change
,这样,移出的时候就会自动remove
,触发的范围基本上是有效元素范围。
.will-change-parent:hover .will-change {
will-change: transform;
}
.will-change {
transition: transform 0.3s;
}
.will-change:hover {
transform: scale(1.5);
}
如果使用JS添加will-change
, 事件或动画完毕,一定要及时remove
. 比方说点击某个按钮,其他某个元素进行动画。点击按钮(click
),要先按下(mousedown
)再抬起才出发。因此,可以mousedown
时候打声招呼, 动画结束自带回调,于是:
dom.onmousedown = function() {
target.style.willChange = 'transform';
};
dom.onclick = function() {
// target动画...
};
target.onanimationend = function() {
// 动画结束回调,移除will-change
this.style.willChange = 'auto';
};