使用jQuery制作基礎的Web圖片輪播效果
來源:易賢網 閱讀:879 次 日期:2016-07-06 15:57:05
溫馨提示:易賢網小編為您整理了“使用jQuery制作基礎的Web圖片輪播效果”,方便廣大網友查閱!

這篇文章主要介紹了使用jQuery制作基礎的Web圖片輪播效果的實例,鼠標懸停時可停止而離開時可自動輪播,文中還介紹了一種使用zslider插件來實現的方法,比較犀利,需要的朋友可以參考下

首先看一下效果:

名單

就這么個意思,沒截動圖哈~

輪播效果分析:

輪播效果大致可以分為3個部分:輪播圖片(圖片或者是包含容器),控制輪播圖顯示的按鈕(向左、向右按鈕,索引按鈕(例如上面效果圖的頂部的數字按鈕)),每隔一段時間輪流顯示輪播圖片。

輪播圖的顯示:要顯示的輪播圖顯示,不需要顯示的輪播圖隱藏;通常將這些輪播圖片以定位的方式重疊在一起,每次顯示一張輪播圖片。

控制按鈕:鼠標點擊或者移到索引按鈕上面時,顯示對應索引位置的輪播圖;向上、向下按鈕負責控制顯示上一張、下一張輪播圖片。

其它:一般索引按鈕有激活狀態(tài)和未激活狀態(tài)共2種狀態(tài);鼠標移到輪播圖片上面時應該停止自動輪播,鼠標離開時開始自動輪播。

輪播效果實現筆記:

jquery提供了豐富的選擇器以及用來挑選元素的方法,這極大的簡化了我們的開發(fā),例如$(".slider-item").filter(".slider-item-selected")選擇了當前處于激活狀態(tài)的索引按鈕。

兩張輪播圖的切換顯示效果是通過jquery的fadeOut()和fadeIn()方法來實現的,具體的使用參照jquery的api;

CSS透明背景的實現:  background: rgba(0, 0, 0, 0.2);filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000); (可以參看下面的參看資料),兼容大部分主流瀏覽器包括IE;為什么不使用opacity呢?因為opacity會使文字也透明(子元素也會透明)。

HTML骨架很重要,你寫的html的結果應該是良好的。

代碼部分:

HTML:

<pre name="code" class="html"><div class="slider">

 <div class="slider-extra">

 <ul class="slider-nav">

  <li class="slider-item">1</li>

  <li class="slider-item">2</li>

  <li class="slider-item">3</li>

  <li class="slider-item">4</li>

 </ul>

 <div class="slider-page">

  <a class="slider-pre" href="javascript:;;"><</a>

  <a class="slider-next" href="javascript:;;">></a>

 </div>

 </div>

</div>

CSS:

* {

 padding: 0px;

 margin: 0px;

}

a {

 text-decoration: none;

}

ul {

 list-style: outside none none;

}

.slider, .slider-panel img, .slider-extra {

 width: 650px;

 height: 413px;

}

.slider {

 text-align: center;

 margin: 30px auto;

 position: relative;

}

.slider-panel, .slider-nav, .slider-pre, .slider-next {

 position: absolute;

 z-index: 8;

}

.slider-panel {

 position: absolute;

}

.slider-panel img {

 border: none;

}

.slider-extra {

 position: relative;

}

.slider-nav {

 margin-left: -51px;

 position: absolute;

 left: 50%;

 bottom: 4px;

}

.slider-nav li {

 background: #3e3e3e;

 border-radius: 50%;

 color: #fff;

 cursor: pointer;

 margin: 0 2px;

 overflow: hidden;

 text-align: center;

 display: inline-block;

 height: 18px;

 line-height: 18px;

 width: 18px;

}

.slider-nav .slider-item-selected {

 background: blue;

}

.slider-page a{

 background: rgba(0, 0, 0, 0.2);

 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000);

 color: #fff;

 text-align: center;

 display: block;

 font-family: "simsun";

 font-size: 22px;

 width: 28px;

 height: 62px;

 line-height: 62px;

 margin-top: -31px;

 position: absolute;

 top: 50%;

}

