我的第一个开源小项目终于诞生了!

这个小项目(卡片秀)是一个卡片抽奖特效,用开源项目这样的词语让我多少有些羞愧,毕竟作为一个涉世未深的小伙子,用项目的标准衡量还有很大差距。不过该案例采用 jQuery 插件方式编写,提供配置参数并且做了浏览器兼容优化,整体而言作为一个小项目也不为过。目前正在持续更新。

话不多少,先上地址:https://github.com/nzbin/CardShow/tree/master

当然,博主写这篇文章不是为了炫耀这个 Demo,而是交流 jQuery 插件的编写以及这一项目中遇到的各种问题。现在的插件还有很多 bug 以及不完善的地方包括一些代码的冗余,后期会进行更细致的拆分组装等。

首先说一下这个项目的起因,博主最近接到了公司安排的一个抽奖页面,因为时间仓促以及其它原因,最后简单实现了功能并且添加了一些动画效果。但是最初看到设计图以卡片形式展示用户数据的时候,我就想到了能否做的稍微炫酷一点,随后便一直在构思。比如卡片的发牌、随机排列展示以及翻转显示等效果。事实证明,把想法变现实会遇到很多的问题。大家可以点击 CardShow 查看自动抽卡的效果。目前的效果基本实现了我当初的构思。卡片的抽取效果主要分为自动抽手动抽两种。后期会添加卡片拖动的功能。我希望大家能够下载源码修改参数来查看效果,并提出宝贵意见,以便博主可以及时作出修改,大家的支持就是我前进的最大动力。

以下是我在写插件时遇到的问题以及解决的问题,大概包括 jQuery 插件编写、modernizr 使用、css3 动画、transitionend 事件、洗牌算法、相邻不重复随机数、获取 transform 的值、call() 的深入理解、setTimeout 的堵塞等等,每一块拿出来都可以单独写一篇文章,这篇文章只是简单介绍,之后也会就某一部分做深入探讨。

1. jQuery 插件的编写

话说很多事情看着简单,做起来很难。如果不理解原生 js 的对象、函数、原型、作用域以及 jQuery 的核心思想及方法,想写一个插件可能真的非常困难。对于 jQuery 插件的编写我就不多说了,网上一搜很多,比我写的好的更多,我只贴一下自己写的插件的结构。对于代码的结构我思考了很久也研究了很久,最后借鉴了一些案例,感觉以下结构更清晰,更简洁,更易懂。

;(function(window, $) {

  // 插件主体
  $.plugin = function(el,options){

  }
  // 默认配置
  $.plugin.defaults = {

  }
  // 原型方法
  $.plugin.prototype = {

  }
 // 设置 jQuery 插件
  $.fn.plugin = function(options) {

    return instance;

  }

})(window, jQuery);

2. modernizr 的使用

modernizr 也算是一个老牌的浏览器兼容方案了,相信大家也早已使用或者早有耳闻。之前虽然早就知道这个小东西,应该是接触 bootstrap 时了解的,但一直未有机会使用,直到现在写插件才发现,用它检测 css3 的属性并做兼容方案真的是爽歪歪。网上关于 modernizr 的文章并不多,这是官网文档:https://modernizr.com/docs ,已经说得很详细,我之后会翻译该文。

3. 相邻不重复随机数

解决这个问题多少让我有一些成就感,虽然还不是很完美。这相当于问:写一个函数,使其可以产生相邻不重复的随机数?对于这个问题我没有搜索到答案,搜到最多的是产生不重复的随机数。这完全是两个问题,这个问题看起来不难,无非定义对比变量,但问题就在于怎么对比,怎么写函数。之前看到有人说“算法就像窗户纸”,现在深有体会。解决这个问题多少有些运气的成分,想了很久,最后随手一写,竟然成功了。可能这个问题本身真的不难。我建议大家先不要展开代码,自己写一个函数,用 setInterval 持续输出随机数,能否做到相邻不重复。也希望大家给我一个更完美的方案,欢迎留言。

    // 产生相邻不重复的随机数,n 为随机数个数
    // 定义比较变量,能否封装?
    var b = 0;

    function random(n) {
        var a = Math.floor(Math.random() * n);

        if (a == b) {
            return random(n);
        } else {
            b = a;
            return b;
        }

    };

4.洗牌算法

洗牌算法的原始方法由 Ronald FisherFrank Yates 提出,网上可以搜到很多,以下是 JS 方法:

// 数组随机变换函数
    function shuffleArr(array) {
        var m = array.length,
            t, i;
        // While there remain elements to shuffle…
        while (m) {
            // Pick a remaining element…
            i = Math.floor(Math.random() * m--);
            // And swap it with the current element.
            t = array[m];
            array[m] = array[i];
            array[i] = t;
        }
        return array;
    };

5.获取 transform 的值

因为动画以 transition 为主,所以要持续操作元素的 transform 的值。但是 transform 是一个复合值,取出特定数值有一定困难。我的解决办法简单粗暴。我在控制台打印 transform 的值得时候发现是一个 matrix 的东西。关于 transform 的矩阵知识大家自行搜索。其实就是一个字符串,只要 split() 方法取出特定值即可。但是这里面有个浏览器兼容的问题。众所周知,transform2d 是 3X3 矩阵,而 transform3d 是 4X4 矩阵,如果使用 transform3d 属性而没有给出第三个值,在火狐及谷歌浏览器会输出 3X3 矩阵,而在 IE 及 Edge 输出 4X4 矩阵。

本文持续更新~

时间: 2024-09-29 22:08:38

