沐游虞笔记
  • 前端面试题

    • HTML面试题汇总(无答案)
    • HTML面试题汇总
    • CSS 面试题汇总(无答案)
    • CSS 面试题汇总
    • javascript 面试题汇总(无答案)
    • javascript 面试题汇总
    • promise 面试题(无答案)
    • promise 面试题
    • 浏览器面试题汇总(无答案)
    • 浏览器面试题汇总
    • 网络面试题汇总(无答案)
    • 网络面试题汇总
    • 工程化面试题汇总(无答案)
    • 工程化面试题汇总
    • VUE面试题汇总(无答案)
    • VUE面试题汇总
  • 直播课文件

    • 静态页面学习指导
    • 属性的计算过程
    • 层叠继承规则总结
    • BFC
    • JS基础知识回顾
    • DOM 事件的传播机制
    • DOM 事件的注册和移除
    • 阻止事件默认行为
    • 基础领航考试题
    • 基础领航考试题(答案)
    • 2024前端发展
    • JS核心概念学习指导
    • 第三方库与工程化学习指导
    • Vue入门学习指导
    • vue进阶学习指导
    • 前端性能优化
  • 笔面试环节知识讲解

    • 目录
    • 图像处理
    • 图像处理(面试)
    • Webpack构建优化
    • Webpack构建优化(面试)
    • TTS性能优化
    • TTS性能优化(面试)
    • 实时协作
    • 实时协作(面试)
    • 网页复制图片到剪贴板
    • 网页复制图片到剪贴板(面试)
    • vite插件
    • vite插件(面试)
    • 表单数据同步与保持
    • 表单数据同步与保持(面试)
    • 优化虚拟列表
    • 优化虚拟列表(面试)
    • 微前端解决巨石应用
    • 微前端解决巨石应用(面试)
    • DNS解析与优化
    • DNS解析与优化(面试)
    • 前端监控
    • 前端监控(面试)
    • 12.跨标签页通信
    • 12.跨标签页通信(面试)
    • 13.Vite相关优化
    • 13.Vite相关优化(面试)
    • 14.计时器节流问题
    • 14.计时器节流问题(面试)
    • 15.多文件预览支持
    • 15.多文件预览支持(面试)
    • 16.defer优化白屏时间
    • 16.defer优化白屏时间(面试)
  • Vue3整体变化
  • Vue2响应式回顾
  • Vue3响应式变化
  • nextTick实现原理
  • 两道代码题
  • Vue运行机制
  • 渲染器核心功能
  • 事件绑定与更新
  • computed面试题
  • watch面试题
  • 图解双端diff
  • 图解快速dff
  • 最长递增子序列
  • 模板编译器
  • 模板编译提升
  • 组件name作用
  • 路由传参方式
  • 基础篇

    • 序章React介绍
    • JSX基础语法
    • React基本介绍
    • 表单
    • 生命周期
    • 组件与事件绑定
    • 组件状态与数据传递
    • Hooks
    • React--redux介绍
    • React-router介绍
  • 就业篇

    • 属性默认值和类型验证
    • 高阶组件
    • Ref
    • Context
    • Render Props
    • Portals
    • 错误边界
    • 组件渲染性能优化
    • 前端框架的理解
    • Reacti和Vue描述页面的区别
    • 前端框架的分类
    • 虚拟DoM
    • React整体架构
    • React渲染流程
    • Fiber双缓冲
    • MessageChannel
    • Scheduleri调度普通任务
    • Scheduleri调度延时任务
    • 最小堆
    • React中的位运算
    • beginWork工作流程
    • completeWork工作流程
    • 图解diff算法
    • commit工作流程
    • lane模型
    • React中的事件
    • Hooks原理
    • useStateuseReducer.
    • effect相关hook
    • useCallbackuseMemo
    • useRef
    • Update
    • 性能优化策略之eagerState
    • 性能优化策略之bailout
    • bailoutContextAPl
    • 性能优化对日常开发启示
  • 前端监控概述
  • 错误监控
  • 数据上报
  • 页面性能监控
  • 用户行为收集与埋点
  • CSS3手册
  • HTML5手册
  • JavaScript语言提升

    • es补充
    • 事件循环
    • promise基础
    • Promise的链式调用
    • Promise的静态方法
    • async和await
    • Promise相关面试题
  • 网络

    • 客户端与服务器
    • 关于 Apifox 的使用
  • git文档
  • 工程化

    • CommonJS
    • ES module
    • npm文档(包管理)
    • Lass笔记
    • webpack工具
  • canvas详解
  • uinapp笔记
  • 自动化测试
  • oauth2令牌

    • 认识Oauth2
    • 三方应用实现github授权
    • 微信三方应用登录实现
    • 支付宝沙箱支付功能
  • 前端面试题

    • HTML面试题汇总(无答案)
    • HTML面试题汇总
    • CSS 面试题汇总(无答案)
    • CSS 面试题汇总
    • javascript 面试题汇总(无答案)
    • javascript 面试题汇总
    • promise 面试题(无答案)
    • promise 面试题
    • 浏览器面试题汇总(无答案)
    • 浏览器面试题汇总
    • 网络面试题汇总(无答案)
    • 网络面试题汇总
    • 工程化面试题汇总(无答案)
    • 工程化面试题汇总
    • VUE面试题汇总(无答案)
    • VUE面试题汇总
  • 直播课文件

    • 静态页面学习指导
    • 属性的计算过程
    • 层叠继承规则总结
    • BFC
    • JS基础知识回顾
    • DOM 事件的传播机制
    • DOM 事件的注册和移除
    • 阻止事件默认行为
    • 基础领航考试题
    • 基础领航考试题(答案)
    • 2024前端发展
    • JS核心概念学习指导
    • 第三方库与工程化学习指导
    • Vue入门学习指导
    • vue进阶学习指导
    • 前端性能优化
  • 笔面试环节知识讲解

    • 目录
    • 图像处理
    • 图像处理(面试)
    • Webpack构建优化
    • Webpack构建优化(面试)
    • TTS性能优化
    • TTS性能优化(面试)
    • 实时协作
    • 实时协作(面试)
    • 网页复制图片到剪贴板
    • 网页复制图片到剪贴板(面试)
    • vite插件
    • vite插件(面试)
    • 表单数据同步与保持
    • 表单数据同步与保持(面试)
    • 优化虚拟列表
    • 优化虚拟列表(面试)
    • 微前端解决巨石应用
    • 微前端解决巨石应用(面试)
    • DNS解析与优化
    • DNS解析与优化(面试)
    • 前端监控
    • 前端监控(面试)
    • 12.跨标签页通信
    • 12.跨标签页通信(面试)
    • 13.Vite相关优化
    • 13.Vite相关优化(面试)
    • 14.计时器节流问题
    • 14.计时器节流问题(面试)
    • 15.多文件预览支持
    • 15.多文件预览支持(面试)
    • 16.defer优化白屏时间
    • 16.defer优化白屏时间(面试)
  • Vue3整体变化
  • Vue2响应式回顾
  • Vue3响应式变化
  • nextTick实现原理
  • 两道代码题
  • Vue运行机制
  • 渲染器核心功能
  • 事件绑定与更新
  • computed面试题
  • watch面试题
  • 图解双端diff
  • 图解快速dff
  • 最长递增子序列
  • 模板编译器
  • 模板编译提升
  • 组件name作用
  • 路由传参方式
  • 基础篇

    • 序章React介绍
    • JSX基础语法
    • React基本介绍
    • 表单
    • 生命周期
    • 组件与事件绑定
    • 组件状态与数据传递
    • Hooks
    • React--redux介绍
    • React-router介绍
  • 就业篇

    • 属性默认值和类型验证
    • 高阶组件
    • Ref
    • Context
    • Render Props
    • Portals
    • 错误边界
    • 组件渲染性能优化
    • 前端框架的理解
    • Reacti和Vue描述页面的区别
    • 前端框架的分类
    • 虚拟DoM
    • React整体架构
    • React渲染流程
    • Fiber双缓冲
    • MessageChannel
    • Scheduleri调度普通任务
    • Scheduleri调度延时任务
    • 最小堆
    • React中的位运算
    • beginWork工作流程
    • completeWork工作流程
    • 图解diff算法
    • commit工作流程
    • lane模型
    • React中的事件
    • Hooks原理
    • useStateuseReducer.
    • effect相关hook
    • useCallbackuseMemo
    • useRef
    • Update
    • 性能优化策略之eagerState
    • 性能优化策略之bailout
    • bailoutContextAPl
    • 性能优化对日常开发启示
  • 前端监控概述
  • 错误监控
  • 数据上报
  • 页面性能监控
  • 用户行为收集与埋点
  • CSS3手册
  • HTML5手册
  • JavaScript语言提升

    • es补充
    • 事件循环
    • promise基础
    • Promise的链式调用
    • Promise的静态方法
    • async和await
    • Promise相关面试题
  • 网络

    • 客户端与服务器
    • 关于 Apifox 的使用
  • git文档
  • 工程化

    • CommonJS
    • ES module
    • npm文档(包管理)
    • Lass笔记
    • webpack工具
  • canvas详解
  • uinapp笔记
  • 自动化测试
  • oauth2令牌

    • 认识Oauth2
    • 三方应用实现github授权
    • 微信三方应用登录实现
    • 支付宝沙箱支付功能
  • CSS 面试题汇总
  • CSS单位总结

    • CSS单位总结
  • 居中方式总结

    • 居中方式总结
  • 隐藏元素的方式总结

    • 隐藏元素的方式总结
  • 浮动

    • 浮动
  • 定位总结

    • 定位总结
  • BFC

    • BFC
  • CSS属性的计算过程

    • CSS属性的计算过程
  • CSS层叠继承规则总结

    • CSS层叠继承规则总结
  • import指令

    • import指令
  • CSS3的calc函数

    • CSS3的calc函数
  • CSS3的媒介(media)查询

    • CSS3的媒介(media)查询
  • 过渡和动画事件

    • 过渡和动画事件
      • 经典真题
      • CSS3 过渡
      • CSS3 动画
      • 真题解答
  • 渐进增强和优雅降级

    • 渐进增强和优雅降级
  • CSS3变形

    • CSS3 变形
  • 渐进式渲染

    • 渐进式渲染
  • CSS渲染性能优化

    • CSS渲染性能优化
  • 堆叠上下文

    • 层叠上下文
  • CSS3 遮罩

    • CSS3 遮罩
  • CSS 面试题汇总
  • 过渡和动画事件
