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 timerId2
        function changeBox(){
            if(timerId2){clearTimeout(timerId2)}
            timerId2 = setTimeout(()=>{
                // if(timerId){clearInterval(timerId)}
                let original = box.offsetLeft;
                let current = 0
                timerId = 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 = 0
       target.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 = 0
        return current++
      }
      return speed++
      break
    case 'moderate': // 减速
      function moderate (moveData) {
        let current = 0
        let distance = moveData - current
        return (current += distance
          ? Math.ceil(distance / 10)
          : Math.floor(distance / 10))
      }
      break
    case 'accelerate': // 加速
      function accelerate (moveData) {
        let current = 0
        let distance = 10 + current
        return current < 500
          ? (current += distance
              ? Math.ceil(distance / 10)
              : Math.floor(distance / 10))
          : 500
      }
      break
    case 'comeBack-accelerate': // 往回加速
      function comeBack (moveData) {
        let current = moveData
        let distance = 10 + current
        current -=
          distance > 0 ? Math.ceil(distance / 10) : Math.floor(distance / 10)
      }
      break
    case 'comeBack-moderate': // 往回减速速
      function comeBack (moveData) {
        let current = 0
        let distance = moveData - current
        return (current -= distance
          ? Math.ceil(distance / 10)
          : Math.floor(distance / 10))
      }
      break
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot4--双指针

题目&#xff1a; 双指针想法&#xff1a; i 指针在数组不为 0 的地方停留&#xff0c;j 指针在每个地方停留&#xff0c;依次交换 i 和 j 指针。当 i 指针遍历完所有数组元素时&#xff0c;j 指针指向的元素及后面的元素都为0。 代码如下&#xff1a; C版本 class Solution …

5.测试教程 - 进阶篇

文章目录 1.按测试对像划分1.1**界面测试**1.2**可靠性测试**1.3**容错性测试**1.4**文档测试**1.5**兼容性测试**1.6**易用性测试**1.7**安装卸载测试**1.8**安全测试**1.9**性能测试**1.10**内存泄漏测试** 2.按是否查看代码划分2.1黑盒测试(Black-box Testing)2.2白盒测试(W…

retinaNet FocalLoss源码详解

targets[positive_indices, assigned_annotations[positive_indices, 4].long()] 1 ## 把正样本所对应的锚框所对应的类别的列置为1 # aim torch.randint(0, 1, (1, 80)) # tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # 0…

【JavaEE进阶】使用云服务器实现Linux环境搭建

文章目录 &#x1f343;前言&#x1f332;Linux背景知识&#x1f6a9;Linux 是什么&#xff1f;&#x1f6a9;Linux发行版&#x1f6a9;Linux的优势 &#x1f384;Linux环境搭建&#x1f6a9;环境的搭建方式&#x1f6a9;使用云服务器 &#x1f38b;使用终端软件连接到Linux&am…

企业CRM系统选型指南 | 掌握必备功能,提升工作效率

大家好我是卡林&#xff0c;今天分享CRM系统的十大功能&#xff0c;企业CRM系统选型指南。说起CRM的功能&#xff0c;大家会联想到什么&#xff1f;数据库、商机管理或者销售漏斗&#xff0c;这些是大部分人都会联想到的功能&#xff0c;但不太全面。如线索管理、联系人管理、客…

2. vue 工程创建

1. 基于 vite创建 官方文档: https://v3.cn.vuejs.org/guide/installation.html#vite vite官网: https://vitejs.cn 使用vite创建的优势&#xff1a; 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动。轻量快速的热重载(HMR)。真正的按需编译&#xff0c;不再…

[青少年CTF擂台挑战赛 2024 #Round] Misc 1ez_model

[青少年CTF擂台挑战赛 2024 #Round] Misc 1ez_model 题目描述&#xff1a;从Pytorch开始的AI之路 下载附件&#xff0c;是一个pth文件 .pth 文件通常是 PyTorch 模型的权重文件&#xff0c;它包含了模型的参数。要还原&#xff08;或加载&#xff09;一个大模型&#xff0c;你…

利用ArcGISPro/GeoScenePro从激光雷达数据中提取 3D 建筑物

开始使用激光雷达数据 在本课程中&#xff0c;您将从激光雷达数据中提取信息。 激光雷达&#xff08;激光探测及测距&#xff09;是一项遥感技术&#xff0c;它利用激光对地球表面进行密集采样&#xff0c;以产生高精度的 x, y, z 点测量。 这些点的集合称为点云。 要从激光雷达…

CVE-2024-23334 AIOHTTP 目录遍历漏洞复现

aiohttp简介 aiohttp 是一个基于 asyncio 实现的 Python HTTP 客户端和服务器框架。它提供了异步的 HTTP 客户端和服务器功能&#xff0c;能够处理高并发的网络请求。以下是关于 aiohttp 的一些重要特点和用途&#xff1a; 基于 asyncio&#xff1a;aiohttp 是基于 Python 的 a…

FAST-LIO系列-阅读笔记

近期&#xff0c;阅读了FAST-LIO、FAST-LIO2以及Faster_LIO论文&#xff0c;这三篇论文都属于滤波器的SLAM算法&#xff0c;下面记录一下三个工作的主要贡献和不同。 FAST-LIO 1.提出了一种计算效率高、鲁棒性强的激光雷达-惯性里程测量框架。使用紧密耦合的迭代扩展卡尔曼滤…

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享

SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 2024年01月03日 10:38186浏览 3喜欢 0评论 视频地址&#xff1a; SuperPoint和SuperGlue 的算法介绍及学习应用经验分享 好想 特征点匹配&#xff0c;为了计算位姿 特征点&#xff1a;关键点描述子&#xff08…

迅速上手:CentOS 系统下 SSH 服务配置指南

前言 掌握 SSH 服务&#xff0c;就像拥有了一把解锁网络世界的钥匙。本文深入浅出地介绍了如何使用 SSH&#xff08;Secure Shell&#xff09;服务&#xff0c;从连接远程服务器到安全文件传输&#xff0c;让你轻松驾驭远程管理与数据传输&#xff0c;提高工作效率&#xff0c…

玩转地下管网三维建模:MagicPipe3D系统

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进&#xff0c;构建地下管网三维模型与地上融合的数字孪生场景&#xff0c;对于提升智慧城市管理至关重要&#xff01;针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

力扣 第 387 场周赛 解题报告 | 珂学家 | 离散化树状数组 + 模拟场

前言 整体评价 手速场模拟场&#xff0c;思路和解法都蛮直接的。 所以搞点活 如果T2&#xff0c;如果不固定左上角&#xff0c;批量查询某个点为左上角&#xff0c;求满足总和 ≤ k \le k ≤k的子矩阵个数 如果T2&#xff0c;如果不固定左上角&#xff0c;求总和 ≤ k \le k…

20款Visual Studio实用插件推荐

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些实用的Visual Studio插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件&#xff0c;希望对大家有所帮助。 各位小伙伴有更好的…

Redis安全加固策略:绑定Redis监听的IP地址 修改默认端口 禁用或者重命名高危命令

Redis安全加固策略&#xff1a;绑定Redis监听的IP地址 & 修改默认端口 & 禁用或者重命名高危命令 1.1 绑定Redis监听的IP地址1.2 修改默认端口1.3 禁用或者重命名高危命令1.4 附&#xff1a;redis配置文件详解&#xff08;来源于网络&#xff09; &#x1f496;The Beg…

[HGAME 2024 WEEK3] Misc 与ai聊天

[HGAME 2024 WEEK3] Misc 与ai聊天 题目描述&#xff1a;跟他聊一聊吧&#xff0c;从他嘴里翘出flag 开题&#xff0c;这种一般是提示词注入漏洞。简而言之就是骗。 失败的案例 成功的案例

论文阅读:基于超像素的图卷积语义分割(图结构数据)

#Superpixel-based Graph Convolutional Network for Semantic Segmentation github链接 引言 GNN模型根据节点特征周围的边来训练节点特征&#xff0c;并获得最终的节点嵌入。通过利用具有不同滤波核的二维卷积对来自附近节点的信息进行整合&#xff0c;给定超像素方法生成的…

基于hyperleger fabric区块链的校园化妆品交易平台搭建(完整源码+详细文档+解析讲解)

基于hyperleger fabric区块链的校园化妆品交易平台搭建 源码资料等获取方式在文章末尾 一、大数据与区块链解决方案概述 选题背景: 目前不少同学在校园里进行二手交易没有一个大众认可的平台&#xff0c;很多都是私下交易&#xff0c;但会存在很多虚假交易&#xff0c;甚至出…

代码随想录算法训练营第八天

344. 反转字符串 方法&#xff1a; 方法一&#xff1a; 直接用reverse函数 注意&#xff1a; 代码&#xff1a; class Solution { public:void reverseString(vector<char>& s) {return reverse(s.begin(), s.end());} };运行结果&#xff1a; 方法&#xff1…