首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 11 章 使用动画
11.1 使用CSS 3创建动画
11.1.1 transition过渡动画
11.1.2 keyframes动画
11.2 使用JavaScript的方式实现动画效果
11.3 Vue过渡动画
11.3.1 定义过渡动画
11.3.2 设置动画过程中的监听回调
11.3.3 多个组件的过渡动画
11.3.4 列表过渡动画
11.4 实战:优化用户列表页面
第 12 章 Vue CLI工具的使用
12.1 Vue CLI工具入门
12.1.1 Vue CLI工具的安装
12.1.2 快速创建Vue项目
12.2 Vue CLI项目模板工程
12.2.1 模板工程的目录结构
12.2.2 运行Vue项目工程
12.2.3 vue-class-component库简介
12.3 在项目中使用依赖
12.4 工程构建
12.5 新一代前端构建工具Vite
12.5.1 Vite与Vue CLI
12.5.2 体验Vite构建工具
第 13 章 Element Plus基于Vue 3的UI组件库
13.1 Element Plus入门
13.1.1 Element Plus的安装与使用
13.1.2 按钮组件
13.1.3 标签组件
13.1.4 空态图与加载占位图组件
13.1.5 图片与头像组件
13.2 表单类组件
13.2.1 单选框与多选框
13.2.2 标准输入框组件
13.2.3 带推荐列表的输入框组件
13.2.4 数字输入框
13.2.5 选择列表
13.2.6 多级列表组件
13.3 开关与滑块组件
13.3.1 开关组件
13.3.2 滑块组件
13.4 选择器组件
13.4.1 时间选择器
13.4.2 日期选择器
13.4.3 颜色选择器
13.5 提示类组件
13.5.1 警告组件
13.5.2 消息提示
13.5.3 通知组件
13.6 数据承载相关组件
13.6.1 表格组件
13.6.2 导航组件
13.6.3 标签页组件
13.6.4 抽屉组件
13.6.5 布局容器组件
13.7 实战:教务系统学生表
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(四)
小册名称:TypeScript和Vue从入门到精通(四)
### 11.2 使用JavaScript的方式实现动画效果 在Web开发中,动画效果是提升用户体验和页面交互性的重要手段。尽管Vue.js等现代前端框架提供了声明式的动画和过渡系统(如Vue的`<transition>`和`<transition-group>`组件),但了解并掌握直接使用JavaScript实现动画效果的能力仍然是非常有价值的。这不仅能帮助你在特定场景下实现更复杂的动画效果,还能增强你对Web动画机制的理解。本章节将深入探讨如何使用原生JavaScript(不依赖Vue的动画系统)来实现动画效果。 #### 11.2.1 动画基础概念 在深入探讨具体实现之前,先了解几个与动画相关的基本概念: - **帧(Frame)**:动画由一系列静态图像(帧)快速连续播放形成。 - **帧率(Frame Rate)**:每秒钟播放的帧数,通常以FPS(Frames Per Second)表示,高帧率意味着更流畅的动画。 - **动画循环(Animation Loop)**:通过循环执行代码,不断更新动画状态并重新绘制页面以实现动画效果。 - **CSS动画与JavaScript动画**:CSS动画主要通过CSS的`@keyframes`规则定义动画关键帧,并通过`animation`属性控制动画播放;而JavaScript动画则通过JavaScript代码直接操作DOM元素的样式属性(如`style.left`、`style.opacity`等)来实现动画效果。 #### 11.2.2 JavaScript动画的实现方式 JavaScript动画主要依赖于`requestAnimationFrame()`方法和`setTimeout()`/`setInterval()`函数。 ##### 11.2.2.1 使用`requestAnimationFrame()` `requestAnimationFrame()`是专门为动画设计的API,它告诉浏览器你希望执行一个动画,并请求浏览器在下次重绘之前调用指定的函数来更新动画。相比于`setTimeout()`或`setInterval()`,`requestAnimationFrame()`具有更好的性能,因为它是由浏览器自动优化时间间隔的。 **基本用法**: ```javascript function step(timestamp) { // 更新动画状态 // 例如,更新元素的位置 let progress = timestamp - startTime; element.style.left = `${progress * speed}px`; // 如果动画未结束,则继续请求下一帧 if (progress < duration) { requestAnimationFrame(step); } } let startTime = null; function startAnimation() { startTime = performance.now(); // 获取当前时间戳 requestAnimationFrame(step); } // 调用startAnimation()开始动画 startAnimation(); ``` **优势**: - 高效的动画性能。 - 自动优化动画的帧率。 - 避免了`setTimeout()`和`setInterval()`可能导致的性能问题(如浏览器标签页不活跃时,`setTimeout()`和`setInterval()`的回调执行可能会被延迟)。 ##### 11.2.2.2 使用`setTimeout()`或`setInterval()` 尽管`requestAnimationFrame()`是推荐的方式,但在某些简单场景或兼容性要求下,`setTimeout()`或`setInterval()`依然有其用武之地。 **使用`setTimeout()`**: ```javascript let progress = 0; const duration = 1000; // 动画持续时间,单位毫秒 const speed = 1; // 动画速度,单位px/ms function moveElement() { progress += speed; element.style.left = `${progress}px`; if (progress < duration) { setTimeout(moveElement, 10); // 每隔10毫秒调用一次 } } // 开始动画 moveElement(); ``` **注意**:使用`setTimeout()`或`setInterval()`时,需要特别注意时间间隔的设置,过短的时间间隔可能会导致浏览器性能问题,过长的间隔则可能使动画看起来不够流畅。 #### 11.2.3 动画性能优化 实现动画时,性能优化是一个不可忽视的方面。以下是一些提升动画性能的建议: 1. **使用`requestAnimationFrame()`**:如前所述,这是实现动画的首选方法。 2. **减少DOM操作**:频繁地读写DOM属性是性能瓶颈之一。尽量在一次循环中完成所有必要的DOM操作。 3. **利用CSS3硬件加速**:通过CSS的`transform`和`opacity`属性可以实现GPU加速,这些属性比直接操作`left`、`top`等样式属性的性能更好。 4. **避免重绘(Repaint)和回流(Reflow)**:重绘是浏览器重新绘制页面元素的过程,而回流则是浏览器重新计算页面元素位置和大小的过程。避免不必要的重绘和回流可以显著提高性能。 5. **使用节流(Throttling)和防抖(Debouncing)技术**:在需要处理高频事件(如滚动、窗口大小调整等)触发的动画时,节流和防抖技术可以有效减少函数调用的频率,从而提高性能。 #### 11.2.4 实战案例:实现一个简单的滑动动画 下面是一个使用`requestAnimationFrame()`实现的简单滑动动画的示例: ```javascript function slideTo(element, endX, duration) { let startTime = null; const distance = endX - element.offsetLeft; const speed = distance / (duration / 1000); function animation(timestamp) { if (!startTime) startTime = timestamp; const timeElapsed = timestamp - startTime; const run = Math.easeInOutQuad(timeElapsed, distance, 0, speed, duration); element.style.left = `${run}px`; if (timeElapsed < duration) { requestAnimationFrame(animation); } } // 缓动函数,这里使用二次缓动(先加速后减速) function Math.easeInOutQuad(t, b, c, d) { t /= d / 2; if (t < 1) return c / 2 * t * t + b; t--; return -c / 2 * (t * (t - 2) - 1) + b; } requestAnimationFrame(animation); } // 使用示例 slideTo(document.getElementById('myElement'), 300, 500); // 将ID为'myElement'的元素滑动到左侧300px的位置,动画持续500毫秒 ``` 在上述示例中,我们定义了一个`slideTo`函数,它接受一个DOM元素、目标位置(`endX`)和动画持续时间(`duration`)作为参数,并使用`requestAnimationFrame()`和缓动函数`Math.easeInOutQuad`来实现平滑的滑动动画效果。 #### 11.2.5 结论 通过本章的学习,我们深入了解了使用JavaScript实现动画效果的基本原理、方法以及性能优化技巧。无论是使用`requestAnimationFrame()`还是`setTimeout()`/`setInterval()`,我们都能根据具体需求选择合适的工具来创建流畅、高效的动画效果。同时,掌握动画的缓动函数和性能优化技巧也是提升前端开发技能的重要一环。希望这些内容能帮助你在Vue.js项目中更好地运用JavaScript实现复杂的动画效果。
上一篇:
11.1.2 keyframes动画
下一篇:
11.3 Vue过渡动画
该分类下的相关小册推荐:
vuejs组件实例与底层原理精讲
vue项目构建基础入门与实战
Vue.js从入门到精通(二)
Vue3技术解密
Vue.js从入门到精通(一)
移动端开发指南
Vue面试指南
TypeScript和Vue从入门到精通(一)
Vue原理与源码解析
Vue.js从入门到精通(三)
Vue源码完全解析
Vue.js从入门到精通(四)