jquery輪播的實(shí)現(xiàn)方式 附完整實(shí)例
本文實(shí)例為大家分享了jquery輪播實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下
1.閃現(xiàn)方式的輪播
不論述,實(shí)現(xiàn)比較簡單,效果也比較好
2.滑動輪播
以下面的html代碼為例(向左滑動)
<div class="example" style="overflow: hidden; width: 266px;"> <ul style="width: 798px; float: left; height: 216px; margin-left: 0px;"> <li style="width: 266px; float: left; height: 216px;"></li> <li style="width: 266px; float: left; height: 216px;"></li> <li style="width: 266px; float: left; height: 216px;"></li> </ul> </div>
插件源碼:實(shí)現(xiàn)向左和向上輪播,手動切換也是向左和向上切換(手動切換關(guān)鍵源碼)
var all = $panel.find('>li'), prevAll = new Array(); prevAll[0] = all.eq(0); //將目標(biāo)節(jié)點(diǎn)前的所有節(jié)點(diǎn)都保存到prevAll中,動畫結(jié)束后將這些節(jié)點(diǎn)一一按順序加到容器的后面 for(var i = 1; i < len; i++){ all.eq(i).css({display: 'none'}); prevAll[i] = all.eq(i); } ... $panel.animate({ 'marginLeft': -options.width + 'px' }, options.duration, function() { for(var i = 0; i < prevAll.length; i++){ $panel.append($(prevAll[i]).css({display: 'block'})); //將當(dāng)前展示節(jié)點(diǎn)前的所有節(jié)點(diǎn)都加載到最后 } $panel.css({ marginLeft: 0 }); })
滑動輪播的實(shí)現(xiàn)方式主要有兩種
1)切換父元素margin-left,將第一個子元素不斷添加到父容器結(jié)尾
簡單實(shí)現(xiàn)
var $panel = $('example'); var scrollTimer = setInterval(function() { scrollNews($panel); }, 3000); function $scrollNews(){ $panel.animate({ 'marginLeft': '-266px' }, 500, function() { $panel.css({ marginLeft: 0 }).find('>li:first').appendTo($panel); }) }
這種方式有一個問題就是在老IE上可能存在兼容問題。
2) 累計(jì)方式設(shè)置父元素margin-left
不過在margin-left設(shè)置到最小的時候(滑動到最后一個元素),將第一個子元素的位置設(shè)置為最后一個子元素的后面,當(dāng)最后一個元素滾動到第一個元素后,父元素margin-left置為0且第一個子元素的位置歸位。舉個簡單代碼例子
var $panel = $('.example'), index = 0; var scrollTimer = setInterval(function() { scrollNews($panel); }, 3000); function scrollNews(){ if(++index >= 2){ $panel.css({ 'paddingLeft': 266 + 'px' }) $panel.find('>li:first').css({ 'position': 'absolute', 'left': 266*index + 'px' }); } $panel.animate({ 'marginLeft': -266*index + 'px' }, 500, function() { if(++index > 3){ $panel.css({ marginLeft: 0 }); } if(index >= 3){ index = 0; $panel.css({ marginLeft: 0, 'paddingLeft': 0 }); $panel.find('>li:first').css({ 'position': 'static', 'left': 'auto' }); } }) }
更復(fù)雜的滾動插件需要支持水平和垂直方向的滾動(四個方向)、可以手動切換焦點(diǎn)、可以翻上一個下一個。附上本人寫完整的插件源碼
插件源碼jquery.nfdscroll.js:支持水平和垂直方向(四個方向)滾動,手動切換會隨切換方向滾動
/** * @author '陳樺' * @date '2016-5-10' * @description 滑動輪播插件,支持水平和垂直方向滑動輪播 * * @example html: <div class="nfdnews_topnews example"> <!-- 滾動內(nèi)容ul --> <ul> <li><a href="xxx" target="_blank" title="xxx"></a></li> <li><a href="xxx" target="_blank" title="xxx"></a></li> <li><a href="xxx" target="_blank" title="xxx"></a></li> <li><a href="xxx" target="_blank" title="xxx"></a></li> </ul> <!-- 焦點(diǎn)列表,可選 --> <ol> <li class=""></li> <li class=""></li> <li class=""></li> <li class=""></li> </ol> <!-- 上一個和下一個,可選 --> <div> <a class="nfdscroll-prev" href="javascript:void(0);"></a> <a class="nfdscroll-next" href="javascript:void(0);"></a> </div> </div> js: $('.example').nfdscroll({ startIndex:0, width:'266', height:'216', interval:2000, selected:'circle', prevText:'', nextText:'', deriction:'left', callback: function(index,$currentNode){ console.log(index) } }); * @param startIndex {Number} 默認(rèn)從第幾個滾動體開始滾動,可選(0-n,0表示第一個,默認(rèn)為0) * @param width {Number} 滾動體寬度,可選(當(dāng)寬度為0時表示不設(shè)置寬度) * @param height {Number} 滾動體高度,可選(當(dāng)高度為0時表示不設(shè)置高度) * @param interval {Number} 間隔時間,單位毫秒, 當(dāng)值為負(fù)時表示不進(jìn)行自動滾動 * @param duration {Number} 動畫持續(xù)時間 * @param selected {String} 滾動切換小圖標(biāo)(焦點(diǎn)列表)當(dāng)前class * @param deriction {String} 滾動方向,支持left/right和top/bottom * @param callback {Function} 滑動動畫結(jié)束時觸發(fā)的回調(diào),參數(shù)(index,$currentNode),index:輪播結(jié)束后展示的節(jié)點(diǎn)的索引;currentNode:輪播結(jié)束后當(dāng)前展示的節(jié)點(diǎn)的jquery對象 * @param prevText {String} 上一個按鈕的文本,默認(rèn)是"上一個" * @param nextText {String} 下一個按鈕的文本,默認(rèn)是"下一個" */ jQuery.fn.extend({nfdscroll: function(options) { var defaultOpt = { startIndex: 0, width: 0,//滾動體寬度,可選(當(dāng)寬度為0時表示不設(shè)置寬度) height: 0,//滾動體高度,可選(當(dāng)高度為0時表示不設(shè)置高度度) interval: 1000,//間隔時間毫秒 duration: 400,//動畫持續(xù)時間 selected:'selected',//滾動切換小圖標(biāo)當(dāng)前class prevText:'上一個', nextText:'下一個', deriction:'left',//滾動方向 callback: function(index,$currentNode){//每次滾動到新節(jié)點(diǎn)后馬上觸發(fā),currentNode是當(dāng)前展示的節(jié)點(diǎn)的jquery對象 } }, $this = this, $panel = $this.find('>ul'),//滾動容器 $panelList = $panel.find('>li'), $selectList = $this.find('>ol>li'),//選擇容器 options = jQuery.extend(defaultOpt,options), animateFn,//滾動動畫 max = $panel.find(">li").length,//要滾動的節(jié)點(diǎn)的數(shù)量 focusIndex = 0,//當(dāng)前展示的節(jié)點(diǎn)的索引 nfdscrollTimer = 0,//計(jì)時器 inAnimation = false,//動畫過程中不再響應(yīng)其他動畫 isWaitting = false,//是否有未執(zhí)行的等待動畫 waittingIndex;//未執(zhí)行的等待動畫的目標(biāo)index $('.nfdscroll-prev').text(options.prevText); $('.nfdscroll-next').text(options.nextText); //只有一個展示,不需要輪播 if($panelList.length <= 1){ return; } //當(dāng)前動畫沒有做完但是焦點(diǎn)已經(jīng)切換到下一個地方,這個函數(shù)就是用來執(zhí)行保障當(dāng)前顯示的頁面和鼠標(biāo)指定的目標(biāo)一致的處理 function doWaitting(){ if(isWaitting){ startScroll(waittingIndex); } } //開始輪播 function startScroll(toIndex){ stopScroll(); if(inAnimation) { isWaitting = true; waittingIndex = toIndex; return;//動畫過程中不再響應(yīng)其他動畫 }else{ isWaitting = false; } if(toIndex == undefined){ if(options.interval > 0){ nfdscrollTimer = setInterval(function(){ animateFn(toIndex); },options.interval); } //跳到指定index后再計(jì)時 }else{ animateFn(toIndex); if(options.interval > 0){ nfdscrollTimer = setInterval(function(){ animateFn(); },options.interval); } } } //停止輪播 function stopScroll(){ clearInterval(nfdscrollTimer); } //向左向右滾動動畫 //參數(shù)toIndex: number,滾動到指定index function leftRightAnimate(toIndex){ //默認(rèn)滾動方式 if(toIndex == undefined){ if(options.deriction == 'left'){ toIndex = focusIndex + 1; }else{ toIndex = focusIndex - 1; } } if(toIndex != focusIndex){ inAnimation = true; //當(dāng)前為最后一個輪播體時的處理 var tInd = 0; if(toIndex >= max){//最后一張圖片繼續(xù)滾動時 $panel.css({ 'paddingLeft': options.width + 'px' }) $panelList.eq(0).css({ 'position': 'absolute', 'left': options.width*toIndex + 'px' }); tInd = 0; }else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個圖片,然后點(diǎn)擊上一個圖片的時候出現(xiàn) //當(dāng)前為最后一個輪播體時的處理 $panelList.eq(max - 1).css({ 'position': 'absolute', 'left': -options.width + 'px' }); tInd = max - 1; }else{ tInd = toIndex; } //先將焦點(diǎn)切換過去 $selectList.filter('.' + options.selected).removeClass(options.selected) .end().eq(tInd).addClass(options.selected); $panel.animate({ 'marginLeft': -options.width*toIndex + 'px' }, options.duration, function() { focusIndex = tInd; if(toIndex >= max){//最后一張圖片繼續(xù)滾動時 $panel.css({ 'marginLeft': 0, 'paddingLeft': 0 }); $panelList.eq(0).css({ 'position': 'static', 'left': 'auto' }); }else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個圖片,然后點(diǎn)擊上一個圖片的時候出現(xiàn) $panel.css({ 'marginLeft': -options.width*focusIndex + 'px', 'paddingLeft': 0 }); $panelList.eq(max - 1).css({ 'position': 'static', 'left': 'auto' }); } options.callback(focusIndex,$panelList.eq(focusIndex)); inAnimation = false; doWaitting(); }) } } //向上向下滾動動畫 function topBottomAnimate(toIndex){ //默認(rèn)滾動方式 if(toIndex == undefined){ if(options.deriction == 'top'){ toIndex = focusIndex + 1; }else{ toIndex = focusIndex - 1; } } if(toIndex != focusIndex){ inAnimation = true; //當(dāng)前為最后一個輪播體時的處理 var tInd = 0; if(toIndex >= max){ $panel.css({ 'paddingTop': options.height + 'px' }) $panelList.eq(0).css({ 'position': 'absolute', 'top': options.height*toIndex + 'px' }); tInd = 0; }else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個圖片,然后點(diǎn)擊上一個圖片的時候出現(xiàn) //當(dāng)前為最后一個輪播體時的處理 $panelList.eq(max - 1).css({ 'position': 'absolute', 'top': -options.height + 'px' }); tInd = max - 1; }else{ tInd = toIndex; } //先將焦點(diǎn)切換過去 $selectList.filter('.' + options.selected).removeClass(options.selected) .end().eq(tInd).addClass(options.selected); $panel.animate({ 'marginTop': -options.height*toIndex + 'px' }, options.duration, function() { focusIndex = tInd; if(toIndex >= max){ $panel.css({ marginTop: 0, 'paddingTop': 0 }); $panelList.eq(0).css({ 'position': 'static', 'top': 'auto' }); }else if(toIndex < 0){//僅僅在當(dāng)前圖片是第一個圖片,然后點(diǎn)擊上一個圖片的時候出現(xiàn) $panel.css({ 'marginTop': -options.height*focusIndex + 'px', 'paddingTop': 0 }); $panelList.eq(max - 1).css({ 'position': 'static', 'top': 'auto' }); } options.callback(focusIndex,$panelList.eq(focusIndex)); inAnimation = false; doWaitting(); }) } } function bindEvent(){ //綁定事件 $this.on('mouseover',function(){ stopScroll(); }).on('mouseout',function(){ startScroll(); }).on('click', '.nfdscroll-prev', function(){ stopScroll(); startScroll(focusIndex - 1); }).on('click', '.nfdscroll-next', function(){ stopScroll(); startScroll(focusIndex + 1); }) $selectList.on('mouseover',function(){ stopScroll(); if(!$(this).is('.' + options.selected)){ startScroll($(this).index()); } }); } function init(){ $this.css({ position: 'relative', overflow: 'hidden' }); $panel.css({ position: 'relative' }) focusIndex = options.startIndex;//默認(rèn)從startIndex開始滾動 $selectList.eq(focusIndex).addClass(options.selected);//先將焦點(diǎn)切換過去 if(options.deriction == 'left' || options.deriction == 'right'){ //初始化樣式,實(shí)際上不應(yīng)該插件里面來做樣式,應(yīng)該使用者自己就保證樣式?jīng)]有問題 var cssO = { width: options.width, 'float': 'left' } $this.css({ width: options.width });//只需要管寬度即可 if(options.height){ cssO.height = options.height; } var leng = $panel.find('>li').css(cssO).length; $panel.css({ width: options.width * leng + 'px', 'marginLeft': -options.width*focusIndex + 'px' }); animateFn = leftRightAnimate; }else if(options.deriction == 'top' || options.deriction == 'bottom'){ var cssO = { height: options.height } $this.css({ height: options.height });//只需要管高度度即可 if(options.width){ cssO.width = options.width; } var leng = $panel.find('>li').css(cssO).length; $panel.css({ height: options.height * leng + 'px', 'marginTop': -options.height*focusIndex + 'px' }); animateFn = topBottomAnimate; }else{ alert('插件只支持left/right/top/bottom四種方向上的滾動'); return; } startScroll(); } bindEvent(); init(); return { 'stopScroll': stopScroll, 'startScroll': startScroll } } });
一個完整的例子
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>輪播測試?yán)?lt;/title> <style type="text/css"> body,ul,ol{margin: 0; padding: 0;} ul,ol{list-style: none;} .li1{background-color: #000;} .li2{background-color: #333;} .li3{background-color: #666;} .li4{background-color: #999;} .example{margin-left: 300px;} .example ol { position: absolute; padding-left: 80px; width: 186px; height: 20px; top: 186px; left: 0px; background: #fff; cursor: pointer; } ol li{ float: left; width: 10px; height: 10px; margin: 5px; background: #ff0; border-radius: 10px; } ol li.circle{ background: #f00; } </style> </head> <body> <div class="example"> <!-- 滾動內(nèi)容ul --> <ul> <li class="li1"><a href="xxx" target="_blank" title="xxx"></a></li> <li class="li2"><a href="xxx" target="_blank" title="xxx"></a></li> <li class="li3"><a href="xxx" target="_blank" title="xxx"></a></li> <li class="li4"><a href="xxx" target="_blank" title="xxx"></a></li> </ul> <!-- 焦點(diǎn)列表,可選 --> <ol> <li class=""></li> <li class=""></li> <li class=""></li> <li class=""></li> </ol> <!-- 上一個和下一個,可選 --> <div> <a class="nfdscroll-prev" href="javascript:void(0);"></a> <a class="nfdscroll-next" href="javascript:void(0);"></a> </div> </div> <script type="text/javascript" src="common/jquery.js"></script> <script type="text/javascript" src="common/jquery.nfdscroll.js"></script> <script type="text/javascript"> $('.example').nfdscroll({ startIndex:0, width:'266', height:'216', interval:-1,//2000, selected:'circle', prevText:'上一個', nextText:'下一個', deriction:'left', callback: function(index,$currentNode){ console.log(index) } }); </script> </body> </html>
實(shí)現(xiàn)效果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
jQuery判斷元素是否顯示 是否隱藏的簡單實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄猨Query判斷元素是否顯示 是否隱藏的簡單實(shí)現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05jquery數(shù)組之存放checkbox全選值示例代碼
使用jquery數(shù)組可以存放checkbox全選值,下面有個不錯的示例,感興趣的朋友可以參考下2013-12-12jQuery插件MovingBoxes實(shí)現(xiàn)左右滑動中間放大圖片效果
本篇文章主要介紹jQuery中MovingBoxes左右滑動放大圖片插件示例,實(shí)現(xiàn)左右滑動和放大效果,有興趣的可以了解一下。2017-02-02基于jQuery實(shí)現(xiàn)帶動畫效果超炫酷的彈出對話框(附源碼下載)
這是一款基于jQuery的彈出對話框插件,這個jQuery對話框插件的最大特點(diǎn)是彈出和關(guān)閉都帶有非常炫酷的動畫特效,需要的朋友參考下吧2016-02-02jQuery.uploadify文件上傳組件實(shí)例講解
這篇文章主要介紹了jQuery.uploadify文件上傳組件實(shí)例講解的相關(guān)資料,本文圖文并茂介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下2016-09-09jQuery操作Dom元素與遍歷以及JS遍歷詳細(xì)講解
這篇文章主要介紹了jQuery操作Dom元素、jQuery遍歷、JavaScript遍歷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01html文件中jquery與velocity變量中的$沖突的解決方法
在使用velocity模版引擎的環(huán)境下,使用jquery時其中$與velocity變量中的$沖突,下面有個不錯的解決方法,感興趣的朋友可以參考下2013-11-11