Css 简明教程

CSS - Animations

CSS animations 允许在不同的样式之间创建平滑的过渡,而无需使用 JavaScript。例如,

What is CSS Animation?

在 CSS 中,我们可以基于时间阶段、用户交互或被称为 CSS 动画的状态更改来动态更改元素的样式。这是通过使用 @keyframes 规则创建动画以及使用 animation 属性将其应用到元素中来实现的。

Table of Contents

The @keyframes Rule

@keyframes 规则用于为动画定义关键帧,指定动画元素在动画的各个阶段的外观。考虑以下定义关键帧规则的代码。

.box{
    animation: colorChange 5s infinite;
}

@keyframes colorChange {
    0% {
        background-color: red;
    }
    50% {
        background-color: green;
    }
    100% {
        background-color: blue;
    }
}

此代码将定义 class 为 .box 的元素的动画,动画的名称为 colorChange,持续时间为 5 秒,且次数为无限。

关键帧规则定义为名为 colorChange 的动画。

  1. 在动画的总时长的 0% 处(即,0 秒),背景颜色将为红色。

  2. 在总时长的 50% 处(即,2.5 秒),背景颜色变为绿色。

  3. 在动画的总时长的 100% 处(即,5 秒),颜色变为蓝色。

Animation Delay Property

我们可以使用 * animation-delay* 属性设置动画开始的延迟时间。查看以下示例

你还可以对 animation-delay 属性设置负值。如果你使用负值 -n,则动画将会启动,就好像它已经播放了 n 秒。

Example

