您的位置:首页 > 其它

[一个轮显插件的尝试、思考和扩展](转)

2016-03-23 20:14 127 查看

写在前面 自己的一点想法

"解决一个问题,最重要的收获并不是得到的答案。而是在寻找答案的过程中,学到的其它东西和见识的延伸。"

---《反正我从中学到不少东西》

”我敬你是条汉子!“

---《论如何回答女朋友问为什么对她那么好》

希望能够把文章大致扫一遍,里面有一些有趣的demo哦......哒

效果见页面顶部 或者如下:

显示border 隐藏border 显示切换栏 隐藏切换栏 等等api见下面描述

?

一、照着效果分析原理

最初是在一个叫《琉璃神社》的地方看到:http://hacg.club/。观察了很多次,觉得重点在这里:
格子内的效果切换

于是就扒开看看喽...



观察了整个轮显很久之后,我初步得出以下几个想法。

总效果
=>
格子特效 + 效果产生顺序


格子
=>
2个div + 通过背景图切换


通过背景图切换 || 效果产生顺序
=>
可以用jQuery的队列处理Σ( ゚д゚))


具体的逻辑算法
=>
边写边想吧,写完重构


......

二、搭建jQuery插件结构

我觉得应该写成插件方式,毕竟要多处用。以下是我写插件一般的格式,欢迎拍砖:

?

总结:

最基本的面向对象思想,写个类吧,在类中实现所有功能.

对jQuery.fn进行扩展,可以用 $.fn.method = function ,或者 $.fn.extend({}) .

jQuery对象是一个伪数组对象,里面可能含有多个元素,需要针对每一个元素实例化一个对象进行缓存.

说到data方法,js对象的 $({}).data ,是把数据放到对象本身上,而元素的 data 方法,是把数据放到 $.cache 中 。所以如何跨框架使用easyui等报错的解决方式,是需要用所属iframe内的jQuery对象,否则取不到。

将所有代码放到匿名自执行方法中.

三、对将要用到的几个主要方法方法进行扩展

1.肯定要拼接html的,"<div id='"+theId+"' >....... 这种写法简直弱爆了,以前也经常这么写,但是某天就突然扩展了,,,果然多读读别人的文章对自己有好处.

?

说明:

对String原型进行扩展: String.prototype.methodName=function...

正则表达式: /\{(\d+)\}/g ;取"{0}"这种格式的占位符,并对里面的数字放入子组

js 的 replace 方法有一种重载, string.format(regex , function(group0【匹配项】,group1【子组第一个】...){ //code... }) ;对于每次匹配到的一个占位符,都从参数相应的位置取得替换项。

2.图片预加载

?
3.jQuery队列封装

关于jQuery队列的一点认识:

众所周知,使用jQuery给元素添加一连串的动画效果,元素并不会将动画同时执行,而是按照添加的顺序,依次在上一个动画结束之后才开始下一个动画。

我了解的情况就是,jQuery使用了一种叫做“队列”(queue)的方式将动画效果依次加进去,在上一个队列中的动画执行完毕,通过deferred通知下一个动画执行。

?
这里要说一下的是,jQuery的动画默认是把处理事件放在了叫“fx”的队列中。因此,我进行了以下简单的封装:

?


使用队列,可以直观清晰,方便地将异步操作表示出来。就像
Thread.Sleep(1000)
那样明了。

关于Deferred我就不赘述了,本文没有直接使用到,自己也只是知其然而不知其所以然,仅仅会用。

队列的作用,就是将轮显中的格子,一个一个进行处理,避免了大量的setTimeout,使用callback的形式进行替换。

四、缓动

先看例子,没有效果图吸引不了人

点击发射


更详细的缓动介绍请参见:/article/4592043.html

这里我介绍一下jQuery.animate的一种重载

jQuery的animate动画,我以前不知道在哪里看到的:只能实现可以用数字表示的动画。也就是说css3的transform是不行的。但是animate有一种重载!

常用的方式


?
另一种重载


?


看到上面的写法,就应该大致了解了demo中动画的原理:

【根据要改变的样式定义一个对象,利用animate改变这个对象,监听step和complete事件来拼接新的样式赋值给你要执行动画的元素!】


以下是
【发射愤怒的小鸟】
的具体实现

?

五、对js异步编程的思考学习

我目前了解到3种js异步的方式:
setTimeout,setInterval
,
回调函数
,
事件触发


setTimeout和setInterval太丑陋了...虽然大部分误差可以接受,但是总归并不是赏心悦目。而且有些东西并不清楚会执行多久,所以舍弃。

事件触发,让我想到了 C# 中的事件与委托,确实不错,但是一长串任务要定义多少事件?感觉沉重。 这一块了解的不深,可能说的不正确。

我偏向于第二种回调。

?
但是天啊,如果一长串方法需要依次执行,这回调要有多难看?

我们看看jQuery是怎么做的(只说用法,实现过程没研究):

jQuery.Deferred()的一点了解

$.Deferred()是jQuery1.5开始加进去的,并重写了 ajax和animate(基于queue,queue基于Deferred)

使用示例:

?
使用方式:1.创建deferred对象;2.为该对象暴漏的事件绑定方法;3.对象执行动作,触发绑定的方法

对应的动作和事件(我目前常用的):

deferred.resolve() => deferred.done(callback) //完成

deferred.reject() => deferred.fail(callback) //失败

deferred.then(cb1,cb2) //cb1完成,cb2失败,当然有cb3,这个没做具体了解

deferred.always(callback) //无论完成或者失败

jQuery.when(dfd1,dfd2...)的用法:

?
//注:动作中的参数,会自动带入到事件回调的参数位置,如:

?
......

类似于C#中的委托与事件:委托的发布者不应该将委托的操控权暴漏给订阅者,最好用事件对委托进行安全的封装。 直接返回deferred似乎也不太好,对deferred仍然可以操作,所以封装一下:返回deferred.promise(),该对象只暴漏了事件的订阅方法,而不能操作。

看看 jQuery.ajax

传统的jQuery.ajax

?
ajax方法返回的仍然是一个promise对象,提供事件订阅的方法:done,fail,then...为了与原方法名对应,看下图,也额外提供了原来的名称:



另一种用法

?
这时候我想了想,我要在函数里面返回deferred对象么?有点麻烦...

突然想到jQuery的动画添加进去就会依次执行。于是了解到动画是基于队列的:

六、总结,下载

总结:

本文很多地方介绍的可能都不是很详细,毕竟我以一个“过来人”的思考方式,对于初次接触人的想法不匹配,相信那些已经掌握的人来说就是:“对啊,就这样子啊。”,初接触:“啥?你到底想说啥?”

似乎有点仓促,但是我觉得了解以上内容就已经够了。且不行,就当做目录看,对于各个知识点再去找专门的文章进行深入学习。

按照最开始的分析,已经解决了:按顺序依次延时处理(queue队列,js异步),jQuery插件的写法,格子切换时的缓动处理,其中间杂着一些在学习过程中的思考和扩展(我觉得在寻求答案中的扩展很重要)。 剩下的大概就是具体实现了...无非就是用绝对定位,在切换的时候使用缓动做特效,用queue来进行异步处理,需要一些想法,简单的算法,html和css基础。

下面附上下载地址:slider1.2.js ,slider.min.css

我在制作这个插件的过程中,巩固和学习了不少知识,实现一个功能,重要的不仅仅是实现,更多的是在实现过程中的自我扩展和见识的延伸。

突然想到了一个广告词:人生就是一部旅行,重要的不是目的地,而是沿途的风景,以及看风景的心情。

/article/5230146.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: