热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

朋友,这里有个仓库需要你PR一下

前段时间,发布了一篇文章:学不动了,来点有趣的吧。发现github仓库被frok了很多次,因此下定决心要好好的把代码整理一下,方便大家查看代码以及更加愉快的PullRequest。

前段时间,发布了一篇文章:学不动了,来点有趣的吧。发现 github 仓库被 frok 了很多次,因此下定决心要好好的把代码整理一下,方便大家查看代码以及更加愉快的 Pull Request

简介

该项目名叫 matrixchange ,编写的目的在于方便开发者实现矩阵动画,当然该项目已经发布到 npm ,使用 npm/yarn 安装即可。

该库为开发者提供了一个数组和一个函数,具体的文档可以查看上一篇文章,或是在 github 上查看更为详细的内容。

ok 简介到此完毕。虽然这个简介有点短,但是该篇的目的并不在于让大家了解这个矩阵动画,而是想让大家一起来丰富这个仓库。

接下来进入正题。

动画形式

何为矩阵动画?

简单来说就是有一个矩阵,然后让它动起来,效果如下:

《朋友,这里有个仓库需要你 PR 一下》

这就是一个简单的矩阵动画,动画形式如何?

从右上到左下按照斜线进行运动

那么动画效果呢?

翻转消失,然后翻转呈现

animite.css 可以解决绝大多数的动画效果,而且 animite.css 中的动画也大致可以分为入场动画好出场动画两个大类,既然如此,那么我们实现矩阵动画中需要的动画效果迎刃而解,我们仅需要丰富动画形式即可。

抽象

既然我们准备批量实现我们的动画形式,那么抽象是必要的,按照之前给的效果图,这个是我抽象出来的对象:

{
interval: 140,
duration: 1000,
init(row, col) {
this.row = row;
this.col = col;
this.count = col;
},
check(i, j) {
return j - i === this.count;
},
next() {
this.count--;
},
end() {
return this.count === -this.row;
}
}

字段名类型代表的含义
intervalnumber每次(获取需要运动的点)的时间间隔
durationnumber transition 动画专用,用于设置 transition 的持续时间,animate 动画不需要
initFunction每次动画开始前会调用,用于初始化对象信息
checkFunction用于确定每次需要运动的点
nextFunction每次(获取需要运动的点)后都会调用该函数,用于重置判断条件
endFunction判断该动画是否结束

动画具体的执行流程为

  1. 将矩阵的行列传入 init 函数
  2. 设置以 interval 为时间间隔的定时器
  3. 遍历矩阵中所有的点,传入 check 函数,确定该点是否需要运动
  4. 执行 next 函数
  5. 执行 end 函数,若函数返回 true 则取消定时器,动画结束

结合上面的内容,不难想象出,刚刚的对象触发矩阵中的点如下(以 row = 7; col = 9 为例)

  • 定时器第一次触发时,运动的块为 [0, 8]
  • 定时器第二次触发时,运动的块为 [0, 7],[1, 8]
  • 定时器第三次触发时,运动的块为 [0, 6],[1, 7],[2, 8]
  • …

也就是从右上到左下,每一次动一条斜线。也是实现 gif 图中的动画形式,配合 animate.css 就能完成效果图展示的效果。

注意点

  • init/check/next/end 函数中的 this 代表本对象,也就是拥有该方法的对象
  • this 下也可设置任意值,这是 js 的特性,js 的对象非固定字段,所有设置任意值都 ok
  • 最好不要将值设置到对象外部,避免互相影响,所以为了方便调用,最好都设置在 this 对象下,如上述的 row/col/count
  • 由于动画效果会被调用 n 次,所以要记得在 init 方法内将自定义设置在 this 下的值进行初始化。避免由于上次动画修改了某值,但没有初始化导致动画效果在第 2 次时有变化。

定义

既然我们是用 typescript 进行开发,该对象的完整定义如下:

export type modeType = {
interval: number;
duration?: number;
[propName: string]: any;
init(row: number, col: number): void;
check(i: number, j: number): boolean;
next(): void;
end(): boolean;
}

只要符合该定义的对象,就可以认为是一个符合要求的动画形式,但是动画的执行是否完整(动画执行是否将所有矩阵中的点都触发了一遍),不在库的考虑范围内,这点需要你,也就是该动画形式的编写者确定。

开发环境

ok 看到这里是否已经有些骚气的一批的动画在你的脑海中呈现,很想实现它吧~

