如何使用Javascript实现缓动特效

news2024/11/26 11:36:46

什么是缓动特效

虽然缓动特效这个词你可能没有听说过,但是绝大部分人都使用过。最典型的场景是在实现动画的过程中,无论是早期的jQuery还是CSS3里的transition,都允许你添加一个缓动特效参数,例如 linear, ease-in, ease-out等等。添加参数的效果就是让物体的变化(速度、大小或者颜色)伴随着一定的节奏,可以是均匀的,也可以是由慢至快的。

为什么要研究这件事?因为我在使用Unity编写游戏的过程中需要使物体拟真,例如一辆汽车在移动到目标位置时通常是缓慢启动,随之加速,最后缓慢减速。这正好和缓动特效中的ease-in-out不谋而合。然而在Unity中这一切都需要通过编码完成而非像前端开发中一个参数搞定。于是在学习如何使用代码实现缓动特效之后,在这里分享给大家,其实非常简单。

基本原理介绍

假设一个运动中的物体,处于跑道的100米处,准备向250米处前进,计划运动时间2秒。我们从0秒开始计时,那么随着时间的推移,它所处的位置和当前时间的关系可以用如下函数(公式)表示:

function linear(time, begin, change, duration) {
    return change * (time / duration) + begin;
}

各个参数的意思为:

  • time:当前已经运动的时间,即0到2(秒)中任意一数值
  • begin:距离的初始值,即100(米)
  • change:目标值与初始值的差值,即250 - 100 = 150(米)
  • duration:运动时长,即2(秒)

这个公式的原理是,把已经运动的时长除以运动总时长,算出当前的时间进度(百分比),再将百分比乘以总距离换算成目前已经运动的距离,最后加上初始值得到最终运动进度。

那么当物体开始运动,即0秒时,根据公式物体还处于原地:150 * (0 / 2) + 100 = 100; 当物体运动了1秒之后,物体此时的位置为:150 * (1 / 2) + 100 = 175。恰好在起点和终点的中间位置 当物体运动了2秒之后,物体的位置为:150 * (2 / 2) + 100 = 250。恰好是终点位置。

以上是小学四年级的数学内容,相信各位都能掌握,没毛病。

我们再把这个公式抽象一下,假如把change函数设为1,begin值设为0,那么得到的函数会是如下所示:

function linear(time, duration) {
    return time/duration;
}

很明显这个函数返回值只会处于0到1之间。我们把这个函数的返回值当作“系数”,对于任意给定起点值和终点值,我们都能根据上面描述的原理,利用这个系数算出任意时刻的进度或者说是运动状态。最初的公式我们可以拆分为以下两个函数:

function factor(time, duration) {
    return time/duration;
}

function progress(time, begin, end, duration) {
    return begin + (end - begin) * factor(time, duration);
}

根据上述公式,时间进度和移动进度的关系图如下图所示(横向为时间,纵向为位移):

没错,是一条直线。CSS中transition-timing-function属性的可选值linear就是这个意思:随着时间的推移,值变化是平均的。

系数的秘密

然而缓动效果除了linear以外,还有ease-in,ease-out,ease-in-out等等。所有这些特效的奥秘都在于上一小节所说的“系数”里。

在linear特效中,系数的产生是线性的:time / duration。如果我们把系数公式改为Math.pow(time / duration, 2),而progress函数不变。则时间和位移的坐标图趋势则会变得如下图所示:

没错,正如图的标题所示,这就变成了ease-in的缓动特效。物体的运动状况与纵坐标相同,由慢逐渐加快。

我们可以继续把系数公式抽象,继续改变Math.pow(time / duration, 2)中的平方系数2,改为3、4甚至5。借助可视化函数工具mathway,我们可以把x^2, x^3, x^4,x^5的坐标图分别绘制出来:

如果你对这几个图片感到眼熟的话那就没错了,因为这四个函数分别对应于以下四种缓动效果:

