首页 > 其他分享 >【前端动画】—— 再看tweenJS

【前端动画】—— 再看tweenJS

时间:2023-10-02 09:03:51浏览次数:34  
标签:动画 cos -- 前端 tweenJS number param

16开始接触前端,一直对一个问题特别感兴趣,那就是js动画,也就是从那时起开始探究动画的各种表现形式,也是那个时候开始意识到编程这块东西最终考验的就是抽象和逻辑,而这一切完全是数学里边的东西。

最早接触tweenJS是去年还是前年来着有点忘了,不过当时有点不大看得懂,勉勉强强算是过了一遍,不过有了这个体验之后,我自己做了一套项目,里边有个返回顶部按钮,当鼠标按下时,我使用了sin函数控制阴影的大小,具体效果表现还着实惊艳了自己一番,就像呼吸灯那样,于是在那以后的各种面试会上,我都乐此不彼的给面试官展示我的项目。现在想想觉得还是有趣极了。

有点扯远了,现在来说说tweenJS,因为我很懒所以下面会使用TT代表tweenJS。TT其实是一个非常小巧的动画库--体积小代码又精炼,然而他所能实现的各种效果确实很多。那最简单的线性运动来说,代码如下

/*
 * @param { number } t (当前次数)    
 * @param { number } b beginning value(初始值)   
 * @param { number } c change in value(变化量)    
 * @param { number } d (动画次数)
 */    
function(t, b, c, d) {    
    return c * t / d + b;    
}

先不说上面的代码,我这里想讨论一下动画,其实一个动画就是起点到终点某个元素的某个属性随着时间逐渐改变的过程,无论这个属性是距离,颜色,大小,everything,只要能随时间改变,我们就可以称之为动画。现在再看上边的代码,为了便于讨论方便b也就是动画的起点我们可以设置为0,所以现在我们以距离为例讨论一下这个函数。b为0,那么决定最终位置的就是c,d(是持续时间),t。大家可以想想初中我们学到的公式:路程 / 时间 = 速度,所以在上边的公式里,c/d 是一个常量,而唯一变化的时间t,配合速度相乘,就是确定在某一个时间点上该物体应该所在的位置,而随着时间逐渐改变t之后,就会产生一个动画,举例如下:

实例


<style>
.example{
  width:120px;
  height:20px;
  background:#000;
}
</style>
<div id="test" class="example"></div>
<script>
    function linear(t, b, c, d) {    
        return c * t / d + b;    
    } 
    //我们在这里要让div#test向下移动一100px,持续时间是2s,这里注意一下间隔的
    //算法,总共需要运行10次才能到达100px 的位置,所以间隔的算法为 2000 / 10 = 200ms/次,
    // 块级作用域里,t从 0 - 10 ,每一次for循环启动一个定时器,分别从0,200,400,600,2000后设置marginTop的值
    for( let t = 0;t <=10;t++ )
        setTimeout(
            function(){
                test.style.marginTop = linear( t,0,100,10 ) + 'px'
            },
            200*t
        )
        
</script>

运行实例 »


在制作web动画时,有一个要求是,60fps准则,那么我们每次时间间隔因为 1000/ 60 ,这样的话t 每次的变化量就可以写成 t += 1000/60 ,其他条件不变,因此总共持续的次数就是 2000 / (1000/60),代码可以写成这样:


function linear(t, b, c, d) {            
    return c * t / d + b;        
}     
  
for( let t = 0;t <=2000;t += (1000/60) )        
    setTimeout(            
        function(){                
            let curT = Math.floor(t/(1000/60));             
            test.style.marginTop = linear( curT,0,100,2000/(1000/60) ) + 'px'            
         },            
         t        
     )


运行实例

当然啦,现在推荐requestAnimationFrame这个window的api,所以尽量用这个,当然基本算法还是差不多的。

再来看一个Sine.easeIn:

/*
 * @param { number } t (当前次数)    
 * @param { number } b beginning value(初始值)   
 * @param { number } c change in value(变化量)    
 * @param { number } d (动画次数)
 */  
function SinEaseIn(t, b, c, d) {    
    return -c * Math.cos(t/d * (Math.PI/2)) + c + b;    
}

