jQuery實現(xiàn)輪播

題目1:輪播的實現(xiàn)原理是怎樣的?如果讓你來實現(xiàn)扣汪,你會抽象出哪些函數(shù)(or接口)供使用?(比如 play())

輪播原理.jpg
布局:

設(shè)置一個整體輪播容器锨匆,給容器設(shè)置一個圖片的寬高崭别,設(shè)置相對定位,并且設(shè)置overflow:hide 隱藏溢出部分恐锣。輪播容器內(nèi)創(chuàng)建圖片容器和焦點切換容器茅主,設(shè)置圖片容器,高度為圖片高度土榴,寬度為所有包含的圖片寬度(可以不設(shè)置寬度诀姚,但需要使用jQ添加計算后的所有圖片寬度),把所有圖片排成一列玷禽,便于實現(xiàn)輪播赫段。設(shè)置一個焦點選項區(qū)域,相對于輪播容器定位在底部矢赁。

邏輯:

通過移動內(nèi)容塊的位置糯笙,使內(nèi)容塊內(nèi)部的元素達到切換效果,具體實現(xiàn)為:在尾部clone第一個元素撩银,在頭部clone最后一個元素并相應(yīng)增加圖片容器的寬度给涕;當運動到clone首圖片時,立即移動到真實首圖片蜒蕾,當運動到clone尾圖片時稠炬,就立即將其移動到真實尾圖片,這樣我們的肉眼看上去就是連貫循環(huán)的咪啡。當快速切換到不同頁面時就需要知道當前正在展現(xiàn)的是哪一頁首启,可以設(shè)置一個標記位,初始值為0撤摸,每次切換時這個標記位的值都要跟著改變毅桃。

函數(shù)接口:
  • autoPlay() 自動輪播
  • playNext() 切換到下一頁
  • playPre() 切換到上一頁
  • setBullet() 設(shè)置焦點切換效果

題目2:實現(xiàn)視頻中的左右滾動無限循環(huán)輪播效果

css部分

  .carousel{
      position: relative;
      width: 320px;
      height: 180px;
      overflow: hidden;
  }
  .carousel ul,
  .carousel li{
      margin: 0;
      padding: 0;
      list-style: none;
  }
  .carousel .img-ct{
      position: absolute;
      overflow: hidden;
  }
  .carousel .img-ct>li{
      float: left;
  }
  .carousel .img-ct img{
      width: 320px;
      height: 180px;
  }
  .carousel .arrow{
      position: absolute;
      top: 50%;
      margin-top: -15px;
      display: inline-block;
      width: 30px;
      height: 30px;
      border-radius: 50%;
      border: 1px solid #fff;
      line-height: 30px;
      color: #fff;
      text-align: center;
      text-decoration: none;
  }
  .carousel .arrow:hover{
      opacity: 0.8;
  }
  .carousel .pre{
      left: 10px;
  }
  .carousel .next{
      right: 10px;
  }
  .carousel .bullets{
      position: absolute;
      bottom: 10px;
      font-size: 0;
      width: 100%;
      z-index: 1;
      text-align: center;
  }
  .carousel .bullets > li{
      display: inline-block;
      width: 30px;
      height: 5px;
      border: 1px solid #ccc;
      border-radius: 4px;
      cursor: pointer;
      margin: 0 3px;
  }
  .carousel .bullets > li.active{
      background-color: #ccc;
  }

HTML部分