luzhichang
2023-10-14
目录

过渡和动画事件

# 过渡和动画事件

# 经典真题

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

# CSS3 过渡

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

CSS3 的过渡功能像是一种黄油,W3C 标准中是这样描述 transition 的:

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

先看一个快速入门示例,如下:

<div></div>
div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
}
div:hover{
  height: 300px;
}

在上面的代码中,我们让 div 被 hover 的时候,改变其高度,但是我们可以看到效果非常的生硬。

此时我们就可以添加一个 CSS3 新增的属性 transition,使其两个状态变化之间产生一个过渡效果。

div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  transition: all .5s;
  /* 添加过渡效果 */
}
div:hover{
  height: 300px;
}

上面就是一个快速入门示例,接下来我们来看一下 transition 的具体语法。

transition 属性是 transition-property,transition-duration,transition-timing-function 和 transition-delay 的一个简写属性。

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

transition-property

该属性用来指定过渡动画 CSS 属性名称,该属性的语法如下:

transition-property: none | all | property

image-20210915094158901

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

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

支持过渡的属性
background-color background-position border-bottom-color border-bottom-width
border-left-color border-left-width border-right-color border-right-width
border-spacing border-top-color border-top-width bottom
clip color font-size font-weight
height left letter-spacing line-height
margin-bottom margin-left margin-right margin-top
max-height max-width min-height min-width
opacity outline-color outline-width padding-bottom
padding-left padding-right padding-top right
text-indent text-shadow vertical-align visibility
width word-spacing z-index

