【前端动画】—— 再看tweenJS

前端,动画,tweenjs · 浏览次数 : 60

小编点评

The code you provided aims to create a smooth linear animation with a duration of 2000 milliseconds. **Key Concepts:** * `linear()` function: Calculates the linear easing function based on the current position and the target position. * `requestAnimationFrame()`: A web API that allows you to schedule animations and control the animation loop. * Animation loop: The code runs in an infinite loop, calling the `linear()` function and setting the `marginTop` of an element based on the current position. **Algorithm:** 1. The code calculates the current position `t` by adding a time step of `1000/60` milliseconds. 2. It uses the `linear()` function to determine the easing function for the animation. 3. The easing function calculates the target position based on the current position and the animation duration. 4. It sets the `marginTop` of an element to the calculated position. 5. The animation repeats continuously until it reaches the end of the specified duration. **Benefits of using requestAnimationFrame:** * Control over animation speed and duration. * Fine-grained control over animation timing with `t` variable. * Provides smooth and natural-looking animations. **Example Usage:** ```html
``` **Note:** * The `linear()` function assumes a linear easing effect. * The animation will continue indefinitely until it reaches the end duration. * You can adjust the `b` and `c` values in the `linear()` function to control the easing curve.

正文

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变化 ,最后到达最终位置。


与【前端动画】—— 再看tweenJS相似的内容:

【前端动画】—— 再看tweenJS

16开始接触前端,一直对一个问题特别感兴趣,那就是js动画,也就是从那时起开始探究动画的各种表现形式,也是那个时候开始意识到编程这块东西最终考验的就是抽象和逻辑,而这一切完全是数学里边的东西。最早接触tweenJS是去年还是前年来着有点忘了,不过当时有点不大看得懂,勉勉强强算是过了一遍,不过有了这个

谁说.net core不好动态访问webservice?看这篇文章,C#快速实现动态访问webservice,兼容.net framework和.net core+

前言:访问webservice,大多数人都是用服务引用的方式,但是这种方式比较麻烦,例如遇到服务更新了,你还需要手动更新你的服务引用,再重新发布,很麻烦。或者已有的一些例子,至少我看到的很多案例,动态访问也只能止步于使用.net framework环境,没看到有啥.net core上面动态访问的案例

家庭实验室系列文章-如何迁移树莓派系统到更大的 SD 卡?

前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔。 因为没有资格,也没有钱在一线城市买房 (😂😂😂); 但是在要结婚之前,婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城市买了房。 再之后,一起装修,她负责非电相关,我负责电 网相关的装修。 家庭组网,家庭实验室就

家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?

前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔。 因为没有资格,也没有钱在一线城市买房 (😂😂😂); 但是在要结婚之前,婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城市买了房。 再之后,一起装修,她负责非电相关,我负责电 网相关的装修。 家庭组网,家庭实验室就

618技术揭秘:探究竞速榜页面核心前端技术

本文将探究京东竞速榜H5页面的核心前端技术,包括动画、样式配置化、皮肤切换、海报技术、调试技巧等方面,希望能够为广大前端开发者提供一些有用的参考和思路。

【manim】之圆规动画

概要 前端时间做尺规作图相关的动画的时候,封装了一个圆规的动画,顺便研究了下 manim 库的动画函数。 manim 本身就是做动画的库,所以,基于它封装自定义的动画非常方便。 动画原理 对于单个的元素,manim本身就提供了非常多的动画函数。 比如:创建/消除的动画,移动元素的动画,旋转元素的动画

React跨路由组件动画

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。 本文作者:佳岚 回顾传统React动画 对于普通的 React 动画,我们大多使用官方推荐的 react-transition-group,其提供了四个基本组件 Tra

setTimeout(fn, 0) // it works - JavaScript 事件循环 动画演示

在前端代码中很经常看到使用 setTimeout(fn, 0),如下面代码所示,乍一看很多余,但是移除了可能会出现一些奇奇怪怪的问题。要解释这个就需要理解 事件循环(Event Loop),下面会通过一些例子和动画来辅助理解事件循环 setTimeout(() => { // 调用一些方法 }, 0

一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效

华丽炫酷的动画特效总能够让人心旷神怡,不能自已。艳羡之余,如果还能够探究其华丽外表下的实现逻辑,那就是百尺竿头,更上一步了。本次我们使用图片、SCSS样式以及SVG图片动画来实现“点赞”按钮的动画特效,并比较不同之处。 图片实现 最简单,也最容易理解的实现方式就是使用图片。曾几何时,几乎所有前端特效

前端里那些你不知道的事儿之 【window.onload】

相信很多前端开发者在做项目时同时也都做过页面性能优化,这不单是前端的必备职业技能,也是考验一个前端基础是否扎实的考点,而性能指标也通常是每一个开发者的绩效之一。尤其马上接近年关,页面白屏时间是否过长、首屏加载速度是否达标、动画是否能流畅运行,诸如此类关于性能更具体的指标和感受,很可能也是决定着年底你能拿多少年终奖回家过年的晴雨表。