跳到主要内容

前言

在平时开发过程中,由于都是自己捣鼓玩的项目,并没有 UI 设计给我的设计图,更没有什么特效要求,导致对 css 动画一直都不是很熟悉,但是作为即将进入实习单位的萌新程序员,要时刻准备着设计师要求的各种动画,于是有了这一篇文章。

容易混淆的几个 css 属性

css 属性很多,并且有些无论是字母的拼写还是字面上的意思,都容易混淆,比如我列出来的几个属性,是不是也混淆过你~

属性含义
animation(动画)用于设置动画属性,他是一个简写的属性,包含 6 个属性
transition(过渡)用于设置元素的样式过度,和 animation 有着类似的效果,但细节上有很大的不同
transform(变形)用于元素进行旋转、缩放、移动或倾斜,和设置样式的动画并没有什么关系,就相当于 color 一样用来设置元素的“外表”
translate(移动)translate 只是 transform 的一个属性值,即移动。

弄清楚这几个问题,我们就可以头脑清醒的状态下去学习 css 的动画

transition

什么叫过渡?字面意思上来讲,就是元素从这个属性(color)的某个值(red)过渡到这个属性(color)的另外一个值(green),这是一个状态的转变,需要一种条件来触发这种转变,比如我们平时用到的:hoever、:focus、:checked、媒体查询或者 JavaScript。

先从一个简单的 demo 来看看 transition 的效果

<!DOCTYPE html>
<html lang="en">
<head>
<title>transition</title>
<style>
#box {
height: 100px;
width: 100px;
background: green;
transition: transform 1s ease-in 1s;
}

#box:hover {
transform: rotate(180deg) scale(.5, .5);
}
</style>
</head>
<body>
<div id="box"></div>
</body>
</html>


效果:

image

我们来分析这一整个过程,首先 transition 给元素设置的过渡属性是 transform,当鼠标移入元素时,元素的 transform 发生变化,那么这个时候就触发了 transition,产生了动画,当鼠标移出时,transform 又发生变化,这个时候还是会触发 transition,产生动画,所以 transition 产生动画的条件是 transition 设置的 property 发生变化,这种动画的特点是需要“一个驱动力去触发”,有着以下几个不足:

  1. 需要事件触发,所以没法在网页加载时自动发生
  2. 是一次性的,不能重复发生,除非一再触发
  3. 只能定义开始状态和结束状态,不能定义中间状态,也就是说只有两个状态
  4. 一条 transition 规则,只能定义一个属性的变化,不能涉及多个属性。

语法:transition: property duration timing-function delay;

描述
transition-property规定设置过渡效果的 CSS 属性的名称
transition-duration规定完成过渡效果需要多少秒或毫秒
transition-timing-function规定速度效果的速度曲线
transition-delay定义过渡效果何时开始

animation

在官方的介绍上介绍这个属性是 transition 属性的扩展,弥补了 transition 的很多不足,我理解为 animation 是由多个 transition 的效果叠加,并且可操作性更强,能够做出复杂酷炫的效果(前提是你爱折腾),我们以一个例子来介绍 animation 的威力:

<!DOCTYPE html>
<html lang="en">

<head>
<title>animation</title>
<style>
.box {
height: 100px;
width: 100px;
border: 15px solid black;
animation: changebox 1s ease-in-out 1s infinite alternate running forwards;
}

.box:hover {
animation-play-state: paused;
}

@keyframes changebox {
10% {
background: red;
}
50% {
width: 80px;
}
70% {
border: 15px solid yellow;
}
100% {
width: 180px;
height: 180px;
}
}
</style>
</head>

<body>
<div class="box"></div>
</body>

</html>

image

分析:

我们先来看看 keyframes 这个关键点,它定义了一个动画组合叫 changebox,里面的 10%,50%,70%,100%代表在变化中不同时间点的属性值,比如这个动画的总时间是 1s,那么 10%就是在 0-0.1s 中的动画,通过这个我们可以较精确的控制动画变化中任何一个时间点的属性效果,这大大提高了我们对动画的把控,是做复杂动画的基础,我们再回来看 animation 中整整八个值,是不是有点夸张,还没见过这么长的值,通过控制 animation 的每个值,控制动画变得非常灵活,我们来具体了解它的语法以及各个值代表着什么:

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

描述
name用来调用@keyframes 定义好的动画,与@keyframes 定义的动画名称一致
duration指定元素播放动画所持续的时间
timing-function规定速度效果的速度曲线,是针对每一个小动画所在时间范围的变换速率
delay定义在浏览器开始执行动画之前等待的时间,值整个 animation 执行之前等待的时间
iteration-count定义动画的播放次数,可选具体次数或者无限(infinite)
direction设置动画播放方向:normal(按时间轴顺序),reverse(时间轴反方向运行),alternate(轮流,即来回往复进行),alternate-reverse(动画先反运行再正方向运行,并持续交替运行)
play-state控制元素动画的播放状态,通过此来控制动画的暂停和继续,两个值:running(继续),paused(暂停)
fill-mode控制动画结束后,元素的样式,有四个值:none(回到动画没开始时的状态),forwards(动画结束后动画停留在结束状态),backwords(动画回到第一帧的状态),both(根据 animation-direction 轮流应用 forwards 和 backwards 规则),注意与 iteration-count 不要冲突(动画执行无限次)

animation 与 transition 不同的是,keyframes 提供更多的控制,尤其是时间轴的控制,这点让 css animation 更加强大,使得 flash 的部分动画效果可以由 css 直接控制完成,而这一切,仅仅只需要几行代码,也因此诞生了大量基于 css 的动画库,用来取代 flash 的动画部分。在我的项目中一般用 Animate.css 来设置一些动画,期待在工作中能够用 animation 完美实现 UI 设计师给的设计图~

总结

写这篇文章的目的是提醒自己不要将这四个属性混淆,顺便详细讲解 CSS 制作动画的方法,简单一次性的动画中推荐使用 transition,比较逻辑清晰,可维护性较好。如果遇到比较复杂的动画,这个时候便可以拿出 animation 开始你的表演,其实不仅仅用 css 能实现动画,用 js 同样可以操控元素的样式实现动画,这个时候你脑海里是不是浮现出 setTimeout,setInterval 来控制样式实现动画,当然可以,但是相比新出的 requestAnimationFrame,它能够更高性能地执行动画,这里抛砖引玉,小伙伴们可以尝试去谷歌以下,后面我也会就这个新出的函数写一篇详细的指南。

信息

作者:Vince_ 链接:https://juejin.cn/post/6844903615920898056 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。