transition-duration

该属性主要用于设置一个属性过渡到另一个属性所需要的时间,单位为秒(s)或者毫秒(ms)。默认值为 0,代表变换是即时的。

transition-timing-function

该属性用于设置过渡的速度,有如下的取值:

image-20210915094104556

transition-delay

过渡延迟多久触发,单位为秒或者毫秒。但是值可以是正整数,负整数和 0。

正整数和 0 都比较好理解,这里主要说一下负整数。负整数的计算会从整体过渡时间中去做减法运算,举个例子:

div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  transition: all 5s -2s;
  /* 设置为 -2s,相当于已经执行了 2s */
}
div:hover{
  height: 300px;
}

多个元素过渡

如果要对多个 CSS3 属性应用过渡效果,直接用逗号分离开即可,这种主要是针对每个属性过渡的时间不同的情况下。

例如下面的例子:背景颜色过渡时间为 2s,而宽度的过渡时间为 5s:

div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  transition: background-color 2s, height 5s;
}
div:hover{
  height: 300px;
  background-color: pink;
}

当然,如果每个属性的过渡时间都一样的话,那么直接使用 all 会更简洁一些。

hover 时期不同的过渡设置

我们可以在 hover 时对状态的变化设置一个过渡效果,鼠标移开元素恢复时设置另一个过渡效果。例如:

