帧动画

@Animation
.使用关键字 @keyframes 定义诺干个关键帧来表示元素的状态
.更多高级动画,请访问 MDN - animationAnimate使用animate.cssanimejsAnimate官方动画库scrollrevealjsfontawesome
animation vs transition
animation transition
多个元素共享 当前元素
多个状态 两个状态
常规、步进、时间轴 常规、步进
关键字、百分比 属性
定义动画 Definition
.初始状态:元素应用动画前的状态
.start state/开始状态/第一个关键帧状态:如果不指定0%或from,则元素初始状态就是开始状态/第一个关键帧状态
.end state/结束状态/最后一个关键帧状态:如果不指定100%或to,则元素初始状态就是结束状态/最后一个关键帧状态
.动画结束后,默认回到初始状态
利用关键字 from 和 to;通常省略 from,表示从初始状态开始;关键字只能定义2个状态
@keyframes ani_name {
    from {
      /* 开始状态/第一个关键帧 */
    }

    to {
      /* 结束状态/最后一个关键帧 */
    }
}
利用百分比:可以定义多个百分比节点/状态,动画效果更为灵活细腻
@keyframes ani_name {
    0% {  
      /* 开始状态/第一个关键帧 */    
    }

    50% {    
      /* 中间状态/中间关键帧 */  
    }

    100% {  
      /* 结束状态/最后一个关键帧 */    
    }
}
使用动画 Usage

.可以使用复合属性语法;也可以使用单独属性语法

复合属性语法
animation: name duration timing-function delay iteration-count direction fill-mode;
单独属性语法
animation-name:
animation-duration:
animation-timing-function:
animation-delay:
animation-iteration-count:
animation-direction:
animation-fill-mode:
动画属性
动画属性
类别 说明
name 动画名称
duration 动画持续时间 - length of time that an animation takes to complete one cycle
单位秒 s 或毫秒 ms
必须是正值或0 - must be positive or zero
必须指定单位 - unit is required
timing-function 动画方式;见下表
delay 动画延迟时间,必须是第2个时间参数
正值 positive value:推迟
负值 negative value:提前
iteration-count 动画播放次数
数值:默认1
infinite:无穷;重复播放
direction 动画方向
alternate:
reverse:反向播放
alternate-reverse:先反向播放,再正向播放
fill-mode 动画开始和结束时如何应用状态/样式 - applies styles to its target before and after its execution
none:不指定任何样式;从元素初始状态开始,结束后返回初始状态;默认值
backwards:动画开始时,从第一个关键帧开始;如果有延迟,将始终保持在当前状态
forwards:动画结束时,保持在最后一个关键帧 - retain the computed values set by the last keyframe;特别适合多个有延迟的动画
both:从第一个关键帧开始,结束时保持在最后一个关键帧;不会返回初始状态
animation-play-state 动画状态 - whether an animation is running or paused
paused:暂停状态 - currently paused
running:播放状态 - currently playing
可以通过 :hover 或 JavaScript 来控制动画的播放状态
animation-timeline 动画时间线
动画方式 animation-timing-function
类别 说明
ease 默认。动画以低速开始,然后加快,在结束前变慢
linear 动画从头到尾的速度是相同的
ease-in 动画以低速开始
ease-out 动画以低速结束
ease-in-out 动画以低速开始和结束
cubic-bezier(n,n,n,n) 使用 cubic-bezier 函数定义过程
steps() 步进动画方式;见后续内容
[] 动画分析
鼠标悬停时,动画从红色#f40开始,变换到绿色#0a0;动画结束后,返回白色#fff
.tmp {
    width: 100px;
    height: 100px;
    background-color: #fff;/* 初始状态 */
}

.tmp:hover {
    animation: --color 1s;
}

@keyframes --color {
    from {
        background-color: #f40;/* 开始状态 */
    }


    to {
        background-color: #0a0;/* 结束状态 */
    }
}
鼠标悬停时,动画从红色#f40开始,变换到绿色#0a0;动画结束后,保持在绿色#0a0
.tmp {
    width: 100px;
    height: 100px;
    background-color: #fff;/* 初始状态 */
}

.tmp:hover {
    animation: --color 1s forwards;/* forwards*/
}

@keyframes --color {
    from {
        background-color: #f40;/* 开始状态 */
    }


    to {
        background-color: #0a0;/* 结束状态 */
    }
}
未指定开始状态;鼠标悬停时,动画从白色#fff开始,变换到绿色#0a0;动画结束后,返回白色#fff
.tmp {
    width: 100px;
    height: 100px;
    background-color: #fff;/* 初始状态;也是开始状态 */
}

.tmp:hover {
    animation: --color 1s;
}

@keyframes --color {

    to {
        background-color: #0a0;/* 结束状态 */
    }
}
鼠标悬停时,动画从红色#f40开始,变换到白色#fff;动画结束后,返回白色#fff;不建议使用,应该显式的指定结束状态
.tmp {
    width: 100px;
    height: 100px;
    background-color: #fff;/* 初始状态;也是结束状态 */
}

.tmp:hover {
    animation: --color 1s;
}

@keyframes --color {

    from {
        background-color: #f40;/* 开始状态 */
    }
}
鼠标悬停时,动画从红色#f40开始,变换到绿色#0a0;动画结束后,返回白色#fff;不使用 backwards,不指定 from,相当于第3种情况
.tmp {
    width: 100px;
    height: 100px;
    background-color: #fff;/* 初始状态 */
}
  
.tmp:hover {
    animation: --color 1s backwards;
}

@keyframes --color {
    from {
        background-color: #f40;
    }


    to {
        background-color: #0a0;
    }
}
其他说明
.多个动画使用逗号,分隔,可以分别指定某个动画的属性
.先播放第一个动画 roll,接着播放第二个动画 zoom,然后一直循环播放第二个动画
animation: 
    roll 2s ease,
    zoom 2s 2s ease infinite alternate;
.先播放第一个动画 roll,接着播放第二个动画 zoom,最后一直循环播放第一个动画
animation: 
    roll 2s ease infinite alternate,
    zoom 2s 2s ease;
案例 Cases
步进动画 steps()
时间轴动画 animation-timeline
动画事件 Events
总结与作业 Summary & Homework
总结
帧动画的静态使用
帧动画的 JavaScript 使用
作业
独立完成上述案例
合理设计帧动画,完善个人网站