前端面试总躲不过的几个知识点,像js的prototype,css的动画,当然高级点的性能优化不在本教程的内容列表里面,属于提高的内容。而本节就着重讲css的动画讲清楚。
资源来自:https://www.w3schools.com/css/css3_animations.asp
注意:以下所有内容翻译自上述官方教材,可能需要查看,强烈推荐点击链接中的示例代码,对比分析加深印象。如果单单看下面的所有例子纯代码可能不够直观,毕竟咱们学的主题是动画啊。
caniuse: https://caniuse.com/#search=animation
动画指的就是通过css控制样式状态的改变。开发者可以任意设置想要改变的css属性和次数。当然了,为了使用CSS动画,也需要同样遵守相关的规则,而首要的就是为动画设置一些keyframes。(keyframes:顾名思义就是关键帧,这是css动画的核心)
当你在@keyframes设置css样式的时候,动画将会慢慢从当前的样式转变到新样式。当然了,丹丹设置keyframes还不行,因为逻辑上缺了与元素的绑定,那么该如何实现呢?就是通过设置对应的名称。下面举个例子:
例:动画取名叫example,绑定到对应的div中,动画持续4秒,动画的内容是背景色从红到黄。
/* The animation code */
@keyframes example {
from {background-color: red;}
to {background-color: yellow;}
}
/* The element to apply the animation to */
div {
width: 100px;
height: 100px;
background-color: red;
animation-name: example;
animation-duration: 4s;
}
注意:animation-duration属性定义了动画可以持续多长时间。如果这个属性没有被设置,动画就不会发生,因为默认值是0秒。
在上面这个例子中我们看到设置动画的核心就是在keyframe中的from和to两个关键字,这两个分别代表了动画进行到0%(也就是起始状态)和100%(也就是终止状态)。
是不是很奇怪上面的状态进度中为什么要引入百分比呢?因为动画其实是可以在每个百分比进度上定义关键帧(这个概念来自于flash动画,每个动画虽然以60帧每秒的速度快速播放着,但前后帧的关联度很高,完全可以通过设置关键的几帧和对应的过渡来压缩动画的大小)。
接下来这个例子我们就来试试这个百分比进度,同样是改变背景色,我们分别在25%,50%和100%的时候插入关键帧:
Example
/* The animation code */
@keyframes example {
0% {background-color: red;}
25% {background-color: yellow;}
50% {background-color: blue;}
100% {background-color: green;}
}
/* The element to apply the animation to */
div {
width: 100px;
height: 100px;
background-color: red;
animation-name: example;
animation-duration: 4s;
}
下面的例子中将会同时改变背景色和位置,同时保留上面的百分比设置:
Example
/* The animation code */
@keyframes example {
0% {background-color:red; left:0px; top:0px;}
25% {background-color:yellow; left:200px; top:0px;}
50% {background-color:blue; left:200px; top:200px;}
75% {background-color:green; left:0px; top:200px;}
100% {background-color:red; left:0px; top:0px;}
}
/* The element to apply the animation to */
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
}
有时候我们需要动画在几秒种后再触发,例如下面例子中就设置为2秒后触发:
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-delay: 2s;
}
有意思的是,animation-delay属性还能接受负数,如果设置为-2s,那么动画开始的时候直接从N-2秒开始,而这个N就是之前设置的animation-duration持续时间。动画看起来就像是从中间开始播放了。就像下面这个例子:
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-delay: -2s;
}
通过animatin-iteration-count属性可以设置动画运行的次数。下面的例子中我们设置动画运行3次
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-iteration-count: 3;
}
下面的例子中通过设置值为’infinite’来使动画无限重复下去。
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-iteration-count: infinite;
}
接下来我们通过设置animation-direction属性来控制动画的方向,可以是正常的运动(forwards),倒着来(backwards),或者是交替着来(alternate)。该属性包含以下这几个可选的值:
下面的例子中我们看下反向运动:
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-direction: reverse;
}
下面这个例子我们使用‘alternate’来实现交替的运动:
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-iteration-count: 2;
animation-direction: alternate;
}
下面的例子中我们实现 “alternate-reverse”
Example
div {
width: 100px;
height: 100px;
position: relative;
background-color: red;
animation-name: example;
animation-duration: 4s;
animation-iteration-count: 2;
animation-direction: alternate-reverse;
}
通过设置animation-timing-function可以设置动画的速度变化曲线,底层是基于贝塞尔曲线bezier function,具体可以百度下。
该属性包含以下的这些值:
下面例子展示了不同的速度曲线:
Example
#div1 {animation-timing-function: linear;}
#div2 {animation-timing-function: ease;}
#div3 {animation-timing-function: ease-in;}
#div4 {animation-timing-function: ease-out;}
#div5 {animation-timing-function: ease-in-out;}
动画的显示是有范围的,起始于第一帧播放,终止于最后帧的播放。而animation-fill-mode可以重写这个行为。
该属性设置了在动画运动之外的行为,意思是设置动画开始前和结束后的状态。有以下这些选型:
下面的例子保留最后一帧的状态:
Example
div {
width: 100px;
height: 100px;
background: red;
position: relative;
animation-name: example;
animation-duration: 3s;
animation-fill-mode: forwards;
}
下面的例子保留第一帧的状态:
Example
div {
width: 100px;
height: 100px;
background: red;
position: relative;
animation-name: example;
animation-duration: 3s;
animation-delay: 2s;
animation-fill-mode: backwards;
}
下面的例子在动画开始前保留第一帧,而在动画结束后保留最后一帧:
Example
div {
width: 100px;
height: 100px;
background: red;
position: relative;
animation-name: example;
animation-duration: 3s;
animation-delay: 2s;
animation-fill-mode: both;
}
一共有6个属性是可以简写的,就是以下这几个:
Example
div {
animation-name: example;
animation-duration: 5s;
animation-timing-function: linear;
animation-delay: 2s;
animation-iteration-count: infinite;
animation-direction: alternate;
}
同样效果可以像这样来速记:
Example
div {
animation: example 5s linear 2s infinite alternate;
}