div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  transition: all 5s
    /* 鼠标移走时的过渡 */
}
div:hover{
  height: 300px;
  background-color: pink;
  transition: all 2s;
  /* 鼠标 hover 时状态变化的过渡 */
}

过渡事件

有些时候,在 JS 中的某些操作需要过渡效果结束后再执行,此时事件类型中给我们提供了一个 transitionend 事件方便我们监听过渡效果是否结束,例如:

<div id="oDiv"></div>
div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  transition: all 3s
}
var div = document.getElementById("oDiv");
div.onclick = function(){
  div.style.height = "400px";
}
div.ontransitionend = function(){
  console.log("过渡结束后触发");
}

# CSS3 动画

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

我们首先还是来看一个快速入门示例,如下:

<div></div>
*{
  margin: 0;
  padding: 0;
}
div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  position: absolute;
  animation: test 5s;
}
@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 调用关键帧声明的动画。

声明动画

在 CSS3 中,使用 @keyframes 来声明一个动画,语法为:

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

属性对应的说明如下:

image-20210915101256811

在上面的示例中,我们声明动画的代码为:

@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 的动画,设置了 5 个时间段,分别是 0%、25%、40%、65% 和 100%,每个时间段都有对应的不同 CSS 样式,当动画执行时,从一个时间段到另一个时间段会自动运用过渡效果,所以我们可以看到整个流程是非常平滑的。

使用动画

@keyframes 只是用来声明一个动画,如果一个声明的动画不被调用,那么这个动画是没有任何意义的。

在 CSS3 中通过 animation 属性来调用动画。

语法如下:

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

前面 4 个属性没什么好说,大体上和前面介绍的 transition 的属性很像,这里我们主要看一下后面几个属性。

animation-iteration-count

animation-iteration-count 属性定义动画应该播放多少次,如果想要一直播放,那么次数就是无限次,所以属性值为 infinite。

animation-direction

正常情况下,动画播放完毕以后,会立刻回到起始的状态。例如:

@keyframes test{
  0% {
    left: 0;
    top: 0;
  }
  50% {
    left: 400px;
    top: 0;
  }
  100% {
    left: 400px;
    top: 200px;
  }
}

