JavaScript-如何通过原生JS实现匀速动画

2024-03-04 16:52

本文主要是介绍JavaScript-如何通过原生JS实现匀速动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JavaScript-如何通过原生JS实现匀速动画

据我们所知,我们可以通过css3(transform translate即可)区实现这个动画,但是通常面试的时候,可能会被要求原生手敲;

​ 使用到的知识点:定时器去实现setInterval去实现
在这里插入图片描述

<button onclick="changeBox()">点击移动box</button><div class="box"></div><script>let box = document.querySelector('.box')let timerId let timerId2function changeBox(){if(timerId2){clearTimeout(timerId2)}timerId2 = setTimeout(()=>{// if(timerId){clearInterval(timerId)}let original = box.offsetLeft;let current = 0timerId = setInterval(()=>{current++box.style.left = original + current + 'px'// 比如移动到100px的时候就停止console.log(current === 100,"查看防抖是否生效")if(current === 100){clearInterval(timerId)}},10)},1000)}</script>
对于以上代码进行公共封装:元素原生实现匀速动画
  /*** @target <Object> 传入的目标元素* @moveData <number> 每次点击移动数据* **/
function animate(target, moveData,callback) {if (target.timerId) {clearInterval(target.timerId)}let original = target.offsetLeft;let current = 0target.timerId = setInterval(() => {current++box.style.left = original + current + 'px'if (current === moveData) {clearInterval(target.timerId)if (callback instanceof Function) {callback()}}}, 10)}
缓动动画封装(匀速、加速、减速、返回加速、返回减速)

前面可以看到,我们使用current++是一种匀速的方式,匀速的快慢取决于我们+=后面的值,如果我们希望是缓动动画的形式去移动我们的元素,我们可以通过以下封装算法去实现

 /** 清除定时器的时候需要注意的判断,非匀速是会有差别的
* if (current <0  || current == 0) {clearInterval(timerId4)box.style.left =original + 'px'}else{box.style.left =original + current + 'px'}**/function speed (type, moveData) {switch (type) {case 'uniformSpeed': // 匀速function uniformSpeed () {let current = 0return current++}return speed++breakcase 'moderate': // 减速function moderate (moveData) {let current = 0let distance = moveData - currentreturn (current += distance? Math.ceil(distance / 10): Math.floor(distance / 10))}breakcase 'accelerate': // 加速function accelerate (moveData) {let current = 0let distance = 10 + currentreturn current < 500? (current += distance? Math.ceil(distance / 10): Math.floor(distance / 10)): 500}breakcase 'comeBack-accelerate': // 往回加速function comeBack (moveData) {let current = moveDatalet distance = 10 + currentcurrent -=distance > 0 ? Math.ceil(distance / 10) : Math.floor(distance / 10)}breakcase 'comeBack-moderate': // 往回减速速function comeBack (moveData) {let current = 0let distance = moveData - currentreturn (current -= distance? Math.ceil(distance / 10): Math.floor(distance / 10))}break}
}

这篇关于JavaScript-如何通过原生JS实现匀速动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773828

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取