首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

三个js中的补间js

在JavaScript中,补间动画(Tweening)是一种常见的动画技术,用于在两个值之间平滑过渡。以下是一个简单的补间动画实现,使用了requestAnimationFrame来实现流畅的动画效果。

1. 线性补间(Linear Tweening)

线性补间是最简单的补间类型,它在两个值之间以恒定速度移动。

代码语言:javascript
复制
function linearTween(start, end, duration, onUpdate, onComplete) {
    let startTime = null;

    function step(timestamp) {
        if (!startTime) startTime = timestamp;
        const progress = Math.min((timestamp - startTime) / duration, 1);
        const value = start + (end - start) * progress;
        onUpdate(value);

        if (progress < 1) {
            requestAnimationFrame(step);
        } else if (onComplete) {
            onComplete();
        }
    }

    requestAnimationFrame(step);
}

// 使用示例
linearTween(0, 100, 1000, (value) => {
    console.log(value); // 输出从0到100的值
}, () => {
    console.log('Animation complete');
});

2. 缓动补间(Easing Tweening)

缓动补间提供了更复杂的动画效果,例如加速、减速等。可以使用缓动函数来实现这些效果。

代码语言:javascript
复制
function easeInOutQuad(t, b, c, d) {
    t /= d / 2;
    if (t < 1) return c / 2 * t * t + b;
    t--;
    return -c / 2 * (t * (t - 2) - 1) + b;
}

function easingTween(start, end, duration, onUpdate, onComplete) {
    let startTime = null;

    function step(timestamp) {
        if (!startTime) startTime = timestamp;
        const progress = Math.min((timestamp - startTime) / duration, 1);
        const value = easeInOutQuad(progress, start, end - start, 1);
        onUpdate(value);

        if (progress < 1) {
            requestAnimationFrame(step);
        } else if (onComplete) {
            onComplete();
        }
    }

    requestAnimationFrame(step);
}

// 使用示例
easingTween(0, 100, 1000, (value) => {
    console.log(value); // 输出从0到100的值,带有缓动效果
}, () => {
    console.log('Animation complete');
});

3. 链式补间(Chained Tweening)

链式补间允许你创建一系列连续的动画。

代码语言:javascript
复制
class ChainedTween {
    constructor() {
        this.tweens = [];
        this.currentTween = null;
    }

    addTween(start, end, duration, easing = easeInOutQuad) {
        this.tweens.push({ start, end, duration, easing });
        return this;
    }

    start(onUpdate, onComplete) {
        const nextTween = () => {
            if (this.tweens.length > 0) {
                const { start, end, duration, easing } = this.tweens.shift();
                this.currentTween = { start, end, duration, easing, startTime: null };
                requestAnimationFrame(() => this.step(onUpdate, onComplete));
            } else if (onComplete) {
                onComplete();
            }
        };

        nextTween();
    }

    step(onUpdate, onComplete) {
        const { start, end, duration, easing, startTime } = this.currentTween;
        if (!startTime) startTime = performance.now();

        const progress = Math.min((performance.now() - startTime) / duration, 1);
        const value = easing(progress, start, end - start, 1);
        onUpdate(value);

        if (progress < 1) {
            requestAnimationFrame(() => this.step(onUpdate, onComplete));
        } else {
            this.currentTween = null;
            nextTween();
        }
    }
}

// 使用示例
const chainedTween = new ChainedTween();
chainedTween.addTween(0, 100, 1000)
           .addTween(100, 0, 1000);
chainedTween.start((value) => {
    console.log(value); // 输出从0到100再到0的值
}, () => {
    console.log('Animation complete');
});

这些示例展示了如何在JavaScript中实现基本的补间动画。你可以根据需要扩展和自定义这些函数,以实现更复杂的动画效果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

详解TWEEN.JS 动画

首先需要引用该库 设置元素属性 var position={ x:-150, y:0 }; 初始化动画变量,...---- 全局方法: 控制所有动画。以下方法都定义在全局对象TWEEN。 TWEEN.update(time) 更新所有的动画。如果time没有被指定,将使用当前时间。...TWEEN.add(tween) 在被激活tweens添加一个tween TWEEN.remove(tween) 在被激活tweens移除一个tween。...---- 控制组 使用TWEEN单例来管理,可能会在包含多组件大型应用程序中出现问题,所以引入了更小组。..., 100] }); 值计算方式: 首先,进度如常计算 进度(从0到1)用作插值函数输入 基于进度和值数组,生成内插值 比如,当刚启动时(进度为0),插值函数将返回数组第一个值,当到一半时

