CSS 动画

173 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

  • 补间动画:自动完成从其实到终止状态的过渡。不用管中间状态。
  • 帧动画:通过一帧一帧的画面按照固定顺序和速度播放。

一、过渡:transition

CSS3的新特性,可以实现元素不同状态间的平滑过渡(补间动画),经常用来制作动画效果。

transition属性:

  • transtion-property:all; 如果希望所有的属性都发生过渡,就使用all。
  • transition-duration:1s;过渡的持续时间。
  • transition-timing-function:linear;运动曲线。属性值可以是:
    • linear 线性
    • ease 减速
    • ease-in 加速
    • ease-out 减速
    • ease-in-put 先加速后减速
    • cubic-bezier 自定义速度模式,可以使用工具网站定制
  • transtion-delay:1s; 过渡延迟。多长时间后再执行这个过渡动画。

上面四个属性可以写成综合属性:

transition: 让哪些属性过渡 过渡的持续时间 运动曲线 延迟时间;transition: all 3s linear 0s;

1、目前,各大浏览器都支持无前缀的transition。

2、不是所有CSS属性都支持transition,完整的列表。

3、transition需要明确知道,开始状态和结束状态的具体数值,才能计算出中间状态。比如,height从0px变化到100px,transition可以算出中间状态。但是,transition没法算出0px到auto的中间状态,也就是说,如果开始或结束的设置是height: auto,那么就不会产生动画效果。类似的情况还有,display: none到block,background: url(foo.jpg)到url(bar.jpg)等等。

局限:

1、需要时间触发,所以没法在网页加载时自动发生;

2、一次性的,不能重复发生,除非再次触发;

3、只能定义开始状态和结束状态,不能定义中间状态;

4、一条规则只能定义一个属性的变化,不能涉及多个属性。

二、转换transform

CSS3的新特性,可以实现元素的位移、旋转、变形、缩放,甚至支持矩阵方式。转换再配合过渡和动画,可以取代早期只能靠Flash才可以实现的效果。

通过transform转换实现2D或者3D的转换

2D转换包括:缩放、移动、旋转

1、缩放scale

格式:transform:scale(x, y) x表示水平方向的缩放倍数;y表示垂直方向的缩放倍数。如果只写一个值就是等比例缩放。

取值:>1表示放大,<1表示缩小。不能为百分比。

2、位移:translate

格式:transform:translate(水平位移,垂直位移)

参数:参数为百分比,相对于自身移动。

正值:向右或向下。负值:向左或向下。如果只写一个值,则表示水平移动

3、旋转:rotate

格式:transform:rotate(角度);

参数:正值 顺时针;负值 逆时针。

3D转换

1、旋转:rotateX、rotateY、rotateZ

格式:transform:rotateX(360deg)

transform:rotateY(360deg)

transform:rotateZ(360deg)

2、移动:translateX、translateY、translateZ

格式:transform:translateX(100px);

transform:translateY(100px);

transform:translateZ(100px);

3、透视:perspective

电脑显示屏是一个2D平面,通过透视实现图像具有立体感的3D效果。

格式:作为一个属性,设置给父元素,作用于所有3D转换的子元素。

作为transform属性的一个值,作用于元素自身。

4、3D呈现:transform-style

3D元素构建是指某个图形是由多个元素构成的,可以给这些元素的父元素设置transform-style: preserve-3d来使其变成一个真正的3D图形。属性值可以如下:

transform-style: preserve-3d;     //让 子盒子 位于三维空间里

transform-style: flat;            //让子盒子位于此元素所在的平面内(子盒子被扁平化)

三、动画animation

CSS3的新特性,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。

1、定义动画的步骤

(1)通过@keyframes定义动画;

(2)将这段动画通过百分比,分割成多个节点;然后各节点中分别定义各属性;

(3)在指定元素里,通过animation属性调用动画。

定义动画:
@keyframes 动画名{
  form{
  	初始状态
  }
  to{
    结束状态
  }
}
调用:
animation:动画名称 持续时间;

animation属性的格式:

animation:定义的动画名称 持续时间 执行次数 是否反向 运动曲线 延迟执行。

2、动画属性

animation是综合属性

(1)动画名称:animation-name: move;必选项,且顺序固定

(2)执行一次动画的持续时间:animation-duration: 4s;必选项,且顺序固定

(3)动画的执行次数:animation-iteration-count: 1; 属性值为infinite表示无数次

(4)动画的方向:animation-direction: altername; 属性值:normal正常,alternate反向

(5)动画延迟执行:animation-delay: 1s;

(6)设置动画结束时,盒子的状态:animation-fill-mode: forwards; 属性值:forwards:保持动画结束后的状态(默认), backwards:动画结束后回到最初的状态。

(7)运动曲线:animation-timing-function: ease-in; 属性值:linear ease-in-out steps()等

属性值如果写成steps(),则表示动画不是连续执行,而是间断的分几步执行。我们就可以作出很多不连续地动画效果。比如时钟;再比如,通过多张静态的鱼,作出一张游动的鱼。