通过之前的学习我们知道,利用 transition 属性可以实现简单的过渡动画,但过渡动画仅能指定开始和结束两个状态,整个过程都是由特定的函数来控制的,不是很灵活。本节我们再来介绍一种更为复杂的动画 —— animation。

动画(animation):和过渡类似,都是可以实现一些动态的效果,不同的是过渡需要在某个属性发生变化时才可以触发,而动画效果则可以自动触发动态效果。设置动画效果必须先要设置一个关键帧,关键帧设置了动画执行的每一个步骤。关键帧设置的格式如下:

<style>
    /* 定义动画关键帧,关键帧的名字为test */
    @keyframes test{
        /* from表示动画的开始位置,也可以使用0%来表示。 */
        from{
            margin-left: 0;
        }
        /* to表示动画的结束位置,也可以使用100%来表示。 */
        to{
            margin-left: 100%;
        }
    }
</style>

CSS 中的动画类似于 flash 中的逐帧动画,表现细腻并且非常灵活,使用 CSS 中的动画可以取代许多网页中的动态图像、Flash 动画或者 JavaScript 实现的特殊效果。

动画就是使元素从一种样式逐渐变化为另一种样式的效果。我们可以改变任意多的样式任意多的次数(很官方的回答)。

CSS3animation(动画)属性。

@keyframes

通过 @keyframes 规则,我们可以创建动画。

创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。在动画过程中我们能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间,或者通过关键词 “from” 和 “to”,等价于 0% 和 100%。

0% 是动画的开始时间,100% 动画的结束时间。为了获得最佳的浏览器支持,我们应该始终定义 0% 和 100% 选择器。这里面0%就是一帧,50%是一帧,100%也是一帧。

最后,请使用动画属性来控制动画的外观,同时将动画与选择器绑定

animationname 必需。定义动画的名称。

keyframes-selector	必需。动画时长的百分比
合法的值:
0-100%
from(与 0% 相同)
to(与 100% 相同)

css-styles 必需。一个或多个合法的 CSS 样式属性

举个例子:

@keyframes name
{
0%   {top:0px; left:0px; background:red;}
25%  {top:0px; left:100px; background:blue;}
50%  {top:100px; left:100px; background:yellow;}
75%  {top:100px; left:0px; background:green;}
100% {top:0px; left:0px; background:red;}
}

1. animation-name属性:设置需要绑定到元素的动画名称。

animation-name 属性用来将动画绑定到指定的 HTML 元素,属性的可选值如下:

描述
keyframename要绑定到 HTML 元素的动画名称,可以同时绑定多个动画,动画名称之间使用逗号进行分隔
none表示无动画效果,
<!DOCTYPE html>
<html>
<head>
    <style>
        @keyframes ball {
            0% { top: 0px; left: 0px;}
            25% { top: 0px; left: 350px;}
            50% { top: 200px; left: 350px;}
            75% { top: 200px; left: 0px;}
            100% { top: 0px; left: 0px;} 
        }
        div {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            border: 3px solid black;
            position: relative;
            animation-name: ball;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

运行结果:

animation-name属性


注意:要想让动画成功播放,您还需要定义 animation-duration 属性,否则会因为 animation-duration 属性的默认值为 0,导致动画并不会播放。

2. animation-duration属性:定义动画完成一个周期需要多少秒或毫秒。

● time:指定动画播放完成花费的时间。默认值为 0, 意味着没有动画效果。

<!DOCTYPE html>
<html>
<head>
    <style>
        @keyframes ball {
            0% { top: 0px; left: 0px;}
            25% { top: 0px; left: 350px;}
            50% { top: 200px; left: 350px;}
            75% { top: 200px; left: 0px;}
            100% { top: 0px; left: 0px;} 
        }
        div {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            border: 3px solid black;
            position: relative;
            animation-name: ball;
            animation-duration: 2s;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

3. animation-timing-function:使用的数学函数,称为三次贝塞尔曲线、速度曲线。使用此函数,你可以使用自己的值,或使用预先定义的值之一。

● linear:动画从头到尾的速度是相同的;

● ease:默认。动画从低开始,然后加快,在结束之前变慢;

● ease-in:动画以低速开始;

● ease-out:动画以低速结束;

● ease-in-out:动画以低速开始和结束;

● cubic-bezier(n,n,n,n):使用 cubic-bezier() 函数来定义动画的播放速度,参数的取值范围为 0 到 1 之间的数值。


4. animation-delay属性:定义动画什么时候开始。

● time:可选。定义动画开始前等待的时间,以秒或毫秒计。默认值为0。

注意:单位可以说秒(s)或毫秒(ms)。

5. animation-iteration-count属性:定义动画应该播放多少次。

属性的可选值如下:

描述
n使用具体数值定义动画播放的次数,默认值为 1
infinite表示动画无限次播放

6. animation-direction属性:定义是否循环交替反向播放动画。

● normal:默认值。动画正常播放;

● reverse:动画反向播放;

● alternate:动画在奇数次(1、2、5…)正向播放,在偶数次(2、4、6…)反向播放;

● alternate-reverse:动画在奇数次(1、3、5…)反向播放,在偶数次(2、4、6…)正向播放。

7. animation-fill-mode 属性:规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。

注意:默认情况下,CSS 动画在第一个关键帧播放完之前不会影响元素,在最后一个关键帧完成后停止影响元素。animation-fill-mode 属性可重写该行为。

● none 默认值。:动画在动画执行之前和之后不会应用任何样式到目标元素;

● forwards:在动画结束后(由 animation-iteration-count 决定),动画将应用该属性值;

● backwards :动画将应用在 animation-delay 定义期间启动动画的第一次迭代的关键帧中定义的属性值。这些都是 from 关键帧中的值(当 animation-direction 为 “normal” 或 “alternate” 时)或 to 关键帧中的值(当 animation-direction 为 “reverse” 或 “alternate-reverse” 时);

● both 动画遵循 forwards 和 backwards 的规则。也就是说,动画会在两个方向上扩展动画属性。

8. animation-play-state:指定动画是否正在运行或已暂停。

● paused:指定暂停动画;

● running:指定正在运行的动画。

9. initial:设置属性为其默认值。

● initial:关键字用于设置 CSS 属性为它的默认值;

● initial:关键字可用于任何 HTML 元素上的任何 CSS 属性。

10. inherit:从父元素继承属性。

● inherit:关键字指定一个属性应从父元素继承它的值;

● inherit:关键字可用于任何 HTML 元素上的任何 CSS 属性。

animation

animation 属性是 animation-name、animation-duration、animation-timing-function、animation-delay、animation-iteration-count、animation-direction、animation-fill-mode、animation-play-state 几个属性的简写形式,通过 animation 属性可以同时定义上述的多个属性,语法格式如下:

animation: animation-name animation-duration animation-timing-function animation-delay animation-iteration-count animation-direction animation-fill-mode animation-play-state;

其中每个参数分别对应上面介绍的各个属性,如果省略其中的某个或多个值,则将使用该属性对应的默认值。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>动画</title>
    <style>
        .box1{
            width: 700px;
            height: 500px;
            background-color: silver;
        }
        .box2{
            width: 100px;
            height: 100px;
            background-color: #bfa;
            margin-left: 10px;
            /* animation-name: test; */
            /* animation-duration: 4s; */
            /* animation-timing-function: linear; */
            /* animation-iteration-count: 4; */
            /* animation-direction: alternate; */
            /* animation-fill-mode: backwards; */
            /* animation-delay: 2s; */
            animation: test 2s linear 1s 4 alternate;
        }
        /* 定义动画关键帧,关键帧的名字为test */
        @keyframes test{
            /* from表示动画的开始位置,也可以使用0%来表示。 */
            from{
                margin-left: 50px;
                background-color: orange;
            }
            /* to表示动画的结束位置,也可以使用100%来表示。 */
            to{
                margin-left: 600px;
                background-color: yellow;
            }
        }
        /* 控制动画的运行 */
        /* .box1:hover .box2{
            animation-play-state: paused;
        } */
    </style>
</head>
<body>
    <div>
        <div></div>
    </div>
</body>
</html>


点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)