我的第一个开源小项目终于诞生了!的相关文章

个人第一个开源分布式项目distributeTemplate的实现三 网络通讯netty传输大文件

今天 我将讲讲网络通讯,这里我初始版本 由于采用的事Netty框架  所以 这里讲网络Netty在我们这里是怎么使用的,下周开始添加rpc lucene内容了 实现之后的0.2 0.3版本,后面将会去掉netty依赖 采用原生的NIO2 (aio) 异步非阻塞方式 实现自己网络通讯,也就是说 这部分可能会实现一个简单的但是比netty精简高效的网络框架,后期做出来 可能会单独开一个分支开源出来,netty说白了 就是 事件驱动 以及 NIO 加一些协议 以及 异常 处理,废话不多说了. 我最近

个人第一个开源分布式项目distributeTemplate的实现二 分布式配置以及上下文的维护同步

我们实现分布式 也是按照 这样一步一步来的,首先是公用的资源对象,第一个必须的公用资源 对象是配置,这配置交给用户外部填写 手动配置 并能维持同步 更新 所以需要一个配置对象 维护在内存里面,需要事件驱动监听配置文件的变化情况 ok下面来 看看代码是怎么做的 ,首先 配置 有多重配置方式 ini conf prop xml 各种方式本质上 我们分布式就是要各台主机 自己所在的节点 都能知道我在网络上情况,或者所可以找到像zookeeper 只要知道或者找到了 才能进行以后的通讯同步 我们为了能够

【Python】第一个微信小项目

一.微信好友数据分析功能介绍 1.爬取好友列表,显示好友昵称.性别和地域和签名, 文件保存为 xlsx 格式2.统计好友的地域分布,并且做成词云和可视化展示在地图上3.获取所有好友的头像,合并成一张大图 二.需要的库 1.Pyecharts:一个用于生成echarts图表的类库,echarts是百度开源的一个数据可视化库,用echarts生成的图可视化效果非常棒,使用pyechart库可以在python中生成echarts数据图. 2.Itchat:一个开源的微信个人号接口,使用python调用

第一个微信小项目

一 微信好友数据分析 (一)要实现对微信好友数据分析这神奇的操作,首先得准备好工具,那就是安装以下几种库数据 安装 wxpy库 : pip install wxpy 安装 PIL库:pip install pillow安装 pyecharts库:pip install pyecharts安装 Itchat库:pip install itchat安装 Jieba库: pip install jieba安装 Pandas库:pip install Pandas安装 Numpy库:pip instal

CSDN开源夏令营项目进入第一实习期,入选名单和优秀开题报告推荐名单公布

由CSDN推出的面向中国在校大学生的"开源夏令营"技术公益活动已于7月4日截止学生报名,自6月16日起,共有1785名学生参与了活动报名,445名学生提交了共650份开题报告,经过导师们的精心挑选和认真考核,共有67名学生最终入选. 在这短短的20天当中,学生们参与热情十足,导师们更是积极负责的与报名学生沟通并审阅其开题报告,从众多学生中选定出最符合自己项目要求的参与者. 本次活动每一个开源项目均施行一对一导师制度,最终有67名学生脱颖而出,成功获得进入第一阶段实习期的机会.据导师反馈

一个简陋的个人小项目,也是个人第一个真正意义上的独立项目——Graph

由来 我最早接触到图这个概念是在大二的离散数学当中图论相关的内容,当时是以著名的哥尼斯堡七桥问题引出图论的概念,现在依然记忆犹新(不过只是记得这个名字,具体的解题思路我重新温习了一下才想起来),当时也提出了求最短路径的迪杰斯特拉算法,不过没有用编程语言具体实现. 之后在数据结构的学习中,又出现了图的相关知识,提出了在计算机中存储图的几种方式,我们学校的课程中学习的是邻接表和邻接矩阵,同时也用编程语言实现了具体的算法. 离散数学中的图用几何图形表示,清晰明了,但实现算法时步骤不清晰:邻接矩阵和邻接

[转]基于C#的开源GIS项目介绍之SharpMap篇

我是一个刚毕业的GIS本科毕业生,目前在杭州从事GIS软件应用开发.在项目开发中总感觉自己的编程水平还不够,于是想找些开源GIS小项目来研究研究,借以提高自己的编程能力和项目开发能力.在网上搜了一下“GIS开源”发现还不少,下面是一个介绍GIS开源项目的链接: http://www.yuanma.org/data/2008/0526/article_3048.htm 里面介绍了基于各种编程语言的GIS开源项目,并列出了各自的特点和官网链接. 由于在学校时候学的一直都是C#和Visual Stud

C#开源资源项目

一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率. NKalore是一款编程语言,它扩展了C#允许在.net平台使用AOP.NKalore的语法简单.直观,它的编译器是基于Mono C#编译器(MCS).NKalore目前只能在命令行或#Develop内部使用.NKalore兼容公共语言规范CL

web实践小项目<一>:简单日程管理系统(涉及html/css,javascript,python,sql,日期处理)

暑假自学了些html/css,javascript和python,苦于学完无处练手几乎过目即忘...最后在同学的建议下做了个简单日程管理系统.借第一版完成之际,希望能将实践期间犯过的错误和获得的新知进行整理,希望能给其他初学者提供参考,也希望有大神在浏览我粗糙的开发过程中能指出一些意见或建议. (阅读以下内容需要有一定的html/css,javascript,python和sql基础,and谢谢阅读!) 注:实践中的环境为ubuntu 14.04操作系统,python3.4(2.7实测也可行),