CSS学习(12)过渡与动画

143 阅读8分钟

前言

  • CSS3中transition和animation的属性分别有哪些
  • CSS动画如何实现

CSS3过渡

CSS3新增了过渡属性,可以从一个状态变化到另一个状态时,变化更加地平滑。

在W3C标准中是这样描述transition的,CSS3 的 transition 允许 CSS 的属性值在一定的时间区间内平滑的过渡。这种效果可以在鼠标单击,获得焦点,对元素任何改变中触发,并平滑地以动画效果改变 CSS 的属性值。

先看一个入门示例:

<div></div>
div {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: width 2s, height 2s, background-color 2s;
  -webkit-transition: width 2s, height 2s, background-color 2s;
}

div:hover {
  width: 200px;
  height: 200px;
  background-color: blue;
}

当鼠标悬停在div上时,div的宽度、高度和背景色会平滑过渡到新的值。

transition属性

transition属性是一个简写属性,用于设置四个过渡属性:

  • transition-property:指定过渡的属性名称,默认值为all,表示所有属性。
  • transition-duration:指定过渡的持续时间,默认值为0s,表示没有过渡效果。
  • transition-timing-function:指定过渡的时间函数,默认值为ease,表示过渡速度先慢后快再慢。
  • transition-delay:指定过渡的延迟时间,默认值为0s,表示立即开始过渡。

transition-property属性

transition-property属性用于指定过渡的属性名称,常用的值有:

  • all:所有属性
  • none:没有属性
  • 具体属性:如width、height、background-color等

需要特别说明的是,并不是所有的属性都可以进行过渡,只有属性是具有一个中点值的属性才能够进行过渡效果。因为这样才能通过不停的修改中间值从而实现过渡效果。例如 display:none|block 就没有中间值,所以无法应用过渡。

能够过渡的属性类型有颜色属性、具有长度值或百分比的属性、阴影、变形系列属性,具体支持过渡的属性可以参阅下表:

| 属性 | 描述 | | --- | --- | --- | | background | 背景颜色 | | background-position | 背景位置 | | border-color | 边框颜色 | | border-radius | 边框圆角 | | bottom | 底部位置 | | color | 文字颜色 | | left | 左侧位置 | | letter-spacing | 字母间距 | | line-height | 行高 | | margin | 外边距 | | opacity | 透明度 | | outline | 轮廓 | | padding | 内边距 | | right | 右侧位置 | | text-indent | 首行缩进 | | text-shadow | 文字阴影 | | top | 顶部位置 | | transform | 变形 | | vertical-align | 垂直对齐 | | visibility | 可见性 | | width | 宽度 | | word-spacing | 单词间距 | | z-index | z轴位置 |

transition-duration属性

transition-duration属性用于指定过渡的持续时间,常用的值有:

  • s:秒
  • ms:毫秒

transition-timing-function属性

transition-timing-function属性用于指定过渡的时间函数,常用的值有:

  • ease:默认值,过渡速度先慢后快再慢
  • linear:匀速过渡
  • ease-in:过渡速度先慢后快
  • ease-out:过渡速度先快后慢
  • ease-in-out:过渡速度先慢后快再慢
  • cubic-bezier(n,n,n,n):自定义过渡速度

transition-delay

过渡延迟多久后触发,单位是秒或者毫秒,但是值可以是正整数,负整数和0,正整数和0都比较容易理解,主要说下负整数,负整数的计算会从整体过渡时间中做减法运算。

过渡事件

过渡事件包括三个,分别是:

  • transitionstart:过渡开始时触发
  • transitionend:过渡结束时触发
  • transitionrun:过渡运行时触发

transitionrun 在 transition 创建的时候被触发。(或者说在某个 delay 开始的时候)

transitionstart 在动画实际开始的时候被触发。 (或者说在某个 delay 结束的时候)

<div id="app"></div>
#app{
  width: 150px;
  height: 150px;
  background-color: blueviolet;
  transition: all .3s;
}
const oDiv = document.querySelector("#app");

oDiv.onclick = ()=>{
  oDiv.style.width = "400px"
}

oDiv.addEventListener("transitionend",()=>{
  console.log("过渡结束")
})

CSS3动画

在CSS3中新增了一个animation属性,可以制作出类似flash一样的动画出来。

先看一个入门示例:

<div id="app"></div>
#app{
  width: 150px;
  height: 150px;
  background-color: blueviolet;
  animation: test 5s;
  position: absolute;
  top: 0;
  left: 0;
}

@keyframes test{
  0% {
    left: 0;
    top: 0;
  }
  25% {
    left: 400px;
    top: 0;
  }
  40% {
    left: 400px;
    top: 200px;
  }
  65% {
    left: 0;
    top: 200px;
  }
  100% {
    left: 0;
    top: 0;
  }
}

在上面的代码示例中,我们声明了一个名为 test 的动画,然后在 div 中运用了这个动画,整个动画的播放时间为 5s。

