|
封裝了兩種模式: 點(diǎn)擊滾動(dòng)版本DEMO 自動(dòng)滾動(dòng)版本DEMO,源碼中有詳細(xì)注釋.
思路:
點(diǎn)擊滾動(dòng)模式下,是為點(diǎn)擊(向前/向后/數(shù)字)添加click事件,通過(guò)控制展示區(qū)塊left值實(shí)現(xiàn)切換.
1.向前(左):當(dāng)在第一個(gè)版面時(shí),滾動(dòng)到最后一個(gè)頁(yè)面,否則,累加left值,向前滾動(dòng);
2.向后(右):當(dāng)在最后一個(gè)版面時(shí),滾動(dòng)到第一個(gè)頁(yè)面,否則,累減left值,向后滾動(dòng);
3.數(shù)字點(diǎn)擊:利用index(…)獲取當(dāng)前點(diǎn)擊在數(shù)字列表中的索引值, 然后索引值為倍數(shù)為外圍寬度負(fù)值.即可達(dá)到切換.
核心代碼:
復(fù)制代碼 代碼如下:
//@Mr.Think***向前滾動(dòng)
$pre.click(function(){
if (!$showbox.is(':animated')) { //判斷展示區(qū)是否動(dòng)畫
if ($cur == 1) { //在第一個(gè)版面時(shí),再向前滾動(dòng)到最后一個(gè)版面
$showbox.animate({
left: '-=' + $w * ($pages - 1)
}, 500); //改變left值,切換顯示版面,500(ms)為滾動(dòng)時(shí)間,下同
$cur = $pages; //初始化版面為最后一個(gè)版面
}
else {
$showbox.animate({
left: '+=' + $w
}, 500); //改變left值,切換顯示版面
$cur--; //版面累減
}
$num.eq($cur - 1).addClass('numcur').siblings().removeClass('numcur'); //為對(duì)應(yīng)的版面數(shù)字加上高亮樣式,并移除同級(jí)元素的高亮樣式
}
});
//@Mr.Think***向后滾動(dòng)
$next.click(function(){
if (!$showbox.is(':animated')) { //判斷展示區(qū)是否動(dòng)畫
if ($cur == $pages) { //在最后一個(gè)版面時(shí),再向后滾動(dòng)到第一個(gè)版面
$showbox.animate({
left: 0
}, 500); //改變left值,切換顯示版面,500(ms)為滾動(dòng)時(shí)間,下同
$cur = 1; //初始化版面為第一個(gè)版面
}
else {
$showbox.animate({
left: '-=' + $w
}, 500);//改變left值,切換顯示版面
$cur++; //版面數(shù)累加
}
$num.eq($cur - 1).addClass('numcur').siblings().removeClass('numcur'); //為對(duì)應(yīng)的版面數(shù)字加上高亮樣式,并移除同級(jí)元素的高亮樣式
}
});
//@Mr.Think***數(shù)字點(diǎn)擊事件
$num.click(function(){
if (!$showbox.is(':animated')) { //判斷展示區(qū)是否動(dòng)畫
var $index = $num.index(this); //索引出當(dāng)前點(diǎn)擊在列表中的位置值
$showbox.animate({
left: '-' + ($w * $index)
}, 500); //改變left值,切換顯示版面,500(ms)為滾動(dòng)時(shí)間
$cur = $index + 1; //初始化版面值,這一句可避免當(dāng)滾動(dòng)到第三版時(shí),點(diǎn)擊向后按鈕,出面空白版.index()取值是從0開(kāi)始的,故加1
$(this).addClass('numcur').siblings().removeClass('numcur'); //為當(dāng)前點(diǎn)擊加上高亮樣式,并移除同級(jí)元素的高亮樣式
}
});
自動(dòng)滾動(dòng)模式是基于點(diǎn)擊滾動(dòng)模式加強(qiáng)的,無(wú)非是添加了自動(dòng)滾動(dòng)事件,以及當(dāng)鼠標(biāo)劃上時(shí)清除動(dòng)畫事件.
這里要說(shuō)明一點(diǎn).DEMO演示中,為向前/向后/數(shù)字/區(qū)域都添加了當(dāng)鼠標(biāo)劃過(guò)時(shí)都添加了清除動(dòng)畫事件.但是,如果你的頁(yè)面中,這幾個(gè)需要添加清除動(dòng)畫事件的都在同一個(gè)區(qū)域內(nèi),完全可以用trigger(…)模擬實(shí)現(xiàn)自動(dòng)滾動(dòng).
還有一點(diǎn),自動(dòng)滾動(dòng)中是用setTimeout(“fun”,interval)實(shí)現(xiàn),而不用setInterval(“fun”,interval)實(shí)現(xiàn). 原因在于,setInterval是在間隔時(shí)間后重復(fù)執(zhí)行傳入的函數(shù),而setTimeout只在間隔時(shí)間后執(zhí)行一次函數(shù)傳入函數(shù),這樣即可避免第二次鼠標(biāo)劃入停止動(dòng)畫區(qū)域時(shí)不能清除動(dòng)畫.
核心代碼:
復(fù)制代碼 代碼如下:
......
//@Mr.Think***調(diào)用自動(dòng)滾動(dòng)
autoSlide();
......
//@Mr.Think***停止?jié)L動(dòng)
clearFun($showbox);
clearFun($pre);
clearFun($next);
clearFun($num);
//@Mr.Think***事件劃入時(shí)停止自動(dòng)滾動(dòng)
function clearFun(elem){
elem.hover(function(){
clearAuto();
}, function(){
autoSlide();
});
}
//@Mr.Think***自動(dòng)滾動(dòng)
function autoSlide(){
$next.trigger('click');
$autoFun = setTimeout(autoSlide, 3000);//此處不可使用setInterval,setInterval是重復(fù)執(zhí)行傳入函數(shù),這會(huì)引起第二次劃入時(shí)停止失效
}
//@Mr.Think***清除自動(dòng)滾動(dòng)
function clearAuto(){
clearTimeout($autoFun);
}
更詳細(xì)代碼分析,請(qǐng)查看源碼,寫有詳細(xì)的注釋.
代碼打包下載
JavaScript技術(shù):基于jQuery的可以控制左右滾動(dòng)及自動(dòng)滾動(dòng)效果的代碼,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。