JS图片切换大集合

利用周末2天把JS图片切换常见效果封装了下,比如:轮播,显示隐藏,淡入淡出等。废话不多说,直接看效果吧!JSFiddler链接如下:

想看JS轮播切换效果请点击我!

当然由于上传图片时候 png图片自动转换成jpg 所以左右按钮有透明,但是也没有关系,我们最主要的是看看效果是什么样的,至于图片大家可以替换。下面看看默认配置项吧!

  container
'',     外层容器 必填项 默认为空
 contentCls  '.list',     内容所在的容器 默认为'.list'
 prev  '.prev'   上一页按钮 如果没有的话 不配置 默认为'.prev'
 next  '.next'    上一页按钮 如果没有的话 不配置 默认为'.next'
triggerType  'mouseover' ,   触发类型 默认为'mouseover'
 on  'select' ,             当前被选中的class类 默认为'select'
type  'x' ,             轮换类型 轮换效果类型。可设置为:"x"|"y"|"fade"|"toggle | animate"  x为横向滚动 y为纵向滚动,fade为淡入淡出效果 toggle为显示隐藏效果,animate为动画效果(类似于fade效果)
speed  800 ,             切换速度(单位:毫秒)
time  5000,             自动轮换间隔时间(单位:毫秒)
auto  true,             是否自动轮播(boolean布尔型) 默认为true
numBtn  true ,            是否需要数字按钮(boolean|布尔型) 默认为true
switchTo  0 ,                切换到第几项 默认为第一项
pauseOnHover  true ,            鼠标移到容器里面是否停止滚动 默认停止
circular  true ,            是否循环切换(boolean|布尔型) 默认为true
markupType  0 ,            可取0或者其他数字 默认为0 如果是其他数字的话 可以稍微自定义下(默认情况下不需要做任何改动,如果想自定义的话,可以设置,比如:双轮播效果,左边有1,2,3,4数字,右边有5,6,7,8数字效果)。
triggerCls  ''    触发class 一般情况下不需要配置 当markupType不为0的时候 需要配置类名class

如上面配置:都有注释,其中markupType 和 triggerCls 2个配置项是针对扩展性轮播而做的配置项,比如如下这种轮播效果,可以通过这2个配置项来设置,如下图所示:

1. 其他的单轮播 一般情况下可以不需要这2个配置项,当然你为了扩展性,也可以加上这2个 切忌:markupType 不为0才生效,当然一般情况下希望能设置数字 其实字符串也可以,但是一般情况下用数字吧!

2. 目前支持的轮播类型有5种,其一:x类型是指 "横向滚动" 其二:y类型是指: "纵向滚动" 其三:'toggle'类型 是指 "显示隐藏"效果, 其四:"fade"类型 是指"淡入淡出"效果,其五:'animate'类型 是动画透明效果(和fade类型效果差不多)。

3. 在做纵向滚动时候 在IE7下 注意有个小小的bug 每个li纵向有3px间隙 需要在li加display:inline可以解决,其他的浏览器不需要(包括IE6).

4. 实例化new的时候 有2个参数 其一是cfg对象,可以以对象的方式传参数,其二是callbck回调函数。此回调是切换到第几项的时候的回调。

5. 数字按钮支持自定义 比如我自己可以在代码上加,5,6,7,8,而不是1,2,3,4,一般情况下 数字1,2,3,4按钮是根据图片的多少来自动生成,其中css样式要自己写。

如下代码:

  1. <ul class="ks-switchable-nav">
  2. <li>5</li>
  3. <li>6</li>
  4. <li>7</li>
  5. <li>8</li>
  6. <li>9</li>
  7. </ul>

切记:菜单项容器ul类一定要有 ks-switchable-nav 这个类名。且内容外部容器都用ul li来写代码 不要用div 因为我JS代码直接根据容器下的li来获取dom节点的,没有根据某个class来获取(因为当初考虑,我不想在某项下面都加一个class,代码看起来也不怎么好看),所以内容项对html代码有要求的 要想实现效果 内容项都用ul或者ol li标签来写代码。

下面是所有的JS代码如下:

  1. /**
  2. * JS switchable图片切换集合
  3. * @class Switchable
  4. * @author tugenhua
  5. * @param {object}
  6. */
  7.  
  8. function Switchable(cfg,callback) {
  9. var self = this;
  10. self.cfg = $.extend({},defaults,cfg || {});
  11. self.index = 0;
  12. self.callback = callback;
  13. self._init();
  14. // 绑定事件
  15. self._bindEnv();
  16. }
  17. $.extend(Switchable.prototype,{
  18.  
  19. /*
  20. * 初始化 是否生成数字按钮等事件操作
  21. */
  22. _init: function(){
  23. var self = this;
  24. var cfg = self.cfg;
  25. if(cfg.container == '') {return;}
  26. var containerWidth = $(cfg.container).width(),
  27. listLens = $(cfg.contentCls + ' li',cfg.container).length,
  28. navCls = $('.ks-switchable-nav li',$(cfg.container)),
  29. html = '';
  30. if(cfg.markupType == 0) {
  31. if(navCls.length <= 0 && listLens > 0 && cfg.numBtn) {
  32. navCls = $('<ul class="ks-switchable-nav"></ul>');
  33. $(cfg.container).append(navCls);
  34. for(var i = 1; i <= listLens; i+=1) {
  35. html += '<li class="slide_'+i+'">'+i+'</li>';
  36. }
  37. $('.ks-switchable-nav',$(cfg.container)).html(html);
  38. }
  39. }
  40.  
  41. $(cfg.contentCls,$(cfg.container)).css('position','relative');
  42.  
  43. if(cfg.switchTo > 0) {
  44. self._currentItem(cfg.switchTo);
  45. self.index = cfg.switchTo;
  46. self._goto(self.index);
  47. }else {
  48. self._currentItem(self.index);
  49. // 开始轮播函数
  50. self._start(self.index);
  51. }
  52. },
  53. /*
  54. * 开始轮播
  55. * @method _start {private}
  56. */
  57. _start: function(index){
  58. var self = this,
  59. cfg = self.cfg;
  60. if(!cfg.auto) {return;}
  61. self._off();
  62. self.timer = setTimeout(function(){
  63. self._goto(index);
  64. },cfg.time);
  65. },
  66. /*
  67. * 轮播停止
  68. * @method _off {private}
  69. */
  70. _off: function(){
  71. var self = this;
  72. if(self.timer !== 'undefined') {
  73. clearTimeout(self.timer);
  74. }
  75. },
  76. /*
  77. * 具体轮播到第几项
  78. * @method _goto {private}
  79. */
  80. _goto: function(index){
  81. var self = this,
  82. cfg = self.cfg,
  83. container = $(cfg.container);
  84. self._off();
  85. self.index = parseInt(index,10);
  86. var elemWidth = $(cfg.contentCls + ' li',container).width(),
  87. elemHeight = $(cfg.contentCls + ' li',container).height(),
  88. listLens = $(cfg.contentCls + ' li',container).length,
  89. triggerCls = $(cfg.triggerCls,container).length;
  90. var _moveVal;
  91.  
  92. switch(cfg.type) {
  93.  
  94. case "x":
  95. _moveVal = -(elemWidth * self.index);
  96. self._currentItem(self.index);
  97. $(cfg.contentCls,container).stop(true,false).animate({"left":_moveVal},cfg.speed);
  98. break;
  99.  
  100. case "y":
  101. _moveVal = -(elemHeight * self.index);
  102. self._currentItem(self.index);
  103. $(cfg.contentCls,container).stop(true,false).animate({"top":_moveVal},cfg.speed);
  104. break;
  105.  
  106. case "toggle":
  107. self._currentItem(self.index);
  108. $(cfg.contentCls+ ' li',container).eq(self.index).show().siblings().hide();
  109. break;
  110.  
  111. case "fade":
  112. self._currentItem(self.index);
  113. $(cfg.contentCls+ ' li',container).css({"display":"none","position":"absolute","top":0,"left":0,"zIndex":""});
  114. $(cfg.contentCls+ ' li',container).fadeOut(cfg.speed).parent().children().eq(self.index).fadeIn(cfg.speed);
  115. break;
  116.  
  117. case "animate":
  118. self._currentItem(self.index);
  119. $(cfg.contentCls+ ' li',container).css({"position":"absolute","top":0,"left":0,"zIndex":"1"});
  120. $(cfg.contentCls+ ' li',container).parent().children().eq(self.index).css({opacity: 0.0, "z-index": 10}).animate({opacity: 1.0}, cfg.speed, function(){});
  121. break;
  122. }
  123. self.callback && $.isFunction(self.callback) && self.callback(self);
  124.  
  125. if(cfg.auto) {
  126. self.index++;
  127. if(self.index == listLens) {
  128. if(!cfg.circular) {
  129. return;
  130. }
  131. self.index = 0;
  132. }else if(triggerCls > 0 && self.index == triggerCls) {
  133. if(!cfg.circular) {
  134. return;
  135. }
  136. self.index = 0;
  137. }
  138. self._start(self.index);
  139. }
  140. },
  141. /*
  142. * 选中当前的项
  143. * @method _currentItem {private}
  144. * @param {n} 当前的索引
  145. */
  146. _currentItem: function(n) {
  147. var self = this,
  148. cfg = self.cfg;
  149. var numBtns;
  150. if(cfg.markupType == 0) {
  151. if($('.ks-switchable-nav',$(cfg.container)).length > 0) {
  152. numBtns = $('.ks-switchable-nav li',$(cfg.container));
  153. !numBtns.eq(n).hasClass(cfg.on) &&
  154. numBtns.eq(n).addClass(cfg.on).siblings().removeClass(cfg.on);
  155. }
  156. }else {
  157. if($(cfg.triggerCls,$(cfg.container)).length > 0) {
  158. numBtns = $(cfg.triggerCls,$(cfg.container));
  159. $.each(numBtns,function(){
  160. $(this).removeClass(cfg.on);
  161. });
  162. !numBtns.eq(n).hasClass(cfg.on) &&
  163. numBtns.eq(n).addClass(cfg.on).siblings().removeClass(cfg.on);
  164. }
  165. }
  166. if($(cfg.contentCls,$(cfg.container)).length > 0) {
  167. var contents = $(cfg.contentCls + ' li',$(cfg.container));
  168. !contents.eq(n).hasClass('isSelected') &&
  169. contents.eq(n).addClass('isSelected').siblings().removeClass('isSelected');
  170. }
  171. },
  172. /*
  173. * 绑定所有的事件
  174. * @method _bindEnv {private}
  175. */
  176. _bindEnv: function(){
  177. var self = this,
  178. cfg = self.cfg;
  179. var container = $(cfg.container),
  180. prev = $(cfg.prev,container),
  181. next = $(cfg.next,container),
  182. listLens = $(cfg.contentCls + ' li',container).length;
  183. navCls = $('.ks-switchable-nav li',container),
  184. triggerCls = $(cfg.triggerCls,container);
  185.  
  186. // 上一页按钮 prev
  187. if(prev.length > 0) {
  188. $(prev,container).unbind('click').bind('click',function(e){
  189.  
  190. self.index = self.getSelectedItem();
  191. self.index--;
  192. if(self.index < 0) {
  193. if(!cfg.circular) {
  194. return;
  195. }
  196. self.index = listLens - 1;
  197. }
  198. self._goto(self.index);
  199. });
  200.  
  201. }
  202.  
  203. // 下一页按钮 next
  204. if(next.length > 0) {
  205. $(next,container).unbind('click').bind('click',function(e){
  206.  
  207. self.index = self.getSelectedItem();
  208. self.index++;
  209. if(self.index >= listLens) {
  210. if(!cfg.circular) {
  211. return;
  212. }
  213. self.index = 0;
  214. }
  215. self._goto(self.index);
  216. });
  217. }
  218.  
  219. // 数字按钮
  220. if(cfg.markupType == 0){
  221. if(navCls.length > 0) {
  222. container.on(cfg.triggerType,'.ks-switchable-nav li',function(e){
  223. // 重新获取下navCls 因为如果不重新获取下,当页面上有多个的情况下 会有问题
  224. var target = e.target,
  225. targetParent = $(target).closest(container),
  226. navCls = $('.ks-switchable-nav li',container);
  227. var n = navCls.index(target);
  228. self.index = n;
  229. self._goto(self.index);
  230. self._off();
  231. });
  232. }
  233. }else {
  234. if(triggerCls.length > 0) {
  235. container.on(cfg.triggerType,cfg.triggerCls,function(e){
  236. // 重新获取下navCls 因为如果不重新获取下,当页面上有多个的情况下 会有问题
  237. var target = e.target,
  238. targetParent = $(target).closest(container),
  239. triggerCls = $(cfg.triggerCls,container);
  240. var n = triggerCls.index(target);
  241. self.index = n;
  242. self._goto(self.index);
  243. self._off();
  244. });
  245. }
  246. }
  247. // 鼠标移到容器里面是否暂停 默认为true
  248. if(cfg.pauseOnHover) {
  249. $(cfg.container).hover(function(e){
  250. self._off();
  251. },function(){
  252. if(!cfg.circular) {
  253. return;
  254. }
  255. self._start(self.index);
  256. });
  257. }
  258.  
  259. },
  260. /*
  261. * 当前第几项被选中了
  262. * @method getSelectedItem
  263. * @return {index} 当前选中的索引
  264. */
  265. getSelectedItem: function(){
  266. var self = this,
  267. cfg = self.cfg;
  268. var navcls = $(cfg.contentCls + ' li',$(cfg.container));
  269. for(var i = 0; i < navcls.length; i++) {
  270. if($(navcls[i]).hasClass('isSelected')) {
  271. return i;
  272. }
  273. }
  274. return -1;
  275. }
  276.  
  277. });
  278. var defaults = {
  279. container : '', // 容器 必填
  280. contentCls : '.list',
  281. prev : '.prev', // 上一页按钮
  282. next : '.next', // 下一页按钮
  283. triggerType : "mouseover", // 触发类型
  284. on : 'select', // 当前的class
  285. type : "x", // 轮换类型 轮换效果类型。可设置为:"x"|"y"|"fade"|"toggle"
  286. speed : 800, // 切换速度
  287. time : 5000, // 自动轮换间隔时间
  288. auto : true, // 是否自动轮播
  289. numBtn : true, // 是否使用数字按钮
  290. switchTo : 2, // 默认切换到第一项
  291. pauseOnHover : true, // 鼠标移到是否停顿
  292. circular : true, // 是否循环切换, 默认为 true
  293. markupType : 0, // 可取0或者其他数字 默认为0 如果是其他数字的话 可以稍微自定义下
  294. triggerCls : '.j-slide' // 触发class 一般情况下不需要配置 当markupType为1的时候 需要配置
  295. };

JS代码初始化如下:

  1. // 横向滚动初始化
  2. new Switchable({
  3. 'container': '#slide_x',
  4. 'auto':false
  5. },function(self){
  6. //console.log(self.index);
  7. });
  8. // 纵向滚动初始化代码
  9. new Switchable({
  10. 'container': '#slide_y',
  11. 'type':'y',
  12. 'switchTo':0
  13. },function(self){
  14.  
  15. });
  16. // fadeIn效果
  17. new Switchable({
  18. 'container': '#slide_z',
  19. 'type':'fade',
  20. 'speed':600
  21. },function(self){
  22.  
  23. });
  24.  
  25. // fadeIn平滑点效果
  26. new Switchable({
  27. 'container': '#slide_zz',
  28. 'type':'animate',
  29. 'speed':600
  30. },function(self){
  31.  
  32. });
  33.  
  34. // 隐藏显示效果
  35. new Switchable({
  36. 'container': '#slide_show',
  37. 'type':'toggle',
  38. 'speed':600
  39. },function(self){
  40.  
  41. });
  42.  
  43. // 双轮播fadeIn平滑点效果
  44. new Switchable({
  45. 'container': '#slide',
  46. 'type':'fade',
  47. 'speed':600,
  48. 'markupType':1,
  49. 'switchTo':0,
  50. 'contentCls':'.slideContent'
  51. },function(self){
  52.  
  53. });
  54.  
  55. // 我是双轮播隐藏显示效果
  56. new Switchable({
  57. 'container': '#slide2',
  58. 'type':'toggle',
  59. 'speed':600,
  60. 'markupType':1,
  61. 'switchTo':0,
  62. 'contentCls':'.slideContent'
  63. },function(self){
  64.  
  65. });