.slider-page a:HOVER {

 background: rgba(0, 0, 0, 0.4);

 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#66000000,endColorstr=#66000000);

}

.slider-next {

 left: 100%;

 margin-left: -28px;

}

JavaScript:

$(document).ready(function() {

 var length,

 currentIndex = 0,

 interval,

 hasStarted = false, //是否已經開始輪播

 t = 3000; //輪播時間間隔

 length = $('.slider-panel').length;

 //將除了第一張圖片隱藏

 $('.slider-panel:not(:first)').hide();

 //將第一個slider-item設為激活狀態(tài)

 $('.slider-item:first').addClass('slider-item-selected');

 //隱藏向前、向后翻按鈕

 $('.slider-page').hide();

 //鼠標上懸時顯示向前、向后翻按鈕,停止滑動,鼠標離開時隱藏向前、向后翻按鈕,開始滑動

 $('.slider-panel, .slider-pre, .slider-next').hover(function() {

 stop();

 $('.slider-page').show();

 }, function() {

 $('.slider-page').hide();

 start();

 });

 $('.slider-item').hover(function(e) {

 stop();

 var preIndex = $(".slider-item").filter(".slider-item-selected").index();

 currentIndex = $(this).index();

 play(preIndex, currentIndex);

 }, function() {

 start();

 });

 $('.slider-pre').unbind('click');

 $('.slider-pre').bind('click', function() {

 pre();

 });

 $('.slider-next').unbind('click');

 $('.slider-next').bind('click', function() {

 next();

 });

 /**

 * 向前翻頁

 */

 function pre() {

 var preIndex = currentIndex;

 currentIndex = (--currentIndex + length) % length;

 play(preIndex, currentIndex);

 }

 /**

 * 向后翻頁

 */

 function next() {

 var preIndex = currentIndex;

 currentIndex = ++currentIndex % length;

 play(preIndex, currentIndex);

 }

 /**

 * 從preIndex頁翻到currentIndex頁

 * preIndex 整數,翻頁的起始頁

 * currentIndex 整數,翻到的那頁

 */

 function play(preIndex, currentIndex) {

 $('.slider-panel').eq(preIndex).fadeOut(500)

  .parent().children().eq(currentIndex).fadeIn(1000);

 $('.slider-item').removeClass('slider-item-selected');

 $('.slider-item').eq(currentIndex).addClass('slider-item-selected');

 }

 /**

 * 開始輪播

 */

 function start() {

 if(!hasStarted) {

  hasStarted = true;

  interval = setInterval(next, t);

 }

 }

 /**

 * 停止輪播

 */

 function stop() {

 clearInterval(interval);

 hasStarted = false;

 }

 //開始輪播

 start();

});

首先是初始化部分:將除了第一張輪播圖片意外的圖片都隱藏,并且隱藏向前、向后按鈕,使第一個索引按鈕處于激活狀態(tài)。

事件部分:通過jquery的hover()綁定鼠標上懸以及離開時的事件處理, jquery的bind()方法綁定鼠標點擊事件處理向前、向后翻動、

輪播控制:pre(), next(), play(), start()開始自動輪播,stop()停止自動輪播。

上面的js寫的比較散,結構也不太好,讀起來也比較費力,也不易使用,耦合度較高。下篇將給出一個純粹的jquery輪播插件, 該插件可以定制各種效果,方便的配置以及可擴展。

下面是整體的代碼:

index.html

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>jquery輪播效果圖 - by RiccioZhang</title>

<script type="text/javascript" src="scripts/jquery-1.9.1.js"></script>

<style type="text/css">

 * {

 padding: 0px;

 margin: 0px;

 }

 a {

 text-decoration: none;

 }

 ul {

 list-style: outside none none;

 }

 .slider, .slider-panel img, .slider-extra {

 width: 650px;

 height: 413px;

 }

 .slider {

 text-align: center;

 margin: 30px auto;

 position: relative;

 }

 .slider-panel, .slider-nav, .slider-pre, .slider-next {

 position: absolute;

 z-index: 8;

 }

 .slider-panel {

 position: absolute;

 }

 .slider-panel img {

 border: none;

 }

 .slider-extra {

 position: relative;

 }

 .slider-nav {

 margin-left: -51px;

 position: absolute;

 left: 50%;

 bottom: 4px;

 }

 .slider-nav li {

 background: #3e3e3e;

 border-radius: 50%;

 color: #fff;

 cursor: pointer;

 margin: 0 2px;

 overflow: hidden;

 text-align: center;

 display: inline-block;

 height: 18px;

 line-height: 18px;

 width: 18px;

 }

 .slider-nav .slider-item-selected {

 background: blue;

 }

 .slider-page a{

 background: rgba(0, 0, 0, 0.2);

 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000);

 color: #fff;

 text-align: center;

 display: block;

 font-family: "simsun";

 font-size: 22px;

 width: 28px;

 height: 62px;

 line-height: 62px;

 margin-top: -31px;

 position: absolute;

 top: 50%;

 }

 .slider-page a:HOVER {

 background: rgba(0, 0, 0, 0.4);

 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#66000000,endColorstr=#66000000);

 }

 .slider-next {

 left: 100%;

 margin-left: -28px;

 }

</style>

<script type="text/javascript">

 $(document).ready(function() {

 var length,

  currentIndex = 0,

  interval,

  hasStarted = false, //是否已經開始輪播

  t = 3000; //輪播時間間隔

 length = $('.slider-panel').length;

 //將除了第一張圖片隱藏

 $('.slider-panel:not(:first)').hide();

 //將第一個slider-item設為激活狀態(tài)

 $('.slider-item:first').addClass('slider-item-selected');

 //隱藏向前、向后翻按鈕

 $('.slider-page').hide();

 //鼠標上懸時顯示向前、向后翻按鈕,停止滑動,鼠標離開時隱藏向前、向后翻按鈕,開始滑動

 $('.slider-panel, .slider-pre, .slider-next').hover(function() {

  stop();

  $('.slider-page').show();

 }, function() {

  $('.slider-page').hide();

  start();

 });

 $('.slider-item').hover(function(e) {

  stop();

  var preIndex = $(".slider-item").filter(".slider-item-selected").index();

  currentIndex = $(this).index();

  play(preIndex, currentIndex);

 }, function() {

  start();

 });

 $('.slider-pre').unbind('click');

 $('.slider-pre').bind('click', function() {

  pre();

 });

 $('.slider-next').unbind('click');

 $('.slider-next').bind('click', function() {

  next();

 });

 /**

  * 向前翻頁

  */

 function pre() {

  var preIndex = currentIndex;

  currentIndex = (--currentIndex + length) % length;

  play(preIndex, currentIndex);

 }

 /**

  * 向后翻頁

  */

 function next() {

  var preIndex = currentIndex;

  currentIndex = ++currentIndex % length;

  play(preIndex, currentIndex);

 }

 /**

  * 從preIndex頁翻到currentIndex頁

  * preIndex 整數,翻頁的起始頁

  * currentIndex 整數,翻到的那頁

  */

 function play(preIndex, currentIndex) {

  $('.slider-panel').eq(preIndex).fadeOut(500)

  .parent().children().eq(currentIndex).fadeIn(1000);

  $('.slider-item').removeClass('slider-item-selected');

  $('.slider-item').eq(currentIndex).addClass('slider-item-selected');

 }

 /**

  * 開始輪播

  */

 function start() {

  if(!hasStarted) {

  hasStarted = true;

  interval = setInterval(next, t);

  }

 }

 /**

  * 停止輪播

  */

 function stop() {

  clearInterval(interval);

  hasStarted = false;

 }

 //開始輪播

 start();

 });

</script>

</head>

<body>

 <div class="slider">

 <div class="slider-extra">

  <ul class="slider-nav">

  <li class="slider-item">1</li>

  <li class="slider-item">2</li>

  <li class="slider-item">3</li>

  <li class="slider-item">4</li>

  </ul>

  <div class="slider-page">

  <a class="slider-pre" href="javascript:;;"><</a>

  <a class="slider-next" href="javascript:;;">></a>

  </div>

 </div>

 </div>

</body>

</html>

至此一個簡單的jquery輪播效果就完成了,當然還有很多需要改進的地方。

使用插件實現

上面的效果看起來還令人滿意,唯一不足的就是:每次需要輪播效果時,要將代碼復制粘貼過去,如果有些部分需要修改(例如:輪播時的動畫效果,前一篇使用的是jquery的淡入淡出效果,如果改成滑動效果,不可避免的要修改js代碼),那么就需要對js代碼進行修改,對我所寫的jquery輪播效果的js代碼不熟悉的程序員來說,修改這些js確實很困難。輪播插件所要實現的目標之一就是插件可以靈活配置(不光只是本篇文章的插件),程序員只需要寫少量的代碼就可以實現豐富的功能,這當然是一件很好的事情。本篇文章的輪播插件的html和css部分需要程序員自己編寫,而實現效果的js只需要少量的編寫。

這里我們使用到的zslider插件在GitHub上開源:

github:https://github.com/ricciozhang/zslider_v1

嗯,我們來看代碼:

(function($, window, document) { 

  //---- Statics 

  var DEFAULT_ANIMATE_TYPE = 'fade',  

    ARRAY_SLICE = [].slice, 

    ARRAY_CONCAT = [].concat 

  //---- Methods 

  function concatArray() { 

    var deep = false, 

      result = []; 

    if(arguments.length > 0 &&  

        arguments[arguments.length - 1] === true) { 

      deep = true; 

    } 

    for(var i = 0; i < arguments.length; i++) { 

      if(!!arguments[i].length) { 

        if(deep) { 

          for(var j = 0; j < arguments[i].length; j++) { 

            //recursive call 

            result = ARRAY_CONCAT.call(result,  

                concatArray(arguments[i][j], true)); 

          } 

        } else { 

          result = ARRAY_CONCAT.call(result, arguments[i]); 

        } 

      } else if(i != arguments.length - 1 ||  

          (arguments[arguments.length - 1] !== true && 

              arguments[arguments.length - 1] !== false)) { 

        result.push(arguments[i]); 

      } 

    } 

    return result; 

  } 

  //----- Core 

  $.fn.extend({ 

    zslider: function(zsliderSetting, autoStart) { 

      var itemLenght = 0, 

        currItemIndex = 0, 

        started = false, 

        oInterval = {}, 

        setting = { 

          intervalTime: 3000, 

          step: 1, 

          imagePanels: $(), 

          animateConfig: { 

            atype: 'fade', 

            fadeInSpeed: 500, 

            fadeOutSpeed: 1000 

          }, 

          panelHoverStop: true, 

          ctrlItems: $(), 

          ctrlItemActivateType: 'hover' || 'click', 

          ctrlItemHoverCls: '', 

          flipBtn: {}, 

          panelHoverShowFlipBtn: true, 

          callbacks: { 

            animate: null

          } 

        }, 

        that = this

      //core methods 

      var slider = { 

          pre: function() { 

            var toIndex = itemLenght +  

              (currItemIndex - setting.step) % itemLenght; 

            slider.to(toIndex); 

          }, 

          next: function() { 

            var toIndex = (currItemIndex + setting.step) % itemLenght; 

            slider.to(toIndex); 

          }, 

          to: function(toIndex) { 

            //handle the index value 

            if(typeof toIndex === 'function') { 

              toIndex = toIndex.call(that, concatArray(setting.imagePanels, true),  

                    concatArray(setting.ctrlItems, true), 

                      currItemIndex, step); 

            } 

            if(window.isNaN(toIndex)) { 

              toIndex = 0; 

            } 

            toIndex = Math.round(+toIndex) % itemLenght; 

            if(toIndex < 0) { 

              toIndex = itemLenght + toIndex; 

            } 

            var currentPanel = setting.imagePanels.eq(currItemIndex), 

            toPanel = setting.imagePanels.eq(toIndex), 

            currrntCtrlItem = setting.ctrlItems.eq(currItemIndex) 

            toCtrlItem = setting.ctrlItems.eq(toIndex) 

            if(!setting.callbacks.animate ||  

                setting.callbacks.animate.call(that,  

                    concatArray(setting.imagePanels, true),  

                      concatArray(setting.ctrlItems, true), 

                        currItemIndex, toIndex) === true) { 

              currrntCtrlItem.removeClass(setting.ctrlItemHoverCls); 

              toCtrlItem.addClass(setting.ctrlItemHoverCls); 

              toPanel.fadeIn(setting.animateConfig.fadeInSpeed); 

              currentPanel.fadeOut(setting.animateConfig.fadeOutSpeed); 

            } 

            //set the current item index 

            currItemIndex = toIndex; 

          }, 

          start: function() { 

            if(!started) { 

              started = true; 

              oInterval =  

                window.setInterval(slider.next, setting.intervalTime); 

            } 

          }, 

          stop: function() { 

            if(started) { 

              started = false; 

              window.clearInterval(oInterval); 

            } 

          }, 

          isStarted: function() { 

            return started; 

          } 

      }; 

      function initData() { 

        if(zsliderSetting) { 

          var temp_callbacks = zsliderSetting.callbacks; 

          $.extend(setting, zsliderSetting); 

          $.extend(setting.callbacks, temp_callbacks); 

          itemLenght = setting.imagePanels.length; 

        } 

        //convert to the jquery object 

        setting.imagePanels = $(setting.imagePanels); 

        setting.ctrlItems = $(setting.ctrlItems); 

        setting.flipBtn.container = $(setting.flipBtn.container); 

        setting.flipBtn.preBtn = $(setting.flipBtn.preBtn); 

        setting.flipBtn.nextBtn = $(setting.flipBtn.nextBtn); 

      } 

      function initLook() { 

        //show the first image panel and hide other 

        setting.imagePanels.hide(); 

        setting.imagePanels.filter(':first').show(); 

        //activate the first control item and deactivate other 

        setting.ctrlItems.removeClass(setting.ctrlItemHoverCls); 

        setting.ctrlItems.filter(':first').addClass(setting.ctrlItemHoverCls); 

        $(that).css('overflow', 'hidden'); 

        if(setting.panelHoverShowFlipBtn) { 

          showFlipBtn(false); 

        } 

      } 

      function initEvent() { 

        $(concatArray(setting.imagePanels,  

            setting.flipBtn.preBtn, setting.flipBtn.nextBtn, true)).hover(function() { 

          if(setting.panelHoverStop) { 

            slider.stop(); 

          } 

          if(setting.panelHoverShowFlipBtn) { 

            showFlipBtn(true); 

          } 

        }, function() { 

          slider.start(); 

          if(setting.panelHoverShowFlipBtn) { 

            showFlipBtn(false); 

          } 

        }); 

        if(setting.ctrlItemActivateType === 'click') { 

          setting.ctrlItems.unbind('click'); 

          setting.ctrlItems.bind('click', function() { 

            slider.to($(this).index()); 

          }); 

        } else { 

          setting.ctrlItems.hover(function() { 

            slider.stop(); 

            slider.to($(this).index()); 

          }, function() { 

            slider.start(); 

          }); 

        } 

        setting.flipBtn.preBtn.unbind('click'); 

        setting.flipBtn.preBtn.bind('click', function() { 

          slider.pre(); 

        }); 

        setting.flipBtn.nextBtn.unbind('click'); 

        setting.flipBtn.nextBtn.bind('click', function() { 

          slider.next(); 

        }); 

      } 

      function init() { 

        initData(); 

          

        initLook(); 

          

        initEvent(); 

      } 

      function showFlipBtn(show) { 

        var hasContainer = setting.flipBtn.container.length > 0, 

          eles; 

        eles = hasContainer ? setting.flipBtn.container : 

          //to the dom array: 

          /*ARRAY_CONCAT.call(ARRAY_SLICE.apply(setting.flipBtn.preBtn), 

              ARRAY_SLICE.apply(setting.flipBtn.nextBtn));*/

          concatArray(setting.flipBtn.preBtn,  

                  setting.flipBtn.nextBtn, true); 

        if(show) { 

          $(eles).show(); 

        } else { 

          $(eles).hide(); 

        } 

      } 

      init(); 

      if(arguments.length < 2 || !!autoStart){ 

        slider.start(); 

      } 

      return slider; 

    } 

  }); 

})(jQuery, window, document); 

更多信息請查看網絡編程

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網