<div class="carousel">
    <ul class="img-ct">
        <li data-id=0>
            <a href="#">
                ![](http://upload-images.jianshu.io/upload_images/6005909-86f49e432575d271.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            </a>
        </li>
        <li data-id=1>
            <a href="#">
                ![](http://upload-images.jianshu.io/upload_images/6005909-ddd21ffff5534f31.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            </a>
        </li>
        <li data-id=2>
            <a href="#">
                ![](http://upload-images.jianshu.io/upload_images/6005909-b6b9c506d210731d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            </a>
        </li>
        <li data-id=3>
            <a href="#">
                ![](http://upload-images.jianshu.io/upload_images/6005909-81c5c7a40d5083e7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            </a>
        </li>
    </ul>
    <a href="#" class="pre arrow"><</a>
    <a href="#" class="next arrow">></a>
    <ul class="bullets">
        <li class="active"></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>

jQuery部分

var $imgCt = $('.carousel .img-ct')
//獲取圖片容器
var $imgs = $('.carousel .img-ct>li')
//獲取所有圖片
var $preBtn = $('.carousel .pre')
//獲取上一頁按鈕
var $nextBtn = $('.carousel .next')
//獲取下一頁按鈕
var $bullets = $('.carousel .bullets li')
//獲取所有焦點

var pageIndex = 0;
//當前圖片下標
var isAnimate = false
//防止用戶的重復(fù)點擊褒纲,加鎖
var imgCount = $imgs.length
//獲取所有圖片長度
var imgWidth = $imgs.width()
//獲取單個圖片寬度
$imgCt.append($imgs.first().clone())
//克隆第一個圖片,添加到圖片容器最后
$imgCt.prepend($imgs.last().clone())
//克隆最后一個圖片钥飞,添加到圖片容器最前
$imgCt.width(( imgCount + 2 ) * imgWidth )
//把圖片容器的寬度莺掠,設(shè)置為([原始圖片個數(shù)+后來新增的2個] x 一個圖片寬度)
$imgCt.css({left:-imgWidth})
//圖片容器向左移動負一個圖片寬度(整體左移一個圖片位置)
$nextBtn.click(function(){
    playNext(1) //點擊下一張按鈕,執(zhí)行函數(shù) 展示 下一頁
})
$preBtn.click(function(){
    playPre(1) //點擊上一張按鈕读宙,執(zhí)行函數(shù) 展示 上一頁
})

/*點擊焦點定位部分*/
$bullets.click(function(){
    var index = $(this).index()  //獲取點擊焦點下標
    if( index > pageIndex ){ //如果點擊的下標大于當前圖片的下標
    playNext( index - pageIndex )  //調(diào)用下一頁函數(shù)(滾動格數(shù)為: [點擊下標 - 當前圖片的下標位置])
    }else if(index < pageIndex){    //如果點擊的下標 小于 當前圖片的下標位置
        playPre( pageIndex - index )  //調(diào)用向前滾動函數(shù)(滾動格數(shù)為: [當前圖片的下標位置 - 點擊下標])
    }
})

function playNext(len){
    if(isAnimate) return;  //正在動畫中彻秆,return掉
    isAnimate = true ;  //表示現(xiàn)在要動畫了 加鎖
    $imgCt.animate({
        left: '-=' + len * imgWidth //在原來基礎(chǔ)上,再減少 len 個圖片寬度的值
    },function(){   //當執(zhí)行完之后
        pageIndex += len; //一次加上滾動的頁碼
        if( pageIndex === imgCount ){   //當點擊到[原始圖片個數(shù)](4)
            pageIndex = 0;
            $imgCt.css({left:-imgWidth})    //回到初始位置
        }  //這里用.css 沒有動畫效果结闸,立刻切換到
        setBullet() //調(diào)用焦點切換函數(shù)
        isAnimate = false;  //動畫完成之后 解鎖
    })
}
function playPre(len){
    $imgCt.animate({
        left:'+='+len*imgWidth  //在原來基礎(chǔ)上唇兑,再加上 len 個圖片寬度的值
    },function(){
        pageIndex -= len  //一次減去滾動的頁碼
        if(pageIndex < 0){  //當滾動到最前一張
            pageIndex = imgCount - 1  //總數(shù)-1(3) 切換到最后一張
            $imgCt.css({left:-imgCount*imgWidth})
        }  //讓圖片切換過去
        setBullet()   //調(diào)用焦點切換函數(shù)
    })
}

function setBullet(){
    $bullets.removeClass('active')  //全部去掉.active
            .eq(pageIndex)  //點擊的那個
            .addClass('active') //添加.active
}

//自動輪播部分
// setInterval(function(){
//     playNext(1)
// },3000)
我的代碼

題目3:實現(xiàn)一個漸變輪播效果, 效果范例444

我的代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桦锄,隨后出現(xiàn)的幾起案子扎附,更是在濱河造成了極大的恐慌,老刑警劉巖结耀,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件留夜,死亡現(xiàn)場離奇詭異,居然都是意外死亡图甜,警方通過查閱死者的電腦和手機碍粥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來具则,“玉大人即纲,你說我怎么就攤上這事具帮〔├撸” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵蜂厅,是天一觀的道長匪凡。 經(jīng)常有香客問我,道長掘猿,這世上最難降的妖魔是什么病游? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮稠通,結(jié)果婚禮上衬衬,老公的妹妹穿的比我還像新娘。我一直安慰自己改橘,他們只是感情好滋尉,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞主,像睡著了一般狮惜。 火紅的嫁衣襯著肌膚如雪高诺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天碾篡,我揣著相機與錄音虱而,去河邊找鬼。 笑死开泽,一個胖子當著我的面吹牛牡拇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穆律,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诅迷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了众旗?” 一聲冷哼從身側(cè)響起罢杉,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贡歧,沒想到半個月后滩租,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡利朵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年律想,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绍弟。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡技即,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出樟遣,到底是詐尸還是另有隱情而叼,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布豹悬,位于F島的核電站葵陵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞻佛。R本人自食惡果不足惜脱篙,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伤柄。 院中可真熱鬧绊困,春花似錦、人聲如沸适刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔗彤。三九已至川梅,卻和暖如春疯兼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贫途。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工吧彪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丢早。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓姨裸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怨酝。 傳聞我的和親對象是個殘疾皇子傀缩,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容