在此示例中,小球将在 2 秒后开始向左移动。

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .ball {
            width: 50px;
            height: 50px;
            background-color: #3498db;
            border-radius: 50%;
            position: absolute;
            left: 0;

            animation-name: moveRight;
            /* Set duration */
            animation-duration: 2s;
            /* Set delay for animation */
            animation-delay: 2s;
        }

        @keyframes moveRight {
            to {
                left: calc(100% - 50px);
            }
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="ball"></div>
    </div>
</body>
</html>

Set Animation Iteration Count

我们可以使用 * animation-iteration-count* 属性设置动画重复自己的次数。

CSS 规范不支持此属性的负值。它可以将值设为正整数(例如,1、2、3 等)或关键词“infinite”。

Example

在此示例中,我们把球循环计数设置为无限循环。

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .ball {
            width: 50px;
            height: 50px;
            background-color: #3498db;
            border-radius: 50%;
            position: absolute;
            left: 0;

            animation-name: moveRight;
            /* Set duration */
            animation-duration: 2s;
            /* Set number of time animation repeats */
            animation-iteration-count: infinite;
        }

        @keyframes moveRight {
            to {
                left: calc(100% - 50px);
            }
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="ball"></div>
    </div>
</body>
</html>

Animation Direction Property

我们可以使用 * animation-direction 属性来指定动画运行的方向。 *

动画方向属性的有效值如下

  1. normal: 动画正常播放(向前)。这是默认设置。

  2. reverse: 动画以倒放方向播放(向后)。

  3. alternate: 动画先向前播放,然后倒放。

  4. alternate-reverse: 动画先倒放,然后向前播放。

Example

在此示例中,我们使用行内 CSS 来设置动画方向属性。

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .ball {
            width: 50px;
            height: 50px;
            background-color: #3498db;
            border-radius: 50%;
            position: relative;
            left:0;

            animation-name: moveRight ;
            animation-duration: 2s;
            animation-iteration-count: infinite;
        }
        @keyframes moveRight {
            to {
                left: calc(100% - 50px);
            }
        }
    </style>
</head>

<body>
    <h2>animation-direction: normal</h2>
    <div class="ball"
         style="animation-direction: normal; ">
    </div>

    <h2>animation-direction: reverse</h2>
    <div class="ball"
         style="animation-direction: reverse;">
    </div>

    <h2>animation-direction: alternate</h2>
    <div class="ball"
         style="animation-direction: alternate;">
    </div>

    <h2>animation-direction: alternate-reverse</h2>
    <div class="ball"
         style="animation-direction: alternate-reverse;">
    </div>
</body>
</html>

Animation Timing Function

在 CSS 中, * animation-timing-function* 属性用于定义动画的速度曲线。它可以采用以下值。

  1. ease: 动画从慢开始,然后快,最后慢结束(默认值)。

  2. linear: 动画从开始到结束以相同的速度播放。

  3. ease-in: 动画从慢开始。

  4. ease-out: 动画从慢结束。

  5. ease-in-out: 动画从慢开始和结束。

  6. cubic-bezier(n,n,n,n): 这样我们可以定义自己的速度值。要了解更多信息,请查看 * Cubic Bezier Function* 文章。

Example

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .ball {
            width: 50px;
            height: 50px;
            background-color: #3498db;
            border-radius: 50%;
            position: relative;
            left:0;

            animation-name: moveRight ;
            animation-duration: 2s;
            animation-iteration-count: infinite;
        }
        @keyframes moveRight {
            to {
                left: calc(100% - 50px);
            }
        }
    </style>
</head>

<body>
    <h2>linear</h2>
    <div class="ball"
         style="animation-timing-function: linear;">
    </div>

    <h2>ease</h2>
    <div class="ball"
         style="animation-timing-function: ease;">
    </div>

    <h2>ease-in</h2>
    <div class="ball"
         style="animation-timing-function: ease-in;">
    </div>

    <h2>ease-out</h2>
    <div class="ball"
         style="animation-timing-function: ease-out;">
    </div>

    <h2>ease-in-out</h2>
    <div class="ball"
         style="animation-timing-function: ease-in-out;">
    </div>

    <h2>cubic-bezier(0.25, 0.1, 0.25, 1)</h2>
    <div class="ball"
         style="animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);">
    </div>
</body>
</html>

Set Animation Fill Modes

  • animation-fill-mode* 属性指定动画未播放(在开始之前、结束之后或两者)时目标元素的样式。

animation-fill-mode 属性可以有以下值:

  1. none: 动画在开始之前或之后不会应用任何样式。这是默认设置。

  2. forwards: 在动画结束时,元素将保持最后一个关键帧规则设置的样式。

  3. backwards: 在动画结束时,元素将保持第一个关键帧规则设置的样式。

  4. both: 动画将遵循前进和后退这两个规则。

查看以下代码的输出,以加深理解:

Example

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .box {
            padding: 10px;
            background-color: green;
            color: white;
            font-size: 16px;
            margin: 20px;
            animation-duration: 2s;
            animation-name: changeColor;
        }

        /* Animation Definition */
        @keyframes changeColor {
            0% {
                background-color: blue;
            }
            100% {
                background-color: red ;
            }
        }

        /* Animation Fill Modes */
        .none {
            animation-fill-mode: none;
        }

        .forwards {
            animation-fill-mode: forwards;
        }

        .backwards {
            animation-fill-mode: backwards;
            animation-delay: 2s;
        }

        .both {
            animation-fill-mode: both;
            animation-delay: 2s;
        }
    </style>
</head>

<body>
    <div class="box none">None</div>
    <div class="box forwards">Forwards</div>
    <div class="box backwards">Backwards</div>
    <div class="box both">Both</div>
</body>
</html>

Animation Shorthand Property

在 CSS 中, animation 属性是以下属性的简写

  1. * animation-name:* 设置动画的名称。

  2. * animation-duration:* 设置动画的持续时间。

  3. * animation-timing-function:* 定义动画的速度曲线。

  4. * animation-delay:* 设置动画开始之前的延迟。

  5. * animation-iteration-count:* 设置动画重复的次数。

  6. * animation-direction:* 定义动画执行的方向。

  7. * animation-fill-mode:* 描述运行前和运行后的样式。

  8. * animation-play-state:* 描述动画的播放/暂停性质。

Example

<html lang="en">
<head>
    <style>
    .box {
        padding: 20px;
        background-color: #3498db;
        color: white;
        font-size: 16px;
        /* Name, duration, timing function, delay, repeat, direction, fill mode */
        animation: changeColor 2s ease-in-out 1s infinite alternate both;
    }

    /* Animation Definition */
    @keyframes changeColor {
        0% {
            background-color: #3498db;
        }
        100% {
            background-color: #e74c3c;
        }
    }

    </style>
</head>

<body>
    <div class="box">Animate Me!</div>
</body>
</html>

List of CSS Animation Properties

以下是 animation 属性的子属性:

Property

Description

Example

animation-composition

在许多动画同时对同一个属性产生效果的情况下,指示要应用的组合操作。

Try It

animation-delay

指示动画应在动画的开头还是某个中间位置开始,以及元素加载到动画序列开始之间应经过的时间量。

Try It

animation-direction

指示动画的初始迭代应为前向还是后向,以及此后的迭代应继续相同方向还是每次执行序列时都更改方向。

Try It

animation-duration

指示动画完成一个循环需要多长时间。

Try It

animation-fill-mode

描述动画将其应用于其目标的运行前和运行后样式。

Try It

animation-iteration-count

指示动画应重复多少次。

Try It

animation-name

它给出了描述动画关键帧的 @keyframes at-rule 的名称。

Try It

animation-play-state

指示动画序列应该播放还是暂停。

Try It

animation-timing-function

描述用于指定动画中关键帧过渡的加速曲线。

Try It