注意这四种缓动效果的名称,虽然前面都是以ease-in开头,但后缀都不相同。后缀分别是Quad, Cubic, Quart, Quint。ease-in缓动效果虽说总体上是加速效果,但在此基础上四种后缀代表了四种加速的激烈程度,激烈程度由低到高:Quad最接近平缓(接近线性),Quint变化最为剧烈。四个后缀分别就对应了Math.pow函数的第二个参数次方系数。Quint等于2,Cubic等于3,Quart等于4,Quint等于5。

在这里我可以给出你一个结论了,缓动效果其实就是关于运行时间(进度)的函数。

你可能会纳闷,上面的位移函数progress不是和起始值和终点值相关吗?难道factor函数就决定了一切?

我凭借着我对高中数学的记忆,针对数学函数做一个解释(如果有误请见谅请纠正我:P):例数学函数y = x^2为例,下面列举了其他与它相似的三个函数进行对比:

  • 左一和左二图对比,相差的只是纵坐标的位移,图中曲线趋势完全一致
  • 左二和左三图对比,不同的是平方项前的系数,影响的是曲线的“开口大小”
  • 左三和左四图对比,不同的是次方数,此时曲线的“形状”已经完全改变。

而缓动效果最大的差异,在于曲线的“形状”不同。所以真正起作用的只会是进度函数factor。

除了Quad,Cubic,Quart,Quint外,还有其它级别的缓动程度,比如Expo,Back,Bounce等,不同之处也仅仅在于函数中处理进度的方式不同。更多的视觉效果和缓动函数可以参考easings.net。

除了ease-in以外的缓动效果的脚本实现可以参考easing.js。这个类库中的实现与本文讲解的稍稍不同是,它直接将“进度”作为函数参数,例如:

linear: function (t) { return t },
easeInQuad: function (t) { return t*t },
easeInCubic: function (t) { return t*t*t },

当然CSS中还允许通过贝塞尔曲线来制定缓动效果,曲线如下图所示

通过控制P2点和P1点的位置来控制曲线的变化,在CSS中则传入P1和P2点的位置即可

transition-timing-function: cubic-bezier(P1.x, P1.y, P2.x, P2.y);

你能通过贝塞尔曲线编辑器来编辑曲线


如何使用Javascript实现缓动特效 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云安全—etcd攻击面

0x00 前言 本篇还是一样,先来说一说etcd是什么,干啥的,然后再来看看etcd的攻击面到底有哪些,做一个抛砖引玉的作用,如有不妥之处还请斧正 0x01 etcd 依旧还是按照问问题的方式来进行阐述,因为学到的东西…

【一文搞定--web 自动化之文件上传】

在做web自动化时,我们经常会碰到一些场景需要进行文件上传,而文件上传打开的窗口属于windows控件,通过Selenium是操作不了的,此篇文章给大家介绍几种实现方法。 前言 方法一:sendKeys 前提条件:文件上传元…

51单片机电子钟闹钟温度LCD1602液晶显示设计( proteus仿真+程序+原理图+设计报告+讲解视频)

51单片机电子钟闹钟温度液晶显示设计( proteus仿真程序原理图设计报告讲解视频) 1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接(可点击): 🌟51单片…

2103. 环和杆

2103. 环和杆 难度: 简单 来源: 每日一题 2023.11.02 总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings ,表示这 n 个环在杆上的分布。rings 中每两个字符形成一个…

汇编-算术运算符

下面给出了一些有效表达式和它们的值:

跆拳道馆展示服务预约小程序的效果如何

除了书本上的知识,很多人或孩子会选择学习一些技能,如游泳、钢琴、棋艺花艺等,跆拳道也拥有较高的客户群体,但由于需求属性较强,因此在实际发展中,商家宣传推广、获取线索、服务赋能方面不足。 如今互联网…

在微信小程序怎么领取优惠券

随着科技的发展,微信小程序已经成为我们日常生活中不可或缺的一部分。它为我们提供了各种各样的服务,使我们的生活变得更加便捷。而在这些服务中,领取优惠券成为了大家特别喜欢的功能之一。本文将详细介绍如何在微信小程序中领取优惠券&#…

文件夹怎么设置密码?电脑怎么设置文件夹密码?

在使用电脑的过程中,我们经常使用文件夹来储存管理文件。而为了保护文件夹的数据安全,我们可以为文件夹设置密码。那么,电脑怎么设置文件夹密码呢?下面我们就一起来了解一下。 文件夹设置密码的要求 文件夹设置密码很简单&#…

ELK + kafka 日志方案

概述 本文介绍使用ELK(elasticsearch、logstash、kibana)  kafka来搭建一个日志系统。主要演示使用spring aop进行日志收集,然后通过kafka将日志发送给logstash,logstash再将日志写入elasticsearch,这样elasticsearc…

【C++】关于构造函数后面冒号“:“的故事------初始化列表(超详细解析,小白一看就懂)

目录 一、前言 二、 初始化的概念区分 三、初始化列表 (重点) 💦初始化列表的概念理解 💦初始化列表的注意事项 四、共勉 一、前言 在之前的博客学习中,我们已经学习了【C】的六大默认成员函数 ,想必大…

MySQL数据库入门到精通——运维篇(2)

MySQL数据库入门到精通——运维篇(2) 1. 分库分表1.1 分库分表介绍1.1.1 现在的问题1.1.2 拆分策略1.1.2.1 垂直拆分策略1.1.2.2 水平拆分策略 1.2 Mycat概述1.3 Mycat入门1.4 Mycat配置1.4.1 Schema标签1.4.2 Datanode标签1.4.3 Datahost标签1.4.4 rule…

蓝桥杯每日一题2023.11.2

题目描述 等差素数列 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题我们需要求出最小的公差并且长度为10, 1.确保序列开始为素数 2.确定枚举的个数 注意:序列中数只是d的变化,可以通过此计算将开始数字后9个数字都计算出来,d是…

PostgreSQL逻辑管理结构

1.数据库逻辑结构介绍 2.数据库基本操作 2.1 创建数据库 CREATE DATABASE name [ [ WITH ] [ OWNER [] user_name ] [ TEMPLATE [] template ] [ ENCODING [] encoding ] [ LC_COLLATE [] lc_collate ] [ LC_CTYPE [] lc_ctype ] [ TABLESPACE [] tablespace ] [ CONNECTION L…

网络取证-Tomcat-简单

题干: 我们的 SOC 团队在公司内部网的一台 Web 服务器上检测到可疑活动。为了更深入地了解情况,团队捕获了网络流量进行分析。此 pcap 文件可能包含一系列恶意活动,这些活动已导致 Apache Tomcat Web 服务器遭到破坏。我们需要进一步调查这一…

【LeetCode:2103. 环和杆 | 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

nexus搭建npm私有镜像

假设有一个nexus服务,地址为: http://10.10.33.50:8081/ 创建存储空间 登录后创建存储空间,选择存储类型为File,并设置空间名称为 npm-private 创建仓库类型 2.1 创建hosted类型仓库 创建一个名为 npm-hosted 的本地类型仓库 2.…

SpringCloud 微服务全栈体系(十)

第十章 RabbitMQ 一、初识 MQ 1. 同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得…

弹幕互动游戏运营模式你知道吗?

分享一个今年最新的风口项目,弹幕互动游戏。这种游戏类型是,主播真人出镜主持游戏过程,观众在直播间通过评论和礼物可以加入,并且操控游戏里的角色,等于是游戏和直播的结合。那普通人怎么把握这波风口呢? 说…

氮化硼纳米球 BN纳米球 hexagonal boron nitride

(西)氮化硼纳米球 (安)用途:科研 (瑞)平均粒径:50nm (禧)纯度:99.9% (生)比表面积:54.23m2/g &#xff0…

“利用Lazada API揭秘电商数据:一键获取海量商品详情!“

要使用Lazada API获取Lazada商品详情,您需要先注册Lazada开发者账号并获取授权码和密钥。然后,通过调用Lazada API的item_get接口,传入商品ID和国家域名后缀,即可获取到商品的详细信息。 以下是使用Lazada API获取Lazada商品详情…