CSS-动画(transition、animation、steps、transform)

2,738 阅读7分钟

1.transition(过渡)

在CSS 3引入Transition(过渡)这个概念之前,CSS是没有时间轴的。也就是说,所有的状态变化,都是即时完成。

CSS transitions 可以决定哪些属性发生动画效果 (明确地列出这些属性),何时开始 (设置 delay),持续多久 (设置 duration) 以及如何动画 (定义timing function,比如匀速地或先快后慢)。可动画属性列表 是一个有限集合。

1.1语法

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

transition-timing-function:


前五个值其实都是 cubic-bezier(n,n,n,n) 的特例。它们被称为贝塞尔曲线

1.2transition的使用注意

  • 目前,各大浏览器(包括IE 10)都已经支持无前缀的transition,所以transition已经可以很安全地不加浏览器前缀。
  • 不是所有的CSS属性都支持transition,完整的列表查看这里
  • transition需要明确知道,开始状态和结束状态的具体数值,才能计算出中间状态。比如,height从0px变化到100px,transition可以算出中间状态。但是,transition没法算出0px到auto的中间状态,也就是说,如果开始或结束的设置是height: auto,那么就不会产生动画效果。类似的情况还有,display: none到block,background: url(foo.jpg)到url(bar.jpg)等等。

1.3transition的局限

transition的优点在于简单易用,但是它有几个很大的局限。

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

1.4检查过渡是否完成

当过渡完成时触发一个事件,在符合标准的浏览器下,这个事件是 transitionend, 在 WebKit 下是 webkitTransitionEnd. 详情查看页面底部的兼容性表格。 transitionend 事件提供两个属性:

propertyName
字符串,指示已完成过渡的属性。
elapsedTime
浮点数,指示当触发这个事件时过渡已运行的时间(秒)。这个值不受 transition-delay 影响。

照例可以用 element.addEventListener() 方法来监听这个事件:

el.addEventListener("transitionend", updateTransition, true);

2.animation(动画)

animations 使得可以将从一个CSS样式配置转换到另一个CSS样式配置。动画包括两个部分:描述动画的样式规则和用于指定动画开始、结束以及中间点样式的关键帧(@keyframes)。

2.1语法

(8个属性的简写)

animation: <name> <duration> <timing-function> <delay> <iteration-count> 
           <direction> <play-state> <fill-mode>;
描述
name 用来调用@keyframes定义好的动画,与@keyframes定义的动画名称一致
duration 指定元素播放动画所持续的时间,默认值为0s,表示无动画
timing-function

定义CSS动画在每一动画周期中执行的节奏。可能值为一或多个 <timing-function>

对于关键帧动画来说,timing function作用于一个关键帧周期而非整个动画周期,即从关键帧开始开始,到关键帧结束结束。

delay 定义在浏览器开始执行动画之前等待的时间,值整个animation执行之前等待的时间,默认为0;可以是负数,表明动画已经开始多久
iteration-count 定义动画的播放次数
infinite:无限循环播放动画.
<number>:动画播放的次数;默认值为1。可以用小数定义循环,来播放动画周期的一部分:例如,0.5 将播放到动画周期的一半。不可为负值。0为动画不发生
direction 设置动画播放方向:(见下图)
normal(按时间轴顺序)
reverse(时间轴反方向运行)
alternate(轮流,即来回往复进行)
alternate-reverse(动画先反运行再正方向运行,并持续交替运行)
play-state
定义一个动画是否运行或者暂停。可以通过查询它来确定动画是否正在运行。另外,它的值可以被设置为暂停和恢复的动画的重放。恢复一个已暂停的动画,将从它开始暂停的时候,而不是从动画序列的起点开始在动画。
running:当前动画正在运行。
paused:当前动画以被停止。
fill-mode 设置CSS动画在执行之前和之后如何将样式应用于其目标。

none:默认值,回到动画没开始时的状态。forwards表示让动画停留在结束状态。backwards:让动画回到第一帧的状态,并在animation-delay期间保留此值。 第一个关键帧取决于animation-direction的值both: 根据animation-direction轮流应用forwards和backwards规则


2.2使用keyframes定义动画序列

@keyframes建立两个或两个以上关键帧来实现。每一个关键帧都描述了动画元素在给定的时间点上应该如何渲染。

例如:

@keyframes rainbow {
  0% { background: #c00 }
  50% { background: orange }
  100% { background: yellowgreen }
}
相当于
@keyframes rainbow {
  from { background: #c00 }
  50% { background: orange }
  to { background: yellowgreen }
}

2.3animation的优点

相较于传统的脚本实现动画技术,使用CSS动画有三个主要优点:

  1. 能够非常容易地创建简单动画,你甚至不需要了解JavaScript就能创建动画。
  2. 动画运行效果良好,甚至在低性能的系统上。渲染引擎会使用跳帧或者其他技术以保证动画表现尽可能的流畅。而使用JavaScript实现的动画通常表现不佳(除非经过很好的设计)。
  3. 让浏览器控制动画序列,允许浏览器优化性能和效果,如降低位于隐藏选项卡中的动画更新频率。

3.timing-function

两种实现方式:steps()和cubic-bezier()

只不过steps()更像是楼梯坡道,cubic-bezier()更像是无障碍坡道


然后steps()简化出了step-startstep-end这两个关键字;

cubic-bezier()则有lineareaseease-inease-out以及ease-in-out

3.1 steps

steps(number, position)
number:数值。这个很好理解,表示把我们的动画分成了多少段。position:关键字。表示动画是从时间段的开头连续还是末尾连续。支持start和end两个关键字,含义分别如下:start:表示直接开始。end:表示戛然而止。是默认值。



一切都是反的!start不是开始,而是结束;end不是结束,而是开始

step-start等同于steps(1, start)step-end等同于steps(1, end)或者steps(1)

4.transform属性

应用于元素的2D或3D转换,允许将元素旋转、缩放、移动和倾斜

  1. 旋转

    transform:rotate(x deg)
    x属于(-360deg,360deg)

  2. 缩放

    transform:scale(x,y)
    transform:scaleX(x) = transform:scale(x,1)
    transform:scaleY(y) = transform:scale(1,y)
    缩放中心点为元素中心点
    x,y>1放大
    x,y<1缩小
    

  3. 移动

    transform:translate(x,y)
    transform:translateX(x)
    transform:translateY(y)
    x,y像素或者%

  4. 倾斜

    transform:skew(x,y)
    transform:skewX
    transform:skewY
    x属于(-360deg,360deg)
    

参考:

阮一峰:www.ruanyifeng.com/blog/2014/0…

MDN:developer.mozilla.org/zh-CN/docs/…

掘金:juejin.cn/post/684490…

张鑫旭:www.zhangxinxu.com/wordpress/2…