jQuery 幻燈片的實(shí)現(xiàn)原理

淡入淡出的輪播

  • slide-ul 是幻燈片的盒子 包括了所有的img position: relative;
  • img position: absolute; 全部隱藏脾歇,默認(rèn)顯示第一張圖片
  • pageIndex 分頁索引對應(yīng) img 的索引
  • 在點(diǎn)擊分頁索引時(shí) 給對應(yīng)的 img 顯示池摧,其它的 img 隱藏
  • 設(shè)置一個(gè)定時(shí)器函數(shù)每三秒執(zhí)行一次,每次都傳入 pageIndex 實(shí)現(xiàn)定時(shí)切換 默認(rèn)是 0 判斷 (pageIndex++ >= img.length) ? 0 : pageIndex++
  • 鼠標(biāo)移入圖片清除定時(shí)器 鼠標(biāo)移出時(shí)重啟定時(shí)器

實(shí)例代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery-slide-fadeIn</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        body {
            font-family: "Droid Serif","Helvetica Neue",Helvetica,Arial,sans-serif;
            font-size: 14px;
        }
        .clearfix:after{
            content: "";
            display: block;
            clear: both;
        }
        input,button,select,textarea{
            outline:none;border: none;
        }
        a{
            text-decoration: none;
            color: #fff;
        }
        ul,li{
            list-style: none;
        }
        img{
            border: none;
        }
        .wrap{
            width: 790px;
            margin: 20px auto;
        }
        .slide-box{
            height: 340px;
            overflow: hidden;
            position: relative;
        }
        .slide-left{
            width: 100%;
            position: relative;
        }
        .slide-left li{
            position: absolute;
            display: none;
        }
        .slide-left li a{
            display: block;
        }
        .slide-left li a img{
            width: 100%;
        }
      
        .slider-indicator{
            position: absolute;
            z-index: 1;
            left: 50%;
            transform: translateX(-50%);
            bottom: 20px;
            font-size: 0;
            padding: 4px 8px;
            border-radius: 12px;
            background-color: rgba(255, 255, 255, 0.3);
        }
        .slider-indicator i{
            display: inline-block;
            margin-right: 10px;
            width: 12px;
            height: 12px;
            border-radius: 100%;
            background-color: #fff;
            cursor: pointer;
        }
        .slider-indicator i.page-active{
            background-color: #2196F3;
        }
        .slide-btn{
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            z-index: 1;
            display: block;
            width: 40px;
            height: 50px;
            line-height: 45px;
            background-color: rgba(0,0,0,.2);
            font-size: 20px;
            text-align: center;
            display: none;
        }
        .slider-prev{
            left: 0;
            border-top-right-radius: 6px;
            border-bottom-right-radius: 6px;
        }
        .slider-next{
            right: 0;
            border-top-left-radius: 6px;
            border-bottom-left-radius: 6px;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="slide-box clearfix">
            <ul class="slide-left"></ul>
            <div class="slider-indicator"></div>
            <a href="javascript:void(0)" class="slide-btn slider-prev">&lt;</a>
            <a href="javascript:void(0)" class="slide-btn slider-next">&gt;</a>
        </div>
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script>
    $(function(){
        var data = [{
            url: '#1',
            img: '//img11.360buyimg.com/da/jfs/t4657/90/3561484677/83893/f05ac312/59004d0dNc66933b4.png'
        },
        {
            url: '#2',
            img: '//img1.360buyimg.com/da/jfs/t5122/78/482212244/90225/c4ccd3b7/59001933Nb4a11a00.jpg'
        },
        {
            url: '#3',
            img: '//img12.360buyimg.com/da/jfs/t3172/29/7532815266/78514/96c6e177/58ba3348N479cafe1.jpg'
        },
        {
            url: '#4',
            img: '//img20.360buyimg.com/da/jfs/t4249/102/1331521120/224199/40dcb547/58c0b221N5acfd3c6.jpg'
        },
        {
            url: '#5',
            img: '//img13.360buyimg.com/da/jfs/t5518/250/560655744/102051/9f4965b2/5901d835N6c3481c7.jpg'
        }];

        var slide = $('.slide-box');
        var prev = $('.slider-prev');
        var next = $('.slider-next');
        var slideLeftData = $('.slide-left');
        var slideIndicator = $('.slider-indicator');
        var index = 0,slideAuto=null,isAnimate=false;

        var slideData = '';     // 數(shù)據(jù)
        var pageIndicator = ''; // page的小點(diǎn)
        $.each(data, function(index, val) {
            slideData += "<li data-id="+index+"><a href="+val.url+">![](+val.img+)</a></li>";
            pageIndicator += "<i></i>";
        });
        slideLeftData.append(slideData);    // 給左邊盒子添加圖片信息

        slideIndicator.append(pageIndicator).find('i').eq(0).addClass('page-active'); // 給第一個(gè)小點(diǎn)添加樣式
        $('.slide-left li').eq(0).show();

        prev.on('click', prevPage);     // 點(diǎn)擊上一頁
        next.on('click', nextPage); // 點(diǎn)擊下一頁
        // 自動(dòng)運(yùn)行函數(shù)
        var autoRun = function(){
            slideAuto = setInterval(function(){
                nextPage(index);
            }, 3000)
        }
        autoRun();
        // 上一頁
        function prevPage(){
            if(isAnimate){ return;}
            isAnimate = true;
            index--;
            if(index < 0){
                index = data.length -1;
            }
            slideLeftData.find('li').eq(index).fadeIn().siblings().fadeOut();
            slidePage(index);
            isAnimate = false;
        }
        
        // 下一頁
        function nextPage(){
            if(isAnimate){ return;}
            isAnimate = true;
            index++;
            if(index >= data.length){
                index = 0;
            }
            slideLeftData.find('li').eq(index).fadeIn().siblings().fadeOut();
            slidePage(index);
            isAnimate = false;
        }
        // page
        slideIndicator.on('mouseenter', 'i', function(){
            var pageIndex = $(this).index();
            index = pageIndex;
            $(this).addClass('page-active').siblings().removeClass('page-active');
            slideLeftData.find('li').eq(pageIndex).fadeIn().siblings().fadeOut();
        });
        // 獲取當(dāng)前page 并添加樣式
        function slidePage(){
            slideIndicator.find('i').eq(index).addClass('page-active').siblings().removeClass('page-active')
        }
        // 鼠標(biāo)移入時(shí)
        slide.on('mouseenter', function(){
            $('.slide-btn').show();     // 顯示左右的按鈕
            clearInterval(slideAuto);   // 清除定時(shí)器
        });
        // 鼠標(biāo)移出時(shí)
        slide.on('mouseleave', function(){
            $('.slide-btn').hide();     // 隱藏左右的按鈕
            autoRun();                  // 繼續(xù)運(yùn)行定時(shí)器
        }); 
    });
    </script>
</body>
</html>

輪播1在線查看

左右無縫切換的輪播

  • slide-box 是包括幻燈片的盒子逻杖,設(shè)置overflow: hidden;
  • slide-ul 是幻燈片的盒子(寬度為img的寬度*img的length) 包括了所有的img(浮動(dòng)在一行)
  • 分別給 幻燈片的盒子 最前面克隆 img 的最后一個(gè)闻伶,最后面克隆 img 的第一個(gè) 4,0,1,2,3,4,0
  • 此時(shí)克隆了兩個(gè)蓝翰,重新給圖片盒子寬度添加總長度, 給第0個(gè)寫一個(gè) left -img (一個(gè)寬度)就顯示真正的第一個(gè)圖片
  • 每點(diǎn)擊下一頁時(shí) (pageIndex++ > imgLength -1) ? 0 : pageIndex++; 根據(jù)對應(yīng)的pageIndex操作 left
  • 每點(diǎn)擊上一頁時(shí) (pageIndex-- < 0) ? imgLength-1 : pageIndex--; 在對應(yīng)的pageIndex操作 left
  • 點(diǎn)擊到最后一個(gè)和最前面一個(gè)圖片時(shí)爆雹,在動(dòng)畫效果結(jié)果后操作css讓元素left值變成對應(yīng)克隆的對象left,造成一個(gè)無限切換的錯(cuò)覺

實(shí)例代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery-slide-無縫滾動(dòng)</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        body {
            font-family: "Droid Serif","Helvetica Neue",Helvetica,Arial,sans-serif;
            font-size: 14px;
        }
        .clearfix:after{
            content: "";
            display: block;
            clear: both;
        }
        input,button,select,textarea{
            outline:none;border: none;
        }
        a{
            text-decoration: none;
            color: #fff;
        }
        ul,li{
            list-style: none;
        }
        img{
            border: none;
        }
        .wrap{
            width: 790px;
            margin: 20px auto;
        }
        .slide-box{
            height: 340px;
            overflow: hidden;
            position: relative;
        }
        .slide-ul{
            width: 100%;
            position: relative;
        }
        .slide-ul li{
            width: 790px;
            float: left;
        }
        .slide-ul li a{
            display: block;
        }
        .slide-ul li a img{
            width: 100%;
        }
      
        .slider-indicator{
            position: absolute;
            z-index: 1;
            left: 50%;
            transform: translateX(-50%);
            bottom: 20px;
            font-size: 0;
            padding: 4px 8px;
            border-radius: 12px;
            background-color: rgba(255, 255, 255, 0.3);
        }
        .slider-indicator i{
            display: inline-block;
            margin-right: 10px;
            width: 12px;
            height: 12px;
            border-radius: 100%;
            background-color: #fff;
            cursor: pointer;
        }
        .slider-indicator i.page-active{
            background-color: #2196F3;
        }
        .slide-btn{
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            z-index: 1;
            display: block;
            width: 40px;
            height: 50px;
            line-height: 45px;
            background-color: rgba(0,0,0,.2);
            font-size: 20px;
            text-align: center;
            display: none;
        }
        .slider-prev{
            left: 0;
            border-top-right-radius: 6px;
            border-bottom-right-radius: 6px;
        }
        .slider-next{
            right: 0;
            border-top-left-radius: 6px;
            border-bottom-left-radius: 6px;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="slide-box clearfix">
            <ul class="slide-ul"></ul>
            <div class="slider-indicator"></div>
            <a href="javascript:void(0)" class="slide-btn slider-prev">&lt;</a>
            <a href="javascript:void(0)" class="slide-btn slider-next">&gt;</a>
        </div>
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <script>
    $(function(){
        var data = [{
            url: '#1',
            img: '//img11.360buyimg.com/da/jfs/t4657/90/3561484677/83893/f05ac312/59004d0dNc66933b4.png'
        },
        {
            url: '#2',
            img: '//img1.360buyimg.com/da/jfs/t5122/78/482212244/90225/c4ccd3b7/59001933Nb4a11a00.jpg'
        },
        {
            url: '#3',
            img: '//img12.360buyimg.com/da/jfs/t3172/29/7532815266/78514/96c6e177/58ba3348N479cafe1.jpg'
        },
        {
            url: '#4',
            img: '//img20.360buyimg.com/da/jfs/t4249/102/1331521120/224199/40dcb547/58c0b221N5acfd3c6.jpg'
        },
        {
            url: '#5',
            img: '//img13.360buyimg.com/da/jfs/t5518/250/560655744/102051/9f4965b2/5901d835N6c3481c7.jpg'
        }];

        var slide = $('.slide-box'),    // 幻燈片盒子
            prev = $('.slider-prev'),   // 上一頁按鈕
            next = $('.slider-next'),   // 下一頁按鈕
            slideUl = $('.slide-ul'),   // 圖片盒子
            slideIndicator = $('.slider-indicator'),    // 中部page盒子
            pageIndex = 0,      // page索引
            slideAuto=null,     // 自動(dòng)滾動(dòng)方法
            isAnimate=false,    // 事件鎖
            slideData = '',     // img數(shù)據(jù)變量
            pageIndicator = ''; // page的小點(diǎn)變量

        // 循環(huán)添加img數(shù)據(jù)和page小點(diǎn)的個(gè)數(shù)
        $.each(data, function(index, val) {
            slideData += "<li data-id="+index+"><a href="+val.url+">![](+val.img+)</a></li>";
            pageIndicator += "<i></i>";
        });
        // 給盒子添加圖片信息
        slideUl.append(slideData);  
        // 給page盒子添加小點(diǎn)并給第一個(gè)添加 page-active 樣式
        slideIndicator.append(pageIndicator).find('i').eq(0).addClass('page-active'); 
        // 默認(rèn)給第一個(gè)li添加顯示
        $('.slide-ul li').eq(0).show();
        // 獲取圖片盒子里面的 li 個(gè)數(shù)
        var imgLength = slideUl.children().length;
        // 分別給 圖片盒子 最前面克隆 li 最后一個(gè)脾歧,最后面克隆 li 第一個(gè) [4,0,1,2,3,4,0]
        var lastLi = slideUl.find('li').last(); 
        var firstLi = slideUl.find('li').first();
        slideUl.prepend(lastLi.clone())
        slideUl.append(firstLi.clone());

        // 獲取克隆后圖片盒子里面的 li 個(gè)數(shù) 
        var countLength = slideUl.children().length;
        // 單獨(dú)一個(gè)li的盒子寬度
        var slideLiWidth = slideUl.find('li').width();
        // 重新計(jì)算出 圖片盒子 的寬度 讓 li 浮動(dòng)在一行 
        var boxWidth = countLength * slideLiWidth;
        // 給圖片盒子寬度添加總長度 然后第一個(gè)看到的是克隆的那個(gè),所以給個(gè) - 一個(gè)li寬度 就顯示真正的第一個(gè) 
        slideUl.css({'left': -slide.width(), width: boxWidth});

        // 點(diǎn)擊上一頁
        prev.on('click', function(){
            prevPage(1)
        });     
        // 點(diǎn)擊下一頁
        next.on('click', function(){
            nextPage(1);
        });
        
        // 自動(dòng)運(yùn)行函數(shù)
        var autoRun = function(){
            slideAuto = setInterval(function(){
                nextPage(1);
            }, 3000)
        }
        autoRun();
        // 上一頁
        function prevPage(len){
            if(isAnimate){ return;}
            isAnimate = true;
            pageIndex -=len;
            // '-='+slideLiWidth 0 -790px -1580px -2370px -3160px -3950px
            slideUl.animate({left: '+='+len*slideLiWidth },function(){
                if( pageIndex < 0){
                    pageIndex = imgLength-1; // 獲取最后一個(gè)
                    slideUl.css({left: -slideLiWidth*imgLength}); // 默認(rèn)回到 -3950px 也就是第后一個(gè)
                }
                isAnimate = false;
                slidePage(pageIndex); // 獲取當(dāng)前的 小點(diǎn) 狀態(tài) 
            });

        }
        // 下一頁
        function nextPage(len){
            if(isAnimate){ return;}
            isAnimate = true;
            pageIndex += len;
            console.log( pageIndex )
            // '-='+slideLiWidth -790px -1580px -2370px -3160px -3950px
            slideUl.animate({left: '-='+len*slideLiWidth },function(){
                // 判斷當(dāng)前索引是否等于img圖片的長度(沒克隆前的長度)
                if(pageIndex > imgLength -1 ){
                    pageIndex = 0;  // 給索引值設(shè)置為0 也就是當(dāng)前一個(gè)
                    slideUl.css({left: -slideLiWidth}); // 默認(rèn)回到 -790px 也就是第0個(gè)
                }
                isAnimate = false;
                slidePage(pageIndex); // 獲取當(dāng)前的 小點(diǎn) 狀態(tài) 
            });
        }
        // 點(diǎn)擊切換
        slideIndicator.on('click', 'i', function(){
            var index = $(this).index();
            $(this).addClass('page-active').siblings().removeClass('page-active');
            if(pageIndex > index){          // 當(dāng)前page 大于 當(dāng)前索引
                prevPage(pageIndex - index); // 向后移動(dòng)
            }else{
                nextPage(index - pageIndex); // 向前移動(dòng)
            }
        });
        // 獲取當(dāng)前page 并添加樣式
        function slidePage(){
            slideIndicator.find('i').removeClass('page-active').eq(pageIndex).addClass('page-active')
        }
        // 鼠標(biāo)移入時(shí)
        slide.on('mouseenter', function(){
            $('.slide-btn').show();     // 顯示左右的按鈕
            clearInterval(slideAuto);   // 清除定時(shí)器
        });
        // 鼠標(biāo)移出時(shí)
        slide.on('mouseleave', function(){
            $('.slide-btn').hide();     // 隱藏左右的按鈕
            autoRun();                  // 繼續(xù)運(yùn)行定時(shí)器
        }); 
    });
    </script>
</body>
</html>

輪播2在線查看

制作簡書首頁的幻燈片

  • 功能結(jié)合了淡入淡出和無縫滾動(dòng)

輪播3在線查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末座云,一起剝皮案震驚了整個(gè)濱河市圃阳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬隶,老刑警劉巖理疙,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砖顷,死亡現(xiàn)場離奇詭異,居然都是意外死亡物咳,警方通過查閱死者的電腦和手機(jī)芯肤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門击蹲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人类咧,你說我怎么就攤上這事岭佳。” “怎么了叶洞?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵艺晴,是天一觀的道長仅财。 經(jīng)常有香客問我亿眠,道長,這世上最難降的妖魔是什么爹耗? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮账蓉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箱玷。我一直安慰自己舶得,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布颖对。 她就那樣靜靜地躺著番捂,像睡著了一般犁河。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魏烫,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音罚舱,去河邊找鬼窃肠。 笑死树灶,一個(gè)胖子當(dāng)著我的面吹牛泊窘,可吹牛的內(nèi)容都是我干的携悯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侮叮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤挤渐,失蹤者是張志新(化名)和其女友劉穎浴麻,沒想到半個(gè)月后得问,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓骚,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胚委,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年亩冬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硅急。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跪另,死狀恐怖免绿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤狰晚,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布碘裕,位于F島的核電站,受9級(jí)特大地震影響攒钳,放射性物質(zhì)發(fā)生泄漏帮孔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一不撑、第九天 我趴在偏房一處隱蔽的房頂上張望文兢。 院中可真熱鬧,春花似錦焕檬、人聲如沸姆坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兼呵。三九已至,卻和暖如春腊敲,著一層夾襖步出監(jiān)牢的瞬間萍程,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工兔仰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茫负,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓乎赴,卻偏偏與公主長得像忍法,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子榕吼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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