类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些。

比较常用之一的就是窗帘切换了。

先贴上完成的效果。

实现原理不复杂,在动的一条一条的称之为“窗帘条”或者是“strip”,每一个strip都是一个div,类似于雪碧图的方式将其背景图的位置设置为strip的可视位置,然后用jquery的animate让他们按照一定规律动起来就完成窗帘切换效果了。

为了使用方便,将这个功能作为jquery的插件方式进行编写。

插件名:bobenut.curtain.jquery.js

(function (jquery) {
jquery.fn.curtain = function (options) {
//TODO }
})(jQuery);

调用页面

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
#curtain {
width: 800px;
height: 600px;
position: relative;
overflow: hidden;
margin:0 auto;
}
</style>
</head>
<body>
<div id="curtain" >
<img src="1.jpg"/>
<img src="2.jpg"/>
<img src="3.jpg"/>
<img src="4.jpg"/>
</div> <script type='text/javascript' src="jquery-1.11.3.min.js"></script>
<script type='text/javascript' src="../src/bobenut.curtain.jquery.js"></script>
<script type='text/javascript'>
$('#curtain').curtain();
</script>
</body>
</html>

通过JQuery选择了包含图片的div后直接调用即可。

$('#curtain').curtain();

框架写完了,接下去进入初始化环节。

初始化包括:初始化尺寸、动画容器、被切换的图片,各个窗帘条的生成,默认背景,切换时用到的时间参数。

这些个初始化操作写在一个函数里显然会比较庞大,而且未来需要增加的功能都要动这么一个函数,显然不明智,那么就把他们按照初始化的职能进行拆分。

那么这么多初始化函数的调用就成了问题,难道要硬写每个函数进行独立调用?显然这种方式是很low的。

像这样每个函数都是具备相同的输入参数,都没有返回结果,那么可以说是相同形态的,可以采用迭代器设计模式进行调用。

所谓的迭代器就是顺序访问各元素,并且不用关心各元素的细节,其实就是循环访问,对于这些个初始化函数的调用我们就可以采用迭代器模式进行调用,下面各函数定义完后进行迭代器模式的调用。

初始化的结果肯定要找地方放,作为基本的环境上下文context供给后面的切换使用。

在本插件模块中定义个模块级的变量context。

所有初始化的结果都保存在context中。

var context = {};

接下来是各个初始化操作函数

1)初始化容器

    function initContainer(options) {
context.$container = options.$container;
}

容器就是包含一组图片的div,options是调用时传递进来的参数,因为这里的container是用jquery选择来的,所以加个$以示区分。

2)初始化尺寸

    function initSize(options) {
context.stripCount = options.stripCount;
context.containerWidth = options.width.replace('px', '');
context.containerHeight = options.height.replace('px', '');
context.stripWidth = context.containerWidth / context.stripCount;
context.stripHeight = context.containerHeight;
}

获取容器的大小,计算strip的大小。

3)初始化容器内的所有图片

    function initImgs(options) {
context.imgSrcs = [];
context.$container.children().each(function (index, element) {
var $element = $(element);
$element.css('display', 'none');
context.imgSrcs.push($element.attr('src'));
}); context._imgCurrentIndex = 0;
context.nextImgSrc = function () {
if (++context._imgCurrentIndex > context.imgSrcs.length - 1) {
context._imgCurrentIndex = 0;
} return context.imgSrcs[context._imgCurrentIndex];
};
}

一上来了把需要切换的图片全部隐藏,并把他们的url保存在数组中以便于切换时使用。

提供一个获取下一张图片url的方法,使得在切换时能方便获取下一张图片的url。

4)初始化strip

    function initStrips(options) {
context.$strips = [];
for (var i = 0; i < context.stripCount; i++) {
var $strip = jquery('<div></div>');
$strip.css('background-size', context.containerWidth + 'px ' + context.containerHeight + 'px');
$strip.css('background-position-x', i * context.stripWidth * -1 + 'px');
$strip.css('background-position-y', '0px');
$strip.css('background-repeat', 'no-repeat');
$strip.css('position', 'absolute');
$strip.css('left', (i * context.stripWidth) + 'px');
$strip.css('top', context.stripHeight + 'px');
$strip.css('width', context.stripWidth + 'px');
$strip.css('height', context.stripHeight + 'px');
$strip.css('display', 'block');
$strip.css('overflow', 'hidden');
$strip.css('zoom', '1');
context.$strips.push($strip);
context.$container.append($strip);
}
}

生成所有的strip,给她们设置默认的大小,将要切换的图设成背景图,通过background-position-x和y调整背景图的显示位置,然后将strip保存于数组中便于使用。

5)初始化默认背景

    function initDefaultBackground() {
context.$container.css('background-image', 'url(' + context.imgSrcs[0] + ')');
context.$container.css('background-size', context.containerWidth + 'px ' + context.containerHeight + 'px');
}

默认将第一张图片作为容器的背景。

6)初始化切换时间参数

    function initTime(options) {
context.interval = options.interval;
context.baseDelay = options.baseDelay;
context.delayIncrement = options.delayIncrement;
}

设置前后图片的切换标准间隔时间interval,切换时每个strip的切换延迟时间和延迟增量时间。

各个初始化函数完成,接下来采用迭代器模式对各个初始化函数进行调用。

    function init(options) {
var initFuncs = [initContainer, initSize, initImgs, initStrips, initDefaultBackground, initTime];
for (var i = 0, f; f = initFuncs[i++];) {
f(options);
}
}

