搜尋
首頁web前端js教程js中滑動式輪播圖是怎麼實現的?

js中滑動式輪播圖是怎麼實現的?

Jul 09, 2017 am 09:40 AM
javascript實現怎麼

這篇文章主要為大家詳細介紹了js實現從左向右滑動式輪播圖效果,具有一定的參考價值,有興趣的小夥伴們可以參考一下

輪播圖就是讓圖片每隔幾秒鐘自動滑動,達到圖片輪流播放的效果。輪播圖從效果來說有滑動式的也有漸入式的,滑動式的輪播圖就是圖片從左向右滑入的效果,漸入式的輪播圖就是圖片根據透明度漸漸顯示的效果,這裡說的是實現第一種效果的方法。

原理

相同大小的圖片並成一列,但只顯示其中一張圖片,其餘的隱藏,透過修改left值來改變顯示的圖片。

點選查看效果

html部分

  nav為總容器,第一個ul列表#index為小圓點列表,滑鼠覆蓋哪個小圓點就顯現第幾張圖片,on是一個為小圓點添加背景顏色屬性的類別;第二個ul列表#img為圖片列表。


  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Carousel Figure</title>
    <link rel="stylesheet" href="style.css" rel="external nofollow" >
  </head>
  <body>
  <!--从左向右滑动-->
    <nav>
      <ul id="index">
        <li class="on"></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
      </ul>
      <ul id="img">
        <li><img src="/static/imghwm/default1.png"  data-src="../images/img1.jpg"  class="lazy"   alt="img1"></li>
        <li><img src="/static/imghwm/default1.png"  data-src="../images/img2.jpg"  class="lazy"   alt="img2"></li>
        <li><img src="/static/imghwm/default1.png"  data-src="../images/img3.jpg"  class="lazy"   alt="img3"></li>
        <li><img src="/static/imghwm/default1.png"  data-src="../images/img4.jpg"  class="lazy"   alt="img4"></li>
        <li><img src="/static/imghwm/default1.png"  data-src="../images/img5.jpg"  class="lazy"   alt="img5"></li>
      </ul>
    </nav>
  <script src="script.js"></script>
  </body>
  </html>

css部分

#圖片尺寸皆為720*405,這裡要注意以下幾點:

ul#img列表相對於nav是絕對定位的,#img的長度必須設定為所有圖片的總寬度,這樣圖片才可以並列一排顯示;

總容器nav的寬度必須設定為圖片的寬度720px,即只能顯示一張圖片,超出寬度的部分隱藏,即overflow: hidden;

小圓點列表應該在圖片列表上面顯示,故設定#img的z-index:-1;

小圓點列表是由一系列的li透過改變邊框樣式構成,故只需改變背景顏色即可達到移動小圓點的效果。


  *{
    margin:0;
    padding:0;
  }
  nav{
    width: 720px;
    height: 405px;
    margin:20px auto;
    overflow: hidden;
    position: relative;
  }
  #index{
    position: absolute;
    left:320px;
    bottom: 20px;
  
  }
  #index li{
    width:8px;
    height: 8px;
    border: solid 1px gray;
    border-radius: 100%;
    background-color: #eee;
    display: inline-block;
  }
  #img{
    width: 3600px;/*不给宽高无法移动*/
    height: 405px;
    position: absolute;/*不定义absolute,js无法设置left和top*/
    z-index: -1;
  }
  #img li{
    width: 720px;
    height: 405px;
    float: left;
  }
  #index .on{
    background-color: black;
  }

JS部分

#圖片移動函數moveElement()

  moveElement函數需要取得圖片現在的位置以及目標位置併計算它們之間的差距進行移動,可以用offsetLeft和offsetTop取得圖片現在的位置。圖片移動時「劃過」的效果是將距離分成好10次進行移動,即利用setTimeOut函數,然而為了防止滑鼠懸停,需呼叫clearTimeout()函數,代碼如下:


  function moveElement(ele,x_final,y_final,interval){//ele为元素对象
    var x_pos=ele.offsetLeft;
    var y_pos=ele.offsetTop;
    var dist=0;
    if(ele.movement){//防止悬停
      clearTimeout(ele.movement);
    }
    if(x_pos==x_final&&y_pos==y_final){//先判断是否需要移动
      return;
    }
    dist=Math.ceil(Math.abs(x_final-x_pos)/10);//分10次移动完成
    x_pos = x_pos<x_final ? x_pos+dist : x_pos-dist;
    
    dist=Math.ceil(Math.abs(y_final-y_pos)/10);//分10次移动完成
    y_pos = y_pos<y_final ? y_pos+dist : y_pos-dist;
    
    ele.style.left=x_pos+&#39;px&#39;;
    ele.style.top=y_pos+&#39;px&#39;;
    
    ele.movement=setTimeout(function(){//分10次移动,自调用10次
      moveElement(ele,x_final,y_final,interval);
    },interval)
  }

小圓點移動函數moveIndex()

#  移動小圓點的實質是移動設定的背景顏色的類on,原理是先判斷哪個li上有背景顏色,有則去掉,讓所有的li都沒有背景,然後在對當前的li添加背景。


  function moveIndex(list,num){//移动小圆点
    for(var i=0;i<list.length;i++){
      if(list[i].className==&#39;on&#39;){//清除li的背景样式
        list[i].className=&#39;&#39;;
      }
    }
    list[num].className=&#39;on&#39;;
  }

圖片自動輪播

  將以下程式碼直接寫在window.onload中即可。
  這裡需要定義一個變數index,表示移動到第index(0~n-1,n為li的個數)張圖片。


  var img=document.getElementById(&#39;img&#39;);
  var list=document.getElementById(&#39;index&#39;).getElementsByTagName(&#39;li&#39;);
  var index=0;//这里定义index是变量,不是属性

  var nextMove=function(){//一直向右移动,最后一个之后返回
    index+=1;
    if(index>=list.length){
      index=0;
    }
    moveIndex(list,index);
    moveElement(img,-720*index,0,20);
  };

圖片的自動輪播需要用到setInterval()函數,讓程式每隔幾秒鐘自動呼叫nextMove()函數:


  var play=function(){
    timer=setInterval(function(){
      nextMove();
    },2500);
  };

滑鼠覆寫小圓點效果

#  要實作滑鼠覆寫哪個小圓點,就呈現對應的圖片這效果,需要知道滑鼠覆蓋的是哪個小圓點,這裡為每個li都加上一個自定的屬性index,使該屬性的值為對應的小圓點的序號i(0~n-1, n為li的個數),這樣每次滑鼠覆蓋時只需取得index屬性的值即可知道滑鼠覆蓋的是哪個小圓點。注意,該index屬性和變數index沒有絲毫的關係,只有相同的名字。


  for(var i=0;i<list.length;i++){//鼠标覆盖上哪个小圆圈,图片就移动到哪个小圆圈,并停止
    list[i].index=i;//这里是设置index属性,和index变量没有任何联系
    list[i].onmouseover= function () {
      var clickIndex=parseInt(this.index);
      moveElement(img,-720*clickIndex,0,20);
      index=clickIndex;
      moveIndex(list,index);
      clearInterval(timer);
    };
    list[i].onmouseout= function () {//移开后继续轮播
      play();
    };
  }

總結

#  輪播圖的實作並不複雜,主要在於將圖片的移動行為和小圓點的移動行為分開,這樣就比較容易實現。這個輪播圖其實還是有點問題的,從最後一幅圖滑向第一個時滑動的距離較長,其實也很好解決,將滑動的方式改一下,這裡是根據-720*index來計算最終的left值,而index是將圖片的移動和小圓點的移動綁在一起,將滑動方式改成現在的offsetLeft+(-720),圖片的移動就可以與index值無關,然後在html檔案增加一圖片:


<li><img src="/static/imghwm/default1.png"  data-src="../images/img1.jpg"  class="lazy"   alt="img1"></li>
<li><img src="/static/imghwm/default1.png"  data-src="../images/img2.jpg"  class="lazy"   alt="img2"></li>
<li><img src="/static/imghwm/default1.png"  data-src="../images/img3.jpg"  class="lazy"   alt="img3"></li>
<li><img src="/static/imghwm/default1.png"  data-src="../images/img4.jpg"  class="lazy"   alt="img4"></li>
<li><img src="/static/imghwm/default1.png"  data-src="../images/img5.jpg"  class="lazy"   alt="img5"></li>
<li><img src="/static/imghwm/default1.png"  data-src="../images/img1.jpg"  class="lazy"   alt="img1"></li>

然後在滑到最後一幅圖片時,迅速的將偏移量賦值0,變成第一幅,兩幅圖一樣,無法分辨其中變化,即可達到無縫連接。


  if(x_pos==-3600){
    ele.style.left=&#39;0&#39;;
    ele.style.top=&#39;0&#39;;
  }else{
    ele.style.left=x_pos+&#39;px&#39;;
    ele.style.top=y_pos+&#39;px&#39;;
  }

以上是js中滑動式輪播圖是怎麼實現的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java vs JavaScript:開發人員的詳細比較Java vs JavaScript:開發人員的詳細比較May 16, 2025 am 12:01 AM

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript數據類型:瀏覽器和nodejs之間是否有區別?JavaScript數據類型:瀏覽器和nodejs之間是否有區別?May 14, 2025 am 12:15 AM

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScript評論:使用//和 / * * / * / * /JavaScript評論:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。