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函数的四分之一个周期,我下面找个图,看着更清晰:

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

【前端动画】—— 再看tweenJS的更多相关文章

  1. web前端体系-了解前端,深入前端,架构前端,再看前端。大体系-知识-小细节

    1.了解前端,深入前端,架构前端,再看前端.大体系-知识-小细节 个人认为:前端发展最终的导向是前端工程化,智能化,模块化,组件化,层次化. 2.面试第一关:理论知识. 2-1.http标准 2-2. ...

  2. 再看Ajax

    再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...

  3. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  4. 再看 AspriseOCR - OCR应用开发 -20151124

    再看 AspriseOCR - OCR应用开发 我写这个博文时间为 2015/11/24日,注意时间因为,网上很多文章时间上很久远,有的已经不能参考了 很多人面对从图片中识别文字或者数字0~9  A~ ...

  5. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  6. 再看case语句

    再看case语句,case语句只处理单条记录,而不是set 列名的使用,可以当做数值来使用: case when 后面简直是完美的的,什么东西都是能放的,只要是一个逻辑上的true/false的逻辑就 ...

  7. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

  8. python基础----再看property、描述符(__get__,__set__,__delete__)

    一.再看property                                                                          一个静态属性property ...

  9. perf使用的问题,再看perf record,perf record 设置的采样频率,采样频率是如何体现在

    当perf stat -e branches 是统计 再看perf record,perf record是为了是记录时间发生的时候的调用栈, 在我的测试代码中总共有200,000,000条branch ...

  10. 再看Scrapy(1) 基本概念

    再看Scrapy(1) 基本概念 1 准备 安装scrapy: 国内镜像源(官方的pypi不稳定)安装 pip3 install -i https://pypi.douban.com/simple/ ...

随机推荐

  1. Qt编写地图综合应用1-闪烁点图

    一.前言 Qt作为一个超大型的一站式GUI超市开发集成环境,不仅集成了大量的可视化UI组件,还提供了网络库.数据库操作.文件操作等类库,封装的还是相当精彩一步到位,根据个人身边的一些程序员朋友了解,自 ...

  2. 百度高效研发实战训练营-Step2

    百度高效研发实战训练营Step2 2.1 代码的艺术 2.1.1<代码的艺术>目的解读 这门课程的目的主要有以下四点: (1) 了解公司与学校写代码的不同 (2) 消除对于程序员这个职业的 ...

  3. .NET Core + Kafka 开发指南

    什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目.Kafka主要用于构建实时数据管道和流式应用程序. Kafka ...

  4. PaperAssistant:使用Microsoft.Extensions.AI实现

    前言 上篇文章介绍了使用Semantic Kernel Chat Completion Agent实现的版本. 使用C#构建一个论文总结AI Agent 今天来介绍一下使用Microsoft.Exte ...

  5. Solution Set - “带我去看极光与大海吧”

    目录 0.「AGC 062C」Mex of Subset Sum 1.「THUPC 2021 初赛」「洛谷 P7136」方格游戏 2.「THUPC 2023 初赛」「洛谷 P9139」喵了个喵 II ...

  6. 用 C# 实现检测系统环境变量 “Path” 中是否有某个值,没有就添加的方法

    用 C# 实现检测系统环境变量 "Path" 中是否有某个值,没有就添加的方法: using System; using System.Collections.Generic; u ...

  7. VS2022 没有MAUI模板的解决方法

    原来是要安装 VS 2022 Preview 就是预览版.正式版还没有MAUI..... 以下的尝试都是蛋疼,没有卵用. 命令行窗口输入:dotnet workload install maui VS ...

  8. Spring Boot 如何使用拦截器、过滤器、监听器

    过滤器的使用 首先需要实现 Filter接口然后重写它的三个方法 init 方法:在容器中创建当前过滤器的时候自动调用 destory 方法:在容器中销毁当前过滤器的时候自动调用 doFilter 方 ...

  9. Redis常用指令(详细)

    # Redis 常用指令## 基础命令### 启动与连接```bash# 启动 Redis 服务redis-server# 连接 Redis 客户端redis-cli```### 基本操作```bas ...

  10. Java中,将ResultSet映射为对象和队列及其他辅助函数

    关于对象关系映射(ORM)在数据库访问中用到的最多,在Java中,很多库都试图将一个ResultSet映射为一个自定义的Java Bean对象或队列,下面是我的实现 1 从ResultSet中读取数据 ...