原生JavaScript實現焦點圖輪播


  不管是高校的網站還是電商的頁面,焦點圖的切換和輪播應該是一項不可或缺的應用。今天把焦點圖輪播制作的技術要點做下筆記,以供日后查看。

 

一、結構層(HTML)

  焦點圖的HTML結構很簡單,就是一個父容器(id=box),包含三個子容器,分別存放圖片(id=pics)、底部按鈕(id=dots)、作用切換箭頭(class=turn)。加上樣式后就是下圖二的布局。

                  

二、表示層(CSS)

  頁面的表現和風格總是離不開CSS。為敘述方便,后面采用id選擇符名或類選擇符名代表各div模塊。

1.box

  box作為父容器,是整個焦點圖輪播結構在網頁的直觀表現,它的寬高就是要顯示的圖片的寬高。我將圖片設置為寬600px、高400px,使父容器box居中顯示,並加了陰影。樣式大概都可以隨自己愛好設置,但溢出一定要隱藏定位一定要設置為相對定位,以使子容器的絕對定位准確。

#box{
    width: 600px;
    height: 400px;
    margin-top: 100px;
    margin-left: auto;
    margin-right: auto;
    overflow: hidden;
    position: relative;
    box-shadow: 10px 10px 5px #888;
}

 2.pics

   pics用於放置圖片,因為是制作左右切換功能,高仍是一張圖片的高,但寬=(展示的圖片數量+2)*圖片寬,原因在行為層再說明。

  另外需要注意的是,由展示圖片可知,pics在左右切換箭頭和底部切換按鈕的下層,所以z-index要設為1。

#pics{
    width: 5400px;
    height: 400px;
    position: absolute;
    z-index: 1;
}

 

3.dots

  z-index設為2,置為上層顯示;定位為絕對定位;其他樣式隨喜好。這里我設置了鼠標滑過的樣式,以及配合js對應圖片位置改變的樣式(on)。

#dots{
    width: 120px;
    height: 10px;
    position: absolute;
    bottom: 25px;
    left: 40%;
    z-index: 2;
}

#dots span{
    width: 10px;
    height: 10px;
    float: left;
    margin-right: 5px;
    background: #333;
    border: solid 1px #FFF;
    border-radius: 50%;
    cursor: pointer;
}

#dots .on{background: orangered;}
#dots span:hover{background: orangered;}

 

 4.turn

  左右箭頭的重要樣式與dots一致,其他自定義。這里我設置了鼠標滑過box,才顯現箭頭。

.turn{
    width: 40px;
    height: 40px;
    color: #fff;
    background: orangered;
    line-height: 39px;
    text-align: center;
    font-size: 36px;
    font-weight: bold;
    opacity: 0.5;
    position: absolute;
    top: 180px;
    display: none;
    z-index: 2;
    cursor: pointer;
}
.turn:hover{opacity: 0.8;}
#box:hover .turn{display: block;}

 

  至此頁面的樣式和布局完成,但行為層方法和功能的實現才是重點。

  

三、行為層(JavaScript)

  定義函數前,先在全局作用域中獲得頁面的節點。

1 var box = document.getElementById('box');
2 var pics = document.getElementById('pics');
3 var dots = document.getElementById('dots').getElementsByTagName('span');
4 var pre = document.getElementById('pre');
5 var next = document.getElementById('next');

1.圖片切換動畫  

  輪播圖的核心方法,在於圖片的切換動畫。而此函數的重點,是接收一個位移量offset,然后改變pics相對於box的left值,從而對圖片進行顯示。

  之前CSS設置的,box的寬為600px,但pics的寬卻為5400px,由於box溢出隱藏,所以頁面只會顯示一張圖片;通過接收具體位移量offset,改變left值(減去或加上n個圖片寬度),就可以改變顯示的圖片。

  此外還有兩個問題,如果不設置圖片切換的速度,圖片就會整張整張的變換,沒有進入切換的效果;而且如果不停的點擊切換,就會消耗太多的內存造成電腦卡機,出現頁面停在前一張圖未切換完就出現下一張等情況。所以要對圖片做一個速度處理,以及一張圖片為切換完就不允許其他切換的設置。

 1     //圖片切換函數
 2     function turn(offset){ 
 3         turned = true;                                      //切換允許標志,在全局作用域中定義,true表示關閉允許切換
 4         var new_left = parseInt(pics.style.left) + offset;  //最后left值
 5         var total_time = 300;                               //位移總時間
 6         var interval = 10;                                  //每次位移間隔時間
 7         var speed = offset/(total_time/interval);           //位移速度——每次位移量
 8 
 9         function go(){
10             if((speed < 0 && parseInt(pics.style.left) > new_left) || (speed > 0 && parseInt(pics.style.left) < new_left)){ //右切||左切
11                 pics.style.left = parseInt(pics.style.left) + speed +'px';
12                 setTimeout(go,interval);
13             }else{
14                 turned = false;     //已切換完畢,開啟允許切換
15                 pics.style.left = new_left +'px';
16                 if( new_left < -4200){
17                     pics.style.left = -600 +'px';
18                 }
19                 else if( new_left > -600){
20                     pics.style.left = -4200 +'px';
21                 }
22             }
23         }
24         go();
25     }

2.箭頭切換

  在圖片切換函數turn()基礎上傳入參數。因為是左右切換,所以每次直接傳入一個圖片寬度。向右切換傳入-600,左切傳入600。

  這里要注意的就是,圖片與底部按鈕的同步,到兩邊的最后一張后參數的重置,以及是否允許切換的判斷。

 1     //箭頭切換實現
 2     next.onclick = function(){
 3         if(index == 7){
 4             index = 1;
 5         }else{
 6             index += 1;
 7         }
 8         show_dots();
 9         if(!turned){
10             turn(-600);
11         }
12     };
13     pre.onclick = function(){
14         if(index == 1){
15             index = 7;
16         }else{
17             index -= 1;
18         }
19         show_dots();
20         if(!turned){
21             turn(600);
22         }
23     };

3.底部按鈕實現

  按鈕與箭頭的不同,在於點擊它可以切換到任意一張圖片,所以在對切換函數turn()傳入參數前要先做一個計算。另外按鈕對應樣式的變化也不能忘記。

 1     //按鈕切換樣式
 2     function show_dots(){
 3         for(var i = 0; i < dots.length; i++){
 4             if(dots[i].className == 'on'){
 5                 dots[i].className = '';
 6                 break;
 7             }
 8         }
 9         dots[index - 1].className = 'on';
10     }
11     //按鈕切換實現
12     for(var i = 0; i < dots.length; i++){
13         dots[i].onclick= function(){
14             if(this.className == 'on'){
15                 return;
16             }
17             var my_index = parseInt(this.getAttribute('index'));   //注意! index是自定義屬性
18             var offset = -600 * (my_index - index);         //計算切換位移量
19 
20             if(!turned){
21                 turn(offset);
22             }
23             index = my_index;
24             show_dots();
25         }
26     }

4. 自動播放

  自動播放自然就是設置定時器和清除定時器的問題,這里不再贅述。

 1     //定時動畫
 2     function play(){
 3         time = setInterval(function(){
 4             next.onclick();
 5         },3000);     
 6     }
 7     //動畫停止
 8     function stop(){clearInterval(time);}
 9 
10     play();
11     box.onmouseover = stop;
12     box.onmouseout = play;

 

最后附上demo和源碼鏈接:demo源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM