首頁經常是需要一個焦點圖切換的效果,最近做的項目也正好需要,所以在網上搜索,後面查到了一個半成品的插件,這裡我自己修改了一下。
js資料夾下面有兩個資料夾jquery.jslide.js與jquery.jslides.js,前面有一個是我改寫的,第二個是原作者的檔案。下圖是效果圖:
一、靜態效果
<div class="slide_wrap"> <ul id="slides2" class="slide"> <li style="background:url('images/01.jpg') no-repeat center top"><a href="http://www.jb51.net/" target="_blank">pwstrick1</a></li> <li style="background:url('images/02.jpg') no-repeat center top"><a href="http://www.jb51.net/" target="_blank">pwstrick2</a></li> <li style="background:url('images/03.jpg') no-repeat center top"><a href="http://www.jb51.net/" target="_blank">pwstrick3</a></li> <li style="background:url('images/04.jpg') no-repeat center top"><a href="http://www.jb51.net/" target="_blank">pwstrick4</a></li> </ul> </div>
2.最外面套個slide_wrap用來做限制裡面圖片的絕對定位
3.ul中的class原先我是在插件初始化的時候添加上去的,現在我預先就加上了,顯示效果比後面添加要好一點,大家可以在改寫插件的時候做修改
.slide_wrap {width:100%;height:400px;position:relative} .slide_wrap .slide { display:block; width:100%; height:400px; list-style:none; padding:0; margin:0; position:relative;} .slide_wrap .slide li { display:block; width:100%; height:100%; list-style:none; padding:0; margin:0; position:absolute;} .slide_wrap .slide li a { display:block; width:100%; height:100%; text-indent:-9999px;} .slide_wrap .pagination { display:block; list-style:none; position:absolute; left:50%; top:340px; z-index:9900;padding:5px 15px 5px 0; margin:0} .slide_wrap .pagination li { display:block; list-style:none; width:10px; height:10px; float:left;margin-left:15px; border-radius:5px; background:#FFF } .slide_wrap .pagination li a { display:block; width:100%; height:100%; padding:0; margin:0; text-indent:-9999px;outline:0} .slide_wrap .pagination li.current { background:#0092CE}
1、slide_wrap與slide中的height屬性可以依實際情況修改
2、pagination是圖中的按鈕樣式,用來控制顯示第幾張圖,也是絕對定位left與top可以依實際情況修改
3、樣式中的各個顏色也可以依照想要的效果做個人化修改
4、上面的樣式寫的有點囉嗦,在嵌入自己的項目中,可以適當精簡
二、呼叫方式
<script type="text/javascript"> $('#slides2').jslide(); </script>
1、將ul設定成焦點圖插件
2、下面的各個操作都將圍繞著ul轉
三、jQuery外掛通用格式
;(function (factory) { 'use strict'; // Register as an AMD module, compatible with script loaders like RequireJS. if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else { factory(jQuery); } }(function ($, undefined) { 'use strict'; //中间插件代码 $.fn.jslide = function (method) { return _init.apply(this, arguments); }; }));
1、第一個分號是為了防止在與其他程式碼壓縮在一起的時候合在一行中,這樣會出現語法錯誤。例如var i=0(function(factory){......}(..);
2、'use strict'是開啟嚴格模式,讓Javascript解釋器可以用"嚴格"的語法來解析程式碼,以幫助開發人員發現錯誤
3.如果使用了requirejs模組載入框架,define(['jquery'], factory)這句話就是讓插件支援AMD規範
4、function ($, undefined) 這裡面的undefined是為了防止在引入其他js檔案的時候,使用被重寫了的undefined
5、_init是用來初始化效果
四、外掛初始化
var defaults = { speed : 3000, pageCss : 'pagination', auto: true //自动切换 }; var nowImage = 0;//现在是哪张图片 var pause = false;//暂停 var autoMethod; /** * @method private * @name _init * @description Initializes plugin * @param opts [object] "Initialization options" */ function _init(opts) { opts = $.extend({}, defaults, opts || {}); // Apply to each element var $items = $(this); for (var i = 0, count = $items.length; i < count; i++) { _build($items.eq(i), opts); } return $items; }
1、defaults是暴露出來的自訂參數,這裡我就寫了三個自動切換的速度、選擇按鈕樣式、是否自動化
2、三個全域參數,nowImage是目前顯示圖片的序號、pause是控制圖片是切換還是暫停,autoMethod是定時函數的編號
3、_init中有合併自訂參數,呼叫_build做建立操作
五、建立外掛各個操作
/** * @method private * @name _getSlides * @description 获取幻灯片对象 * @param $node [jQuery object] "目标对象" */ function _getSlides($node) { return $node.children('li'); } /** * @method private * @name _build * @description Builds each instance * @param $node [jQuery object] "目标对象" * @param opts [object] "插件参数" */ function _build($node, opts) { var $slides = _getSlides($node); $slides.eq(0).siblings('li').css({'display':'none'}); var numpic = $slides.size() - 1; $node.delegate('li', 'mouseenter', function() { pause = true;//暂停轮播 clearInterval(autoMethod); }).delegate('li', 'mouseleave', function() { pause = false; autoMethod = setInterval(function() { _auto($slides, $pages, opts); }, opts.speed); }); //console.log(autoMethod) var $pages = _pagination($node, opts, numpic); if(opts.auto) { autoMethod = setInterval(function() { _auto($slides, $pages, opts); }, opts.speed); } }
1、_getSlides用來取得ul這個物件的li子標籤,ul也就是這個焦點圖插件
2、將除了第一個li標籤,其他標籤設定為隱藏
3、取得切換圖片的數量,由於後面做循環是從下標0開始,做
4、為li標籤設定mouseenter與mouseleave的事件,分別是取消循環與繼續循環
5、初始化選擇按鈕
6、參數auto如果為true,就啟動自動切換
六、初始化選擇鈕
/** * @method private * @name _pagination * @description 初始化选择按钮 * @param $node [jQuery object] "目标对象" * @param opts [Object] "参数" * @param size [int] "图片数量" */ function _pagination($node, opts, size) { var $ul = $('<ul>', {'class': opts.pageCss}); for(var i = 0; i <= size; i++){ $ul.append('<li>' + '<a href="javascript:void(0)">' + (i+1) + '</a>' + '</li>'); } $ul.children(':first').addClass('current');//给第一个按钮选中样式 var $pages = $ul.children('li'); $ul.delegate('li', 'click', function() {//绑定click事件 var changenow = $(this).index(); _changePage($pages, $node, changenow); }).delegate('li', 'mouseenter', function() { pause = true;//暂停轮播 }).delegate('li', 'mouseleave', function() { pause = false; }); $node.after($ul); return $pages; }
1、動態新增按鈕ul標籤,賦上一個自訂class,將子標籤li加上
2、將第一個按鈕加上選取樣式
3、為li標籤加上click、mouseenter與mouseleave的事件,click事件綁定切換操作
4、把分頁按鈕放到外掛程式物件ul的後面
5、返回分頁按鈕中的li對象,後面有用的
七、切換圖片
/** * @method private * @name _change * @description 幻灯片显示与影藏 * @param $slides [jQuery object] "图片对象" * @param $pages [jQuery object] "按钮对象" * @param next [int] "要显示的下一个序号" */ function _fadeinout($slides, $pages, next){ $slides.eq(nowImage).css('z-index','2'); $slides.eq(next).css({'z-index':'1'}).show(); $pages.eq(next).addClass('current').siblings().removeClass('current'); $slides.eq(nowImage).fadeOut(400, function(){ $slides.eq(next).fadeIn(500); }); }
1、將目前的圖片z-index加大,下一張圖片的z-index也加大,顯示下一張圖,這樣能做出一種漸變的效果,不加的話就會是很生硬的切換
2、選擇按鈕的下一個增加選取樣式
3、應用jQuery的fadeOut與fadeIn做隱藏與顯示的漸變特效
八、自動循環
/** * @method private * @name _auto * @description 自动轮播 * @param $slides [jQuery object] "图片对象" * @param $pages [jQuery object] "按钮对象" * @param opts [Object] "参数" */ function _auto($slides, $pages, opts){ var next = nowImage + 1; var size = $slides.size() - 1; if(!pause) { if(nowImage >= size){ next = 0; } _fadeinout($slides, $pages, next); if(nowImage < size){ nowImage += 1; }else { nowImage = 0; } }else { clearInterval(autoMethod);//暂停的时候就取消自动切换 } }
1、判斷是暫停還是繼續輪播
2、如果不是暫停,就依照條件做目前頁與下一個按鈕的序號設定
插件還有很多問題,例如不能在一個頁面綁定兩個不同的對象,還有巨大的修改空間。
透過這次的修改,自己有了一個可以控制的焦點圖切換插件,雖然還有很多問題但可以一步一步解決。以後嵌入自己的專案中,修改起來也方便很多。