在这里,按照各初始化函数的优先级,把他们放到一个数组中,通过循环这个数组,对每一个函数进行调用,好处就是,新加一个初始化函数的时候,只需往数组的末尾添加即可,甚至可以把初始化函数数组定义到外部,这样,init函数就符合开闭原则了。

jquery有一种更高大上的迭代处理方法就是each,那么就对init函数略加修改。

    function init(options) {
var initFuncs = [initContainer, initSize, initImgs, initStrips, initDefaultBackground, initTime];
jquery.each(initFuncs,function(i,f){
f(options);
});
}

each函数的第一个参数是被迭代的对象或数组,第二个参数是迭代每一个元素时的处理回调函数,好处就是,循环的事您就别管了,只关心处理。

至此,初始化函数的定义完成。

为了完成init函数的调用,需要考虑生成默认的options,因为外部可以不传递任何参数。

然后完成对init函数的调用。

    function setDefaultOptions(options, $container) {
options = options || {};
options.$container = $container;
options.width = options.width || '800px';
options.height = options.height || '600px';
options.stripCount = options.stripCount || 10;
options.interval = options.interval || 2;
options.baseDelay = options.baseDelay || 400;
options.delayIncrement = options.delayIncrement || 80; return options;
} jquery.fn.curtain = function (options) { init(setDefaultOptions(options, this));

}

通过setDefaultOptions函数负责确保各个必须的参数都有默认值。

然后将规整过的options作为init的输入,对init函数进行调用。

至此,通过迭代器的设计模式完成了各个初始化函数的定义和调用。

下一篇继续:《javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

代码:

javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)的更多相关文章

  1. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  2. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  3. jquery插件jquery.LightBox.js之点击放大图片并左右点击切换图片(仿相册插件)

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的点击放大图片并左右点击切换图片的效果,您可以根据自己的实 ...

  4. javascript---简介的切换图片效果。

    <!--切换图片--> <img src="img/9.gif" alt="" id="img"> <butt ...

  5. Go语言设计模式实践:迭代器(Iterator)

    关于本系列 决定开个新坑. 这个系列首先是关于Go语言实践的.在项目中实际使用Go语言也有段时间了,一个体会就是不论是官方文档.图书还是网络资料,关于Go语言惯用法(idiom)的介绍都比较少,基本只 ...

  6. javascript设计模式实践之策略模式--输入验证

    策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...

  7. javascript设计模式实践之代理模式--图片预加载

    图片的预加载就是在加载大图片前,先显示一个loading.gif,就算在网络比较慢的时候也能让人知道正在加载,总比啥反应都没有强. 下面这段代码就是预加载的一个简单的实现,假设先不处理加载图片时的on ...

  8. javascript设计模式学习之七——迭代器模式

    一.迭代器模式定义 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,并且不需要暴露该对象的内部表示. 在当前大部分语言中,都已经内置了迭代器模式.迭代器有内部迭代器和外部迭代器之分,一般现有语 ...

  9. javascript 设计模式实践之策略模式--输入验证

    博客地址:http://www.cnblogs.com/kongxianghai/p/4985122.html,写的挺好的推荐下!

随机推荐

  1. Nova PhoneGap框架 第三章 页面

    页面在项目架构中是一个很重要的概念,它让我们能够将一个功能复杂的项目拆分成一个一个功能比较独立的小区域,这极大的提高了代码的可读性和可维护性. 在我们这个框架中,一个页面由JS和HTML两部分组成,首 ...

  2. C语言 · 2的次幂表示

    问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...

  3. pl/sql里的exists和in的差别

    项目中有个需要需要如下pl/sql(数据库是MariaDB) ) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21' ,,) ) ...

  4. [Hadoop大数据]——Hive部署入门教程

    Hive是为了解决hadoop中mapreduce编写困难,提供给熟悉sql的人使用的.只要你对SQL有一定的了解,就能通过Hive写出mapreduce的程序,而不需要去学习hadoop中的api. ...

  5. Solr的原理及在项目中的使用实例.

    前面已经讲过 如果安装及配置Solr服务器了, 那么现在我们就来正式在代码中使用Solr.1,这里Solr主要是怎么使用的呢?  当我们在前台页面搜索商品名称关键词时, 我们这时是在Solr库中去查找 ...

  6. Android笔记——eclipse快捷键

    查看快捷键定义的地方 Window->Preferences->General->Keys. 编辑相关快捷键 1. [ALT+/] 自动提示方法 此快捷键为用户编辑的好帮手,能为用户 ...

  7. VS中行号对齐的辅助线(虚线)去除

    3张图 2 3

  8. Spring(二)scope、集合注入、自动装配、生命周期

    原文链接:http://www.orlion.ga/189/ 一.scope bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象) 例: ...

  9. AngularJS之Directive(三)

    前言 angular核心部分如下图几大块,最重要的莫过于指令这一部分,本文将重点讲解指令这一部分,后续笔者将通过陆续的学习来叙述其他如:factory.service等,若有叙述错误之处,欢迎各位指正 ...

  10. 手动实现jQuery Tools里面tab功能

    平时开发中用的Javascript类库都是jQuery,用到插件或者第三方类库能从jQuery Tools里面找到,基本不用其他的.当然有时同事喜欢使用jQuery UI里面的插件.并且jQuery ...