[未完結(jié)]圖片輪播圖

demo效果:
css布局:

    * {
           margin: 0;
           padding: 0;
           text-decoration: none;
       }
       body {
           padding: 20px;
       }
       #container {
           width: 600px;
           height: 400px;
           border: 3px solide #333;
           overflow: hidden;
           position: relative;
       }
       #list {
           background-color: red;
           width: 3000px;  /* 7*600 = 4200px */
           height: 400px;  /*一共有七張圖(600*400)*/
           position: absolute;
           z-index: 1;
       }
       #list img {
           float: left;
       }
       #buttons {
           position: absolute;
           height: 10px;
           width: 100px;
           z-index: 2;
           bottom: 20px;
           left: 250px;
       }
       #buttons span {
           cursor: pointer;
           float: left;
           border: 1px solid #fff;
           width: 10px;
           height: 10px;
           border-radius: 50%;
           background: #333;
           margin-right: 5px;
       }
       #buttons .on {
           background: orangered;
       }
       .arrow {
           cursor: pointer;
           display: none;
           line-height: 39px;
           text-align: center;
           font-size: 36px;
           font-weight: bold;
           width: 40px;
           height: 40px;
           position: absolute;
           z-index: 2;
           top: 180px;
           background-color: rgba(0, 0, 0, .3);
           color: #fff;
       }
       .arrow:hover {
           background-color: rgba(0, 0, 0, .7);
       }
       #container:hover .arrow {
           display: block;
       }
       #prev {
           left: 20px;
       }

       #next {
           right: 20px;
       }

其次html的大概結(jié)構(gòu):

<div id="container">
   <!-- 這里必須要定位list的left位置為0px -->
   <div id="list" style="left: 0px;">
       ![](img/1.jpg)
       ![](img/2.jpg)
       ![](img/3.jpg)
       ![](img/4.jpg)
       ![](img/5.jpg)
   </div>
   <div id="buttons">
       <span index="1" class="on"></span>
       <span index="2"></span>
       <span index="3"></span>
       <span index="4"></span>
       <span index="5"></span>
   </div>
   <a href="javascript:;" id="prev" class="arrow"><</a>
   <a href="javascript:;" id="next" class="arrow">></a>
</div>

輪播之箭頭切換 & 無限滾動(dòng) 的實(shí)現(xiàn):
代碼如下:

window.onload = function() {
           // 獲取最外層容器container
           var container = document.getElementById('container');
           // 獲取包裹圖片的list容器
           var list = document.getElementById('list');
           // 獲取包裹橙點(diǎn)的span
           var buttons = document.getElementById('buttons').getElementsByTagName('span');
           var prev = document.getElementById('prev');
           var next = document.getElementById('next');

           /**
            * [animate: 箭頭控制圖片位置函數(shù)]
            * @param  {[number]} offset [位移的數(shù)字]
            */
           function animate(offset) {
               // 用newLeft存放加上傳入offset需要改變的新的left值
               var newLeft = parseInt(list.style.left) + offset;
               list.style.left = newLeft + 'px';

               if (newLeft > 0) {
                   list.style.left = -2400 + 'px';
               }
               if (newLeft < -2400) {
                   list.style.left = 0 + 'px';
               }
           }

           next.onclick = function() {
               animate(-600);
           }
           prev.onclick = function() {
               animate(600);
           }
       }

上面的效果完成之后,會(huì)有一個(gè)問題,就是最下面的原點(diǎn)不會(huì)隨著圖片的變化,而當(dāng)前高亮刁愿。解決方案:
index為當(dāng)前原點(diǎn)span中的的索引,并且我們要清楚之前的高亮的樣式到逊。
代碼如下:

var  index = 1;

/**
* [showButton 下面的小圓點(diǎn)按鈕]
*/
function showButton() {
   // 遍歷清除重復(fù)的原點(diǎn)樣式
   for (var i = 0; i < buttons.length; i++) {
       if (buttons[i].className == 'on') {
           buttons[i].className = '';
           break;
       }
   }
   // 取到的button是從0開始計(jì)數(shù)的铣口,但是我們定義的index的初試是從1開始,故要減去1
   buttons[index - 1].className = 'on';  
}

但是到了這里觉壶,會(huì)有一個(gè)小問題脑题,就是當(dāng)我們點(diǎn)擊上面的左右箭頭滑動(dòng)到第一張圖片和最后一張圖片所對應(yīng)的原點(diǎn)的時(shí)候,我們再往前或者往后的時(shí)候铜靶,就不能正常高亮當(dāng)前原點(diǎn)了叔遂。
造成這種現(xiàn)象的主要原因是因?yàn)椋何覀兌x了index,并且隨著pre,和next的點(diǎn)擊,它會(huì)一直增加或者減少争剿,已經(jīng)為0的時(shí)候再減就變成了負(fù)數(shù)了已艰,已經(jīng)為4(對應(yīng)第五張圖)的時(shí)候,還是會(huì)繼續(xù)增加變成5。然而我們圓點(diǎn)對應(yīng)的span的索引只有1到5蚕苇,所以這里我們還應(yīng)該對臨界的兩個(gè)span做一下判斷哩掺。
代碼如下:

next.onclick = function() {
    if (index == 5) {  // 如果到了最后一個(gè)圓點(diǎn)
        index = 1;  // 將index置1
    }
    else {
        index += 1;  // 只要不是最后一個(gè)則加1
    }

    showButton();  // 原代碼不變
    animate(-600);  // 原代碼不變
}
prev.onclick = function() {
    if (index == 1) {  //如果已經(jīng)到了第一個(gè)圓點(diǎn)
        index = 5;  // 直接跳到最后一個(gè)
    }
    else {
        index -= 1;  // 否則可以繼續(xù)累減
    }

    showButton();  // 原代碼不變
    animate(600);  // 原代碼不變
}

經(jīng)過上面的步驟,此時(shí)的代碼如下:

        window.onload = function() {
            // 獲取最外層容器container
            var container = document.getElementById('container');
            // 獲取包裹圖片的list容器
            var list = document.getElementById('list');
            // 獲取包裹橙點(diǎn)的span
            var buttons = document.getElementById('buttons').getElementsByTagName('span');
            var prev = document.getElementById('prev');
            var next = document.getElementById('next');
            var index = 1;

            /**
             * [showButton 下面的小圓點(diǎn)按鈕]
             */
            function showButton() {
                // 遍歷清除重復(fù)的原點(diǎn)樣式
                for (var i = 0; i < buttons.length; i++) {
                    if (buttons[i].className == 'on') {
                        buttons[i].className = '';
                        break;
                    }
                }
                buttons[index - 1].className = 'on';
            }

            /**
             * [animate: 箭頭控制圖片位置函數(shù)]
             * @param  {[number]} offset [位移的數(shù)字]
             */
            function animate(offset) {
                // 用newLeft存放加上傳入offset需要改變的新的left值
                var newLeft = parseInt(list.style.left) + offset;
                list.style.left = newLeft + 'px';

                if (newLeft > 0) {
                    list.style.left = -2400 + 'px';
                }
                if (newLeft < -2400) {
                    list.style.left = 0 + 'px';
                }
            }

            next.onclick = function() {
                if (index == 5) {
                    index = 1;
                }
                else {
                    index += 1;
                }

                showButton();
                animate(-600);
            }
            prev.onclick = function() {
                if (index == 1) {
                    index = 5;
                }
                else {
                    index -= 1;
                }

                showButton();
                animate(600);
            }
        }

實(shí)現(xiàn)點(diǎn)擊下方圓點(diǎn)點(diǎn)擊更新對應(yīng)的圖片

for (var i = 0; i < buttons.length; i++) {
    buttons[i].onclick = function() {
        // 獲取當(dāng)前的index屬性里面的數(shù)字
        var myIndex = parseInt(this.getAttribute('index'));
        // 計(jì)算出圖片要移動(dòng)的距離
        var offset = -600 * (myIndex - index);

        animate(offset);  //調(diào)用animate函數(shù)
        index = myIndex;  // 更新index的值
        showButton();  //調(diào)用函數(shù)使得當(dāng)前圓點(diǎn)高亮
    }
}

雖然以上的函數(shù)已經(jīng)可以實(shí)現(xiàn)功能了涩笤,但是嚼吞,如果我們點(diǎn)擊的按鈕是同一個(gè)盒件,也就是不變,按照上面的函數(shù)舱禽,for循環(huán)還是會(huì)被重新執(zhí)行一次炒刁。所以我們可以在點(diǎn)擊事件里加上一個(gè)if判斷。
代碼如下:

for (var i = 0; i < buttons.length; i++) {
    buttons[i].onclick = function() {
        if (this.className == 'on') {  // 如果點(diǎn)擊的原點(diǎn)已經(jīng)高亮
            return;  // 直接return呢蔫,下面的代碼也不執(zhí)行了
        }

        var myIndex = parseInt(this.getAttribute('index'));
        var offset = -600 * (myIndex - index);

        animate(offset); 
        index = myIndex;  
        showButton(); 
    }
}

PS:
下面這個(gè)函數(shù)切心,能夠獲取一個(gè)元素的任意 CSS 屬性值。


function getStyle(element, attr) {

   if(element.currentStyle) {

       return element.currentStyle[attr];

   } else {

       return getComputedStyle(element, false)[attr];

   }

}
// 比如片吊,本例中如果想獲得 lists 的 left 屬性值,只需要 getStyle(lists,"left")就可以啦协屡。

加上定時(shí)器:

        window.onload = function() {
            // 獲取最外層容器container
            var container = document.getElementById('container');
            // 獲取包裹圖片的list容器
            var list = document.getElementById('list');
            // 獲取包裹橙點(diǎn)的span
            var buttons = document.getElementById('buttons').getElementsByTagName('span');
            var prev = document.getElementById('prev');
            var next = document.getElementById('next');
            var index = 1;
            var  animated = false;

            /**
             * [showButton 下面的小圓點(diǎn)按鈕]
             */
            function showButton() {
                // 遍歷清除重復(fù)的原點(diǎn)樣式
                for (var i = 0; i < buttons.length; i++) {
                    if (buttons[i].className == 'on') {
                        buttons[i].className = '';
                        break;
                    }
                }
                buttons[index - 1].className = 'on';
            }

            /**
             * [animate: 控制圖片位置函數(shù)]
             * @param  {[number]} offset [位移的數(shù)字]
             */
            function animate(offset) {
                animated = true;
                // 用newLeft存放加上傳入offset需要改變的新的left值
                var newLeft = parseInt(list.style.left) + offset;
                var time = 300;   // 位移總時(shí)間
                var interval = 10; // 位移間隔時(shí)間
                var speed =  offset / (time / interval);  // 每次位移量

                /**
                 * [go:位移的判斷以及什么時(shí)候做位移]
                 */
                function go() {
                    if ((speed > 0 && parseInt(list.style.left) < newLeft)
                        || (speed < 0 && parseInt(list.style.left) > newLeft)) {
                        list.style.left = parseInt(list.style.left) + speed + 'px';
                        setTimeout(go, interval);  // 遞歸
                    }
                    else {
                        animated = false;
                        list.style.left = newLeft + 'px';

                        if (newLeft > 0) {
                            list.style.left = -2400 + 'px';
                        }
                        if (newLeft < -2400) {
                            list.style.left = 0 + 'px';
                        }
                    }
                }
                go();
            }

            next.onclick = function() {
                if (index == 5) {
                    index = 1;
                }
                else {
                    index += 1;
                }

                showButton();

                if (!animated) {
                    animate(-600);
                }
            }
            prev.onclick = function() {
                if (index == 1) {
                    index = 5;
                }

                else {
                    index -= 1;
                }

                showButton();
                if (!animated) {
                    animate(600);
                }
            }

            // 實(shí)現(xiàn)點(diǎn)擊下面的按鈕俏脊,圖片也跟著變換
            // 遍歷所有的圓點(diǎn),給他們一個(gè)點(diǎn)擊事件
            for (var i = 0; i < buttons.length; i++) {
                buttons[i].onclick = function() {
                    if (this.className == 'on') {  // 如果點(diǎn)擊的原點(diǎn)已經(jīng)高亮
                        return;  // 直接return肤晓,下面的代碼也不執(zhí)行了
                    }
                    // 獲取當(dāng)前的index屬性里面的數(shù)字
                    var myIndex = parseInt(this.getAttribute('index'));
                    // 計(jì)算出圖片要移動(dòng)的距離
                    var offset = -600 * (myIndex - index);

                    if (!animated) {
                        animate(offset);  //調(diào)用animate函數(shù)
                    }
                    index = myIndex;  // 更新index的值
                    showButton();  //調(diào)用函數(shù)使得當(dāng)前圓點(diǎn)高亮
                }
            }
        }

加上自動(dòng)播放函數(shù):

        window.onload = function() {
            // 獲取最外層容器container
            var container = document.getElementById('container');
            // 獲取包裹圖片的list容器
            var list = document.getElementById('list');
            // 獲取包裹橙點(diǎn)的span
            var buttons = document.getElementById('buttons').getElementsByTagName('span');
            var prev = document.getElementById('prev');
            var next = document.getElementById('next');
            var index = 1;
            var  animated = false;
            var timer;  //存放定時(shí)器

            /**
             * [showButton 下面的小圓點(diǎn)按鈕]
             */
            function showButton() {
                // 遍歷清除重復(fù)的原點(diǎn)樣式
                for (var i = 0; i < buttons.length; i++) {
                    if (buttons[i].className == 'on') {
                        buttons[i].className = '';
                        break;
                    }
                }
                buttons[index - 1].className = 'on';
            }

            /**
             * [animate: 控制圖片位置函數(shù)]
             * @param  {[number]} offset [位移的數(shù)字]
             */
            function animate(offset) {
                animated = true;
                // 用newLeft存放加上傳入offset需要改變的新的left值
                var newLeft = parseInt(list.style.left) + offset;
                var time = 300;   // 位移總時(shí)間
                var interval = 10; // 位移間隔時(shí)間
                var speed =  offset / (time / interval);  // 每次位移量

                /**
                 * [go:位移的判斷以及什么時(shí)候做位移]
                 */
                function go() {
                    if ((speed > 0 && parseInt(list.style.left) < newLeft)
                        || (speed < 0 && parseInt(list.style.left) > newLeft)) {
                        list.style.left = parseInt(list.style.left) + speed + 'px';
                        setTimeout(go, interval);  // 遞歸
                    }
                    else {
                        animated = false;
                        list.style.left = newLeft + 'px';

                        if (newLeft > 0) {
                            list.style.left = -2400 + 'px';
                        }
                        if (newLeft < -2400) {
                            list.style.left = 0 + 'px';
                        }
                    }
                }
                go();
            }

            function play() {
                timer = setInterval(function() {
                    next.onclick();
                }, 3000);
            }

            function stop() {
                clearInterval(timer);
            }

            next.onclick = function() {
                if (index == 5) {
                    index = 1;
                }
                else {
                    index += 1;
                }

                showButton();

                if (!animated) {
                    animate(-600);
                }
            }
            prev.onclick = function() {
                if (index == 1) {
                    index = 5;
                }

                else {
                    index -= 1;
                }

                showButton();
                if (!animated) {
                    animate(600);
                }
            }

            // 實(shí)現(xiàn)點(diǎn)擊下面的按鈕爷贫,圖片也跟著變換
            // 遍歷所有的圓點(diǎn),給他們一個(gè)點(diǎn)擊事件
            for (var i = 0; i < buttons.length; i++) {
                buttons[i].onclick = function() {
                    if (this.className == 'on') {  // 如果點(diǎn)擊的原點(diǎn)已經(jīng)高亮
                        return;  // 直接return补憾,下面的代碼也不執(zhí)行了
                    }
                    // 獲取當(dāng)前的index屬性里面的數(shù)字
                    var myIndex = parseInt(this.getAttribute('index'));
                    // 計(jì)算出圖片要移動(dòng)的距離
                    var offset = -600 * (myIndex - index);

                    if (!animated) {
                        animate(offset);  //調(diào)用animate函數(shù)
                    }
                    index = myIndex;  // 更新index的值
                    showButton();  //調(diào)用函數(shù)使得當(dāng)前圓點(diǎn)高亮
                }
            }

            container.onmouseover = stop;
            container.onmouseout = play;

            play();
        }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漫萄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盈匾,更是在濱河造成了極大的恐慌腾务,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削饵,死亡現(xiàn)場離奇詭異岩瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窿撬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門启昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劈伴,你說我怎么就攤上這事密末。” “怎么了跛璧?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵严里,是天一觀的道長。 經(jīng)常有香客問我赡模,道長田炭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任漓柑,我火速辦了婚禮教硫,結(jié)果婚禮上叨吮,老公的妹妹穿的比我還像新娘。我一直安慰自己瞬矩,他們只是感情好茶鉴,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著景用,像睡著了一般涵叮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伞插,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天割粮,我揣著相機(jī)與錄音,去河邊找鬼媚污。 笑死舀瓢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耗美。 我是一名探鬼主播京髓,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼商架!你這毒婦竟也來了堰怨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛇摸,失蹤者是張志新(化名)和其女友劉穎备图,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皇型,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诬烹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弃鸦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绞吁。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唬格,靈堂內(nèi)的尸體忽然破棺而出家破,到底是詐尸還是另有隱情,我是刑警寧澤购岗,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布汰聋,位于F島的核電站,受9級特大地震影響喊积,放射性物質(zhì)發(fā)生泄漏烹困。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一乾吻、第九天 我趴在偏房一處隱蔽的房頂上張望髓梅。 院中可真熱鬧拟蜻,春花似錦、人聲如沸枯饿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奢方。三九已至搔扁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟋字,已是汗流浹背稿蹲。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹊奖,地道東北人场绿。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像嫉入,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子璧尸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 原理 圖片輪播原理:將一系列大小相等的圖片平鋪咒林,利用css布局只顯示一張圖片,其他圖片隱藏爷光,通過計(jì)算偏移量利用定時(shí)...
    黎貝卡beka閱讀 2,259評論 1 2
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程垫竞,因...
    小菜c閱讀 6,444評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)蛀序,斷路器欢瞪,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • 從學(xué)校畢業(yè)光著腳在社會(huì)游走也有近7年的時(shí)間遣鼓,回想一路走來,雖不說跌跌撞撞重贺,但也跳了不少坑骑祟。 踏進(jìn)了社會(huì)這個(gè)圈子,還...
    奶油青草閱讀 1,118評論 2 11