3.9K21
  • Vue.js组件、组件通信

    目录: 组件种类:vue-router产生每个页面、基础组件、业务组件 Vue.js组件三个API:prop、event、slot Vue.js组件通信方式: ref:给元素或组件注册引用信息;...Vue.js组件三个API:prop、event、slot props props定义了这个组件有哪些可配置属性,props最好用对象写法,这样可以针对每个属性设置类型、默认值或自定义校验属性值...这个属性是默认支持,如果不期望开启,在组件选项设置 inheritAttrs : false。...Vue.js组件通信(其他) 一、provide/inject(主要解决子组件获取上级组件状态,主动提供与依赖注入关系) Vue.js 2.2.0版本后新增API。...并不推荐直接用于应用程序代码

    10.2K10

    jssettimeout()用法详解_jssetattribute

    大家好,又见面了,我是你们朋友全栈君。 setTimeout与setTimeInterval均为window函数,使用顶层window一般都会省去,这两个函数经常稍不留神就使用错了。...setTimeout内函数先不执行,隔一段时间后再执行,函数后面的数字是隔时间,单位是毫秒(千分之一秒) 比如: setTimeout(‘alert(“hello world!”)’..., 400); setInterval() 方法可按照指定周期(以毫秒计)来调用函数或计算表达式,直到clearInterval()被调用或窗口被关闭。 比如: Stop interval setInterval动作作用是在播放动画时...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    15K20

    jsfind用法_jsfind函数

    今天我们要说是结合ES6新特性谈一下js里面的一个很好用方法-find() 现在前端和过去不一样,过去前端只要会画页面就行了,但是现在仅仅会画页面已经远远不够了,现在前端还需要会处理数据,而且还要会将数据分析分类处理...下面我们讲怎么用前端处理这块逻辑 首先我们拿到了所有的数据这里我直接放到一个测试用js里面存放, 要实现之前说效果,就需要使用我们今天主角find()方法。 find()是用来做什么呢?...find()方法返回数组符合测试函数条件第一个元素。否则返回undefined 在本文章需要注意几个点: ①、第一个元素 ②、测试函数 那么如何使用呢?.../find_testcodes.js" type="text/javascript" charset="utf-8">

    11.7K30

    常见三个 JS 面试题

    本文不是讨论最新 JavaScript 库、常见开发实践或任何新 ES6 函数。相反,在讨论 JavaScript 时,面试通常会提到三件事。...然,这些并不是你在面试之前应该学习唯一三件事 - 你可以通过多种方式更好地为即将到来面试做准备 - 但面试官可能会问到下面是三个问题,来判断你对 JavaScript 语言理解和 DOM 掌握程度...如果我们以一个简单待办事项列表为例,面试官可能会告诉你,当用户点击列表一个列表项时执行某些操作。...然后,函数将创建 10,000 个独立事件侦听器,并将每个事件监听器绑定到 DOM ,这样代码执行效率非常低下。 在面试,最好先问面试官用户可以输入最大元素数量是多少。...以便面试官衡量你对 JS 熟悉程度,以及你是否知道何时使用闭包。

    1.3K20

    JS逆向之浏览器环境详解

    JS逆向之浏览器环境详解 “浏览器环境”是JS逆向者升职加薪必备技能,也是工作不可避免操作。...对于逆向老手而言,“环境” 这个词不会陌生,当我们每次把辛辛苦苦扣出来js加密算法代码”,并且放在浏览器环境能正确执行后,就需要将它放到Node环境 中去执行,而由于Node环境与浏览器环境之间存在差异...,会导致部分JS代码在浏览器运行结果 与在node运行得到结果不一样,从而影响我们最终逆向成果;eg: function decrypt() { document = false;...”,使得扣出来js加密算法代码” 在Node环境运行得到加密值,与其在 浏览器环境运行得到加密值一致。...越完善,我们能通杀JS环境检测越多。 优点: 越完善,能通杀JS环境检测越多。最终完美通杀所有JS环境检测!!

    4.6K20

    jsHook

    简单理解:   hook(钩子)就是: 把将要执行函数或者一系列动作注册到一个统一接口下面, 当应用程序调用此接口(即hook)时,就等于调用了这一系列动作。...JS钩子(hook)例子 JS钩子(hook)例子1: 例如我们在向后台进行ajax请求时候,后台经常会返回我们一些常见错误码,如:001代表用户不存在,002代表用户密码输入错误。...这个时候我们要将错误友好提示给用户。这个时候我们该怎样实现呢?...一般写法可能是: $.ajax(option,function(result){ var errCode = result.errCode ;//错误码 if(errCode){...switch case来实现,但是这个两种写法都无法避免一个问题就是如果我错误码特别多,那得写多少个if else和case 啊?

    6.5K31

    Js堆栈

    Js堆栈 堆heap是动态分配内存,大小不定也不会自动释放,栈stack为自动分配内存空间,在代码执行过程自动释放。...栈区 在栈内存中提供一个供Js代码执行环境,关于作用域以及函数调用都是栈内存执行。...Js基本数据类型String、Number、Boolean、Null、Undefined、Symbol,占用空间小且大小固定,值直接保存在栈内存,是按值访问,对于Object引用类型,其指针放置于栈内存...,堆内存存储实际对象,在栈内存存储对象指针,对于对象访问是按引用访问,在堆区内存不会随着程序运行而自动释放,这就需要实现垃圾回收机制GC,需要注意是在Js没有类似于Cfree()函数去手动释放内存...,从而决定是否需要进行内存回收,在Js主要有引用计数与标记清除两种垃圾回收算法。

    3.1K30

    Jsthis总结

    没关系,我们只要知道在 ECMAScript 规范还有一种只存在于规范类型,它们作用是用来描述语言底层行为逻辑。...它们是为了更好地描述语言底层行为逻辑才存在,但并不存在于实际 js 代码。...组成这段讲述了 Reference 构成,由三个组成部分,分别是: base valuereferenced namestrict reference可是这些到底是什么呢?...可以按照下面的顺序来进行判断:函数是否在 new 调用( new 绑定)?如果是的话 this 绑定是新创建对象。...如果是的话, this 绑定是指定对象。var bar = foo.call(obj2)函数是否在某个上下文对象调用(隐式绑定)?如果是的话, this 绑定是那个上下文对象。

    2.4K30

    Js变量

    Js变量:  1:如果在var没有初始化变量值,则默认为undefined.  2:可以不用var来申明一个变量,但是在过程级申明一个变量时,就必须用var.   ...var currentCount  5: 在 JScript null 和 undefined 主要区别是 null 操作象数字 0,    而 undefined 操作象特殊值NaN (不是一个数字...请注意,比较大小时字符串自动转换为相等数字,但加法(连接)运算时保留为字符串。...js数据类型  1:Jscript 有三种主要数据类型、两种复合数据类型和两种特殊数据类型    主要(基本)数据类型是: 字符串 数值 布尔    复合(引用)数据类型是: 对象 数组    特殊数据类型是...: Null Undefined  2:测试是否已经声明变量 x :    if (typeof(x) == "undefined")      // 作某些操作 js内置对象  1:Jscript

    12.9K60

    JS 日期

    有格式时间 let myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整年份(4位,1970...000, 1626244862000 日期转换成时间格式 可以有参数,如果没有参数获取是当前时间对象 参数可以是时间字符串或者是时间戳,则转换对应时间时间对象,要注意格式 new Date('2021...Date(1626244866842); //正确 , Wed Jul 14 2021 14:41:06 GMT+0800 (中国标准时间) new Date('2021-07-14'); // 错误,...这种格式是不支持, new Date("2021-07-14".replace(/-/g, "/")); //Sat Apr 16 2011 00:00:00 GMT+0800 (中国标准时间)...计算 如果直接使用`new Date()`进行计算,默认会转换成从1970.1.1时开始毫秒数. new Date('2021,07,13') - 1000 ; 1626105600000 - 1000

    22820

    细说Jsthis

    没关系,我们只要知道在 ECMAScript 规范还有一种只存在于规范类型,它们作用是用来描述语言底层行为逻辑。...它们是为了更好地描述语言底层行为逻辑才存在,但并不存在于实际 js 代码。...组成这段讲述了 Reference 构成,由三个组成部分,分别是: base valuereferenced namestrict reference可是这些到底是什么呢?...可以按照下面的顺序来进行判断:函数是否在 new 调用( new 绑定)?如果是的话 this 绑定是新创建对象。...如果是的话, this 绑定是指定对象。var bar = foo.call(obj2)函数是否在某个上下文对象调用(隐式绑定)?如果是的话, this 绑定是那个上下文对象。

    4.3K20

    js数据

    数据、内存、变量 数据:以二进制形式存储在内存,代表一定信息数字。 内存:内存条通电后产生存储空间。内存又分为栈内存和堆内存。栈内存存放是全局变量或局部变量。而堆内存存放是对象。...,而obj1保存了obj内容,只是obj内容是{ name: 'clying' }地址值。...而存在与fun函数内部o变量,变成了垃圾对象,根本无法使用。 比较 可能会有一些疑惑:变量与函数,修改了obj值,为什么在引用变量与函数,obj值没有被修改?...首先需要明白,js函数传递变量参数时,是「值传递」(个人理解:传递是变量值)。执行函数fun,只是将obj地址值赋值给o变量。...变量与函数,o是直接被修改,修改直接是obj内部age属性变量。 引用变量与函数, 「o存放是obj值」,即:o内部是{ name: 'dengdeng', age: 22 }地址值。

    5.5K20
    领券