接下来我们来看一下CSS3中动画的具体细节。

使用 CSS3 的 animation 制作动画包含两个部分:首先是用关键帧声明一个动画,其次是在 animation 调用关键帧声明的动画。

声明动画

使用 @keyframes 关键字来声明一个动画,@keyframes 是一个关键帧动画,它由多个关键帧组成,每个关键帧都定义了动画在某个时间点的样式。

语法:

@keyframes animationname {keyframes-selector {css-styles;}}

说明
animationname必需的。定义animation的名称。
keyframes-selector必需的。动画持续时间的百分比。合法值:0-100% from (和0%相同) to (和100%相同)注意:  您可以用一个动画keyframes-selectors。
css-styles必需的。一个或多个合法的CSS样式属性
@keyframes test{
  0% {
    left: 0;
    top: 0;
  }
  25% {
    left: 400px;
    top: 0;
  }
  40% {
    left: 400px;
    top: 200px;
  }
  65% {
    left: 0;
    top: 200px;
  }
  100% {
    left: 0;
    top: 0;
  }
}

在上面的代码中,我们定义了一个名为 test 的动画,这个动画在 0%、25%、40%、65%、100% 的时候分别定义了 div 的位置,从而实现了一个来回移动的动画效果。

调用动画

使用 @keyframes 声明动画后,需要使用 animation 属性来调用关键帧声明的动画。

语法:

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

前四个属性,我想大家应该很熟悉了,这四个属性同时也是transition的四个属性

说明
animation-name必需的。定义animation的名称。
animation-duration必需的。定义animation的时长。
animation-timing-function可选的。定义animation的速度曲线。
animation-delay可选的。定义animation何时开始。
animation-iteration-count可选的。定义animation的播放次数。
animation-direction可选的。定义animation是否在每次循环时轮流反向播放。
animation-fill-mode可选的。定义animation在动画执行前后(动画不播放时)如何应用样式。
animation-play-state可选的。定义animation是否正在运行或暂停。

animation-iteration-count

animation-iteration-count 属性定义动画播放的次数。

语法:

animation-iteration-count: infinite | number;

说明
infinite动画无限次播放。
number动画播放的次数。
div {
  animation: test 5s infinite;
}

在上面的代码中,我们定义了一个名为 test 的动画,这个动画在 5 秒内无限次播放。

animation-direction

animation-direction 属性定义动画是否在每次循环时轮流反向播放。

语法:

animation-direction: normal | reverse | alternate | alternate-reverse;

说明
normal正常方向播放。
reverse反方向播放。
alternate在奇数次动画时正常播放,在偶数次动画时反方向播放。
alternate-reverse在奇数次动画时反方向播放,在偶数次动画时正常播放。
div {
  animation: test 5s infinite alternate;
}

在上面的代码中,我们定义了一个名为 test 的动画,这个动画在 5 秒内无限次播放,并且在每次循环时轮流反向播放。

animation-fill-mode

animation-fill-mode 属性定义动画在执行前后如何应用样式。一般用于设置动画播放完毕后的状态

语法:

animation-fill-mode: none | forwards | backwards | both;

说明
none动画不应用任何样式。
forwards动画结束后,元素将保持动画最后一帧的样式。(最常用)
backwards动画将应用在 animation-delay 定义期间启动动画的第一次迭代的关键帧中定义的属性值。这些都是 from 关键帧中的值(当 animation-direction 为 "normal" 或 "alternate" 时)或 to 关键帧中的值(当 animation-direction 为 "reverse" 或 "alternate-reverse" 时)。
both动画遵循 forwards 和 backwards 的规则。也就是说,动画会在两个方向上扩展动画属性。

animation-play-state

animation-play-state 属性定义动画是否正在运行或暂停。 语法:

animation-play-state: running | paused;

说明
running动画正在运行。
paused动画已暂停。

该属性一般会配合JS一起使用,从而达到对动画播放状态的一个控制。

动画事件

  • animationstart:在 CSS 动画开始时触发
  • animationend:在 CSS 动画结束时触发
  • animationiteration:在 CSS 动画重复播放时触发

总结

  • CSS3中transition和animation的属性分别有哪些

transition过渡动画:

  • transition-property:指定过渡的CSS属性
  • transition-duration:指定过渡所需的完成时间
  • transition-timing-function:指定过渡函数
  • transition-delay:指定过渡的延迟时间

animation 关键帧动画:

  • animation-name:指定要绑定到选择器的关键帧的名称
  • animation-duration:动画指定需要多少秒或毫秒完成
  • animation-timing-function:设置动画将如何完成一个周期
  • animation-delay:设置动画在启动前的延迟间隔
  • animation-iteration-count:定义动画的播放次数
  • animation-direction:指定是否应该轮流反向播放动画
  • animation-fill-mode:规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式
  • animation-play-state:指定动画是否正在运行或已暂停
  • CSS动画如何实现

使用@keyframes规则,定义动画序列,然后使用animation属性将动画应用于元素。