仍以距离为例,b我们也设置为0,更方便弄懂,cos函数在 0 -- (t/d)*0.5π上的变化范围为 1 -- cos((t/d)*0.5π),t/d <=1,

即 为 1 -- cos(0.5π)  => 1 -- 0 所以,正好是cos函数的四分之一个周期,我下面找个图,看着更清晰:

             timg.jpgtimg.jpg

所以SinEaseIn 函数的返回值会从 0 - c变化 ,最后到达最终位置。


标签:动画,cos,--,前端,tweenJS,number,param
From: https://www.cnblogs.com/ZiLongZiLong/p/17144927.html

相关文章

  • 前端JSON.stringify,JSON.parse函数
    JSON.stringify将对象转为JSON字符串;JSON.parse将JSON字符串转为对象;对象:{productId:129}JSON字符串:"{\"productId\":129}"***JSON使用场景***1. localStorage/sessionStorage存储对象  localStorage/sessionStorage只可以存储字符串,当我们想存储对象的时候,需要使用JSON.s......
  • 【13.0】Fastapi中的Jinja2模板渲染前端页面
    【一】创建Jinja2引擎#必须模块fromfastapiimportRequest#必须模块fromfastapi.templatingimportJinja2Templates#创建子路由application=APIRouter()#创建前端页面配置templates=Jinja2Templates(directory='./coronavirus/templates')#初始化数据库......
  • 【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器
    【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器@AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。​●......
  • 【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器
    【中秋国庆不断更】OpenHarmony定义可动画属性:@AnimatableExtend装饰器@AnimatableExtend装饰器用于自定义可动画的属性方法,在这个属性方法中修改组件不可动画的属性。在动画执行过程时,通过逐帧回调函数修改不可动画属性值,让不可动画属性也能实现动画效果。​●......
  • 22.表单提交验证和前端MD5加密
    onclick用这个函数来绑定,onclick表示点击事件,当某个按钮被点击时发生表单加密就是为了在提交表单的时候对用户的个人隐私进行加密处理,利用md5进行加密可以有效避免恶意用户进行抓包来获取用户的隐私functionf(){varzh=document.getElementById('zh');获取zh......
  • jenkins教程:解决nodejs前端构建时报错(EMFILE: too many open files)
    修改系统最大打开文件数临时生效ulimit-n65535永久生效vim/etc/security/limits.conf*softnofile65535*hardnofile65535#修改单个进程最大打开文件数*softnprocunlimited*hardnprocunlimited查看修改结果ulimit-n配置完成后,restartjenkins即可生效。或者临时......
  • 前端 | 如何处理 React18 componentDidMount 重复执行两次的问题 | React
    前端|如何处理React18componentDidMount重复执行两次的问题|React问题描述按照React官网推荐方式创建项目,在运行项目的时,发现组件的componentDidMount方法被触发了两次。但是在旧项目中并没有这样的问题,于是觉得奇怪,以为是自己哪里使用错了,一直在排查。经过查阅官方文......
  • 前端 | React setState 同步异步以及处理方式 | React
    前端|ReactsetState同步异步以及处理方式|React问题描述在同步执行流程中setState表现为异步,而在异步执行流程中setState表现为同步。示例:有一个控制DOM节点显隐的状态值,默认为false,而下一步就需要获取该DOM节点做一系类处理。所以一开始使用setState设置状态值为true,让该......
  • 前端 toFixed()函数
    toFixed()函数:可把Number四舍五入为指定小数位数的数字。toFixed()中的参数就是需要取的小数位数,0表示不留小数点VarNumber=3.1415926Number.toFixed(2);//输出3.14Number.toFixed(0);//输出3VarNumber=18.888;Number.toFixed(0);//输出19......
  • vue前端框架ruoyi介绍
    Ruoyi是一个基于Vue.js和SpringBoot框架构建的开源前后端分离的企业级快速开发平台。它遵循了前后端分离的架构模式,将前端和后端进行解耦,使得系统更加灵活、可扩展和易于维护。Ruoyi的前端部分采用了Vue.js框架,这是一个流行的JavaScript前端框架,专注于构建用户界面。Vue......