对上面快速入门的示例稍作修改,我们就会发现,动画播放完毕后立马就回到起始状态了。

那么 animation-direction 就可以设置动画是否要反向播放回去。该属性对应的可设置值有:

animation-direction: normal|reverse|alternate|alternate-reverse|initial|inherit;
image-20210915104829295

需要注意的是,如果动画被设置为只播放一次,该属性将不起作用。

另外,无论动画正向播放还是反向播放,都会算一次次数,例如:

div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  position: absolute;
  animation: test 5s 5 alternate;
}
@keyframes test{
  0% {
    left: 0;
    top: 0;
  }
  50% {
    left: 400px;
    top: 0;
  }
  100% {
    left: 400px;
    top: 200px;
  }
}

在上面的代码中,我们设置一共播放 5 次,那么整个动画就会正向播放 3 次,反向播放 2 次。

animation-fill-mode

animation-fill-mode 属性规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。

一般主要用于设置动画播放完毕后的状态。

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

image-20210915105722895

用得最多的值就是 forwards,定义动画播放完后保持结束时候的样子。默认值为 none,表示动画将按预期进行和结束,在动画完成其最后一帧时,动画会反转到初始帧处。当取值为 backwards 时,会在动画结束时迅速应用动画的初始帧。

animation-play-state

animation-play-state 属性规定动画正在运行还是暂停,语法为:

animation-play-state: paused|running;

image-20210915110118784

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

<button id="playAnimate">播放动画</button>
<button id="pauseAnimate">暂停动画</button>
<div id="oDiv"></div>
*{
  margin: 0;
  padding: 0;
}
div {
  width: 100px;
  height: 100px;
  background-color: skyblue;
  position: absolute;
  animation: test 2s 5 alternate paused;
}
@keyframes test{
  0% {
    left: 0;
    top: 30px;
  }
  50% {
    left: 400px;
    top: 30px;
  }
  100% {
    left: 400px;
    top: 200px;
  }
}
var oDiv = document.getElementById("oDiv");
var playAnimate = document.getElementById("playAnimate");
var pauseAnimate = document.getElementById("pauseAnimate");
playAnimate.onclick = function(){
  oDiv.style.animationPlayState = "running"
}
pauseAnimate.onclick = function(){
  oDiv.style.animationPlayState = "paused"
}

在上面的示例中,我们就通过 JS 来控制 animation-play-state 从而切换动画播放与暂停这两个状态。

动画对应事件

同样,动画也有对应的事件,与过渡只提供有 transitionend 事件不同的是,在 CSS 动画播放时,会发生以下三个事件:

  • animationstart:CSS 动画开始后触发
  • animationiteration:CSS 动画重复播放时触发
  • animationend: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 动画如何实现?

参考答案:

即 animation 属性,对元素某个或多个属性的变化进行控制,可以设置多个关键帧。属性包含了动画的名称、完成时间(以毫秒计算)、周期、间隔、播放次数、是否反复播放、不播放时应用的样式、动画暂停或运行。

它不需要触发任何事件就可以随着时间变化来改变元素的样式。

使用 CSS 做动画:

  • @keyframes 规定动画。
  • animation 所有动画属性的简写属性。
  • animation-name 规定 @keyframes 动画的名称。
  • animation-duration 规定动画完成一个周期所花费的秒或毫秒。默认是 0。
  • animation-timing-function 规定动画的速度曲线。默认是 ease。
  • animation-fill-mode 规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。
  • animation-delay 规定动画何时开始。默认是 0。
  • animation-iteration-count 规定动画被播放的次数。默认是 1。
  • animation-direction 规定动画是否在下一周期逆向地播放。默认是 normal。
  • animation-play-state 规定动画是否正在运行或暂停。默认是 running。

-EOF-

CSS3的媒介(media)查询
渐进增强和优雅降级

← CSS3的媒介(media)查询 渐进增强和优雅降级→

Theme by Vdoing | Copyright © 2021-2024 蜀ICP备2024068710号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式