HTML和css代码我就不贴了,下面我会提供demo下载的 或者直接看上面的JSfiddler链接效果。

图片轮播demo下载

JS图片Switchable切换大集合的更多相关文章

  1. 微信小程序Tab选项卡切换大集合

    代码地址如下:http://www.demodashi.com/demo/14028.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  2. js图片随机切换

    使用js做到随机切换图片 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. JS获取宽度高度大集合

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  4. js实现图片自动切换效果。

    js实现图片自动切换效果,简单实用,原谅我只是一只小菜鸟还在学大神天天写博文装逼. <script language="javascript"> setInterval ...

  5. 原生js+css3实现图片自动切换,图片轮播

    运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...

  6. JS图片自动和可控的轮播切换特效

    点击这里查看效果:http://hovertree.com/texiao/js/1.htm HTML文件代码如下: <!DOCTYPE html> <html xmlns=" ...

  7. 原生JS—实现图片循环切换的两种方法

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...

  8. 原生JS—实现图片循环切换及监测鼠标滚动切换图片

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法以及如何检测鼠标滚动循环切换图片.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们 ...

  9. JS框架_(JQuery.js)图片相册掀开切换效果

    百度云盘 传送门 密码:y0dk 图片掀开切换效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...

随机推荐

  1. 理解JVM之垃圾收集器概述

    前言 很多人将垃圾收集(Garbage Collection)视为Java的伴生产物,实际1960年诞生的Lisp是第一门真正使用内存动态分配与垃圾手机技术的语言.在目前看来,内存的动态分配与内存回收 ...

  2. js实现禁止右键 禁止f12 查看源代码

    document.oncontextmenu = function () { return false; }; document.onkeydown = function () { if (windo ...

  3. 使用ThinkPHP实现生成缩略图及显示

    首先了解父类Image.class.php(ThinkPHP/Library/Think/Image.class.php)中的一些函数 1:open() 打开被处理的图片 2:thumb() 生成缩略 ...

  4. php中0与’0’的区别

    首先php中0与'0',转化后值相等,但是类型不同: php是一种弱类型的语句,他的变量.字符定义其实并不十分规范,比如 $a = '4′;我们可以说这个$a是一个字符,但是他又可以直接进行数字的加减 ...

  5. js-设计模式学习笔记-策略模式

    策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换(相互替换:表现为它们具有相同的目标和意图). 策略模式的目的是讲算法的使用与算法的实现分离开来. 一个基于策略模式的程 ...

  6. MonkeyRunner进坑——errors importing other modules

    后知后觉,刚知道Android提供了MonkeyRunner这么个东西,能用来干嘛呢,官方文档介绍得很清楚.简单说,可以用Python程序通过API, installs an Android appl ...

  7. AndroidStudio 3.0升级之compile、implementation简要说明

    1.现象 androidStudio 升级至3.0后 之前引用库所使用的complie默认变成implementation 如以下: 3.0之前 compile 'io.reactivex.rxjav ...

  8. 脚本设置IP bat 命令行设置自动获取IP和固定IP

    由于办公室网络需要固定IP和DNS才能上网, 在连接公共网络或者家里又需要自动获取IP和DNS才能上网. 频繁手动切换很麻烦,就搞了两个脚本一键设置. 1.新建文本文件, 命名为固定IP.bat 复制 ...

  9. sql server中quotename()函数的用法(转载)

    操作sql server尤其是写存储过程时,要用到各种各样的函数,今天就总结一个quotename()的用法.1.语法: quotename('character_string'[,'quote_ch ...

  10. python自学——集合

    #皇城根儿#集合:是无序的.不重复的:1.去重:2.关系测试#创建集合#创建数字集合number=set([1,3,5,7,9]) #数字型集合str_type=set(["im" ...