天天看點

JavaScript實作無縫輪播效果的思路

JavaScript實作無縫輪播效果的思路

先從普通輪播說起(自動播放功能後面實作)

<body>  
<div class="window">    
    <div class="slides" id="slides">      
        <img width="250" height="375" src="./1.jpg" alt="">      
        <img width="250" height="375" src="./2.jpg" alt="">      
        <img width="250" height="375" src="./3.jpg" alt="">    
    </div>  
</div>  
<div id="buttons" class="buttons">    
    <span>1</span>    
    <span>2</span>    
    <span>3</span>  
</div></body>      

最簡單的點選按鈕切換圖檔很簡單。

給按鈕添加click事件監聽,改變圖檔的translateX。當然如果想要輪播圖從上到下播放,相應的改變translateY就行。

let $buttons = $('#buttons>span')
let $slides = $('#slides')$buttons.eq(0).on('click',function(){  
    $slides.css({transform:'translateX(0px)'})
})
$buttons.eq(1).on('click',function(){  
    $slides.css({transform:'translateX(-250px)'})
})
$buttons.eq(2).on('click',function(){  
    $slides.css({transform:'translateX(-500px)'})
})      

這個方案從最後一張到第一張時,或者從第一張到最後一張時,一定會經過中間的圖檔,無法做到無縫輪播。

我們使用讨巧的辦法,在第一張前面隐藏最後一張圖檔的複制,最後一張後面隐藏第一張的複制,這樣在最後一張時點選下一張就能到第一張,但這個時候需要把假冒的第一張狸貓換太子,變成真的第一張不然就穿幫了。

let $firstCopy = $images.eq(0).clone(true) 
//clone()可選布爾值。規定是否複制元素的所有事件處理。
let $lastCopy = $images.eq(2).clone(true)
$slides.append($firstCopy)$slides.prepend($lastCopy)      

既然增加了兩張圖檔,相應的位置也要做一些調整。把複制的最後一張圖檔隐藏掉

$slides.css({transform:'translateX(-250px)'})      

接下開就是位置檢測,給三張圖檔添加标記

let current = 0
$buttons.eq(0).on('click',function(){  
    $slides.css({transform:'translateX(-250px)'})  
    current = 0
})
$buttons.eq(1).on('click',function(){  
    $slides.css({transform:'translateX(-500px)'})  
    current = 1
})
$buttons.eq(2).on('click',function(){  
    $slides.css({transform:'translateX(-750px)'})  
    current = 2
})      

當current值為2(第三張)同時按鈕1被點選時,為了達到無縫效果,需要播放下一頁,露出copy的第一張。

$buttons.eq(0).on('click',function(){  
    if(current === 2){    
        $slides.css({transform:'translateX(-1000px)'}) 
    }else{    
        $slides.css({transform:'translateX(-250px)'})   
        current = 0  
}})      

現在把copy的第一張變成真正的第一張。

$buttons.eq(0).on('click',function(){  
    if(current === 2){    
        $slides.css({transform:'translateX(-1000px)'})    
        .one('transitionend',function(){      
        $slides.addClass('hide')      
        $slides.css({transform:'translateX(-250px)'})      
        .offset()      
        $slides.remooveClass('hide')      
        current = 0    
})}else{    
        $slides.css({transform:'translateX(-250px)'})    
        current = 0  
}})      

先将輪播隐藏,然後偷偷地換掉圖檔,offset()會計算元素偏移的位置,隐藏掉圖檔更換的過程。

本文完〜