那么如何来验证你的动画是否完整呢?

方式一

安装好 matrixchange 后,按照 github 上提供的文档,先将矩阵初始化好,然后调用 movePoint 将你写好的对象传入即可。

什么?麻烦?对!

确实挺麻烦的,还要自己写个 html 可能还要配置 webpack 开发环境等一系列杂七杂八的东西,写个动画形式为什么还要配置这么多无关紧要的步骤呢?其实我都已经给你配置好啦~

方式二

按照以下步骤

git clone https://github.com/acccco/matrixChange.git

先将项目克隆到本地,当然可以先 fork 然后克隆你自己的项目,推荐先 fork

npm i
# or
yarn

安装项目依赖。

npm run dev

运行程序,然后浏览器打开 http://localhost:8080/ 即可。

对了,那该在哪里编写你的运动形式呢?

项目下有 dev 文件夹,在文件夹内,我已经写好了布局,写好了初始化方法,你所要做的就是找到 movePoint 这个方法,然后将该方法的第一次参数改成你所写好的对象即可。

什么?我原来文件中 movePoint 的第一个参数 line.rt2lb 是什么鬼?

说明一下,我将已经实现的效果按照分类放在了 src/mode 文件夹,四个方向分别使用缩写代替。

l - 左
r - 右
t - 上
b - 下
i - 内部
o - 外部
R - 代表前面所表示运动的反向
Anti - 逆时针

line.rt2lb 所代表的运动形式为:从右上到左下的线性运动。

src/mode 文件夹中已经实现的有 6 大类,32 种动画形式。大概说明一下

文件名代表意思例子说明
line.js线性运动 line.r2l line.rt2lb每次运动一条直线
L.jsL 形运动 L.lt2rb L.lt2rbR每次运动一个 L 形状的区域
circle.js回字形运动circle.i2o每次运动一圈
spread.js扩散运动spread.random由一个中心点进行扩散,每次扩散一圈
loop.js绕圈运动loop.lt由某个顶点进行绕圈运动
random.js随机运动random.t2b线性随机运动

更为详细的介绍可以查看 src/mode 中的具体文件,大家可以将动画形式放入 movePoint 中查看具体的动画效果。

当然,已经实现的运动形式大家也可以看看有没有更加简单的编写方式,优化原本的代码。

总之,有了想法那就开始行动吧,不管是新想法,还是优化我原本的实现,都欢迎 Pull Request。当然可能有了想法,但时间上不允许,也可以在 Issues 上记录,大家可以一起帮你实现。

最后

最后再次提供 github 地址,欢迎大家 Pull Request

喜欢的话 可以点个 star 哦,感谢~


推荐阅读
  • 本文深入探讨了原型模式在软件设计中的应用与实现。原型模式通过使用已有的实例作为原型来创建新对象,而不是直接通过类实例化。这种方式不仅简化了对象的创建过程,还提高了系统的灵活性和效率。具体来说,原型模式涉及一个支持克隆功能的接口或基类,子类通过实现该接口来提供具体的克隆方法,从而实现对象的快速复制。此外,文章还详细分析了原型模式的优缺点及其在实际项目中的应用场景,为开发者提供了实用的指导和建议。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 本文详细介绍了在 Vue.js 前端框架中集成 vue-i18n 插件以实现多语言支持的方法。通过具体的配置步骤和示例代码,帮助开发者快速掌握如何在项目中实现国际化功能,提升用户体验。同时,文章还探讨了常见的多语言切换问题及解决方案,为开发人员提供了实用的参考。 ... [详细]
  • React项目基础教程第五课:深入解析组件间通信机制 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • 在TypeScript中,我定义了一个名为 `Employee` 的接口,其中包含 `id` 和 `name` 属性。为了使这些属性可选为空,可以通过使用 `| null` 或 `| undefined` 来扩展其类型定义。例如,`id: number | null` 表示 `id` 可以是数字或空值。这种类型的灵活性在处理不确定的数据时非常有用,可以提高代码的健壮性和可维护性。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 精通jQuery:深入解析事件处理机制与应用技巧
    本文详细探讨了jQuery的事件处理机制及其应用技巧,通过具体的代码示例,逐一解析了每个jQuery代码片段与其对应的HTML结构。文章以标记为基准,CSS作为通用样式,确保每段代码都能独立运行。HTML和CSS代码统一放置在文章末尾,方便读者参考和实践。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
author-avatar
臭小子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有