1. 程式人生 > >原生JS實現輪播圖的幾種方式

原生JS實現輪播圖的幾種方式

I 絕對定位+透明度

原理:首先,將所有輪播圖以絕對定位的方式定位父元素的相同位置;接著,實現上下鍵按鈕修改active的下標;最後,將所有圖片透明度重置為0,而被啟用的圖片透明度設定為1;
優點:實現最為簡單,程式碼量小,圖片過渡自然;
缺點:沒有左右滑動效果

HTML

<div id='container'>
    <ul id='img-list'>
        <li><img src=''/></li>
        <li><img src=''/></li>
        <li
>
<img src=''/></li> <li><img src=''/></li> </ul> <a id='pre-btn'><span></span></a> <a id='next-btn'><span></span></a> </div>

CSS

#container{
    width:100%;
    position:relative;
    overflow:hidden
; }
#img-list{ width:100%; position:absolute; left:0; top:0; list-style:none; } #img-list li{ width:100%; position:absolute; left:0; top:0; opacity:0; } #img-list li:nth-child(1){ opacity:1; } #pre-btn{ width:50px; height:100%; position:absolute; left:0
; top:0; z-index:10; }
#next-btn{ width:50px; height:100%; position:absolute; right:0; top:0; z-index:10; }

JS

window.onload=function(){
    var img_list=document.getElementById('img-list');
    var li_list=img_list.getElementsByTagName('li');
    var pre_btn=document.getElementById('pre-btn');
    var next_btn=document.getElementById('next-btn');
    var current=0;

    //顯示第i張
    function showImg(index){
        for(var i=0;i<li_list.length;i++){
            li_list[i].style.opacity=0;
        }
        li_list[index].style.opacity='1';
    }

    //上一頁
    pre_btn.click=funciton(){
        current--;
        showImg(current);
    }
    //下一頁
    next_btn.click=funciton(){
        current++;
        showImg(current);
    }
}

II 絕對定位+left

原理:首先,將所有圖片分為四類,啟用的、啟用的上一頁、啟用的下一頁、其他,定位分別為left:0;、left:-100%;、left:100;、left:100%;,其他圖片;接著,實現上下鍵按鈕的修改active的圖片下標;動態修改圖片的class,切換的動畫用CSS3的transition來實現;
優點:實現較為簡單,程式碼量小,有圖片滑動效果;
缺點:最後一張時候點選下一張有明顯的縫隙
HTML

<div id='container'>
    <ul id='img-list'>
        <li class='active'><img src=''/></li>
        <li class='active-next'><img src=''/></li>
        <li class=''><img src=''/></li>
        <li class='active-pre'><img src=''/></li>
    </ul>
    <a id='pre-btn'><span></span></a>
    <a id='next-btn'><span></span></a>
</div>

CSS

#container{
    width:100%;
    position:relative;
    overflow:hidden;
}
#container:before {
    content: '';
    height: 0.1px;
    display: inline-block;
    padding-bottom: 50%;
}
#img-list{
    width:100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    list-style:none;
}
#img-list li{
    width:100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    opacity:0;
    transition:all 0.3s ease 0s;
}
#img-list li img{
    width:100%;
}
#img-list li.active{
    opacity:1;
    left:0;
}
#img-list li.active_pre{
    opacity:0;
    left:-100%;
}
#img-list li.active_next{
    opacity:0;
    left:100%;
}
#pre-btn{
    width:50px;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    z-index:10;
}
#next-btn{
    width:50px;
    height:100%;
    position:absolute;
    right:0;
    top:0;
    z-index:10;
}

JS

window.onload=function(){
    var img_list=document.getElementById('img-list');
    var li_list=img_list.getElementsByTagName('li');
    var pre_btn=document.getElementById('pre-btn');
    var next_btn=document.getElementById('next-btn');
    var n=li_list.length;
    var current=0;

    //顯示第i張
    function changeState(index){
        var pre=(index-1<0)?n:index-1;
        var next=(index+1>n+1)?0:index+1;
        for(var i=0;i<li_list.length;i++){
            li_list[i].className=0;
        }
        li_list[index].className='active';
        li_list[pre].className='active_pre';
        li_list[next].className='active_next';
    }

    //上一頁
    pre_btn.click=funciton(){
        current=(current-1<0)?n:current-1;
        changeState(current);
    }
    //下一頁
    next_btn.click=funciton(){
        current=(current+1>n-1)?0:current+1;
        changeState(current);
    }
}

III 絕對定位+left+DOM操作

原理:在第二種方法的基礎上增加了DOM操作。即點選下一頁後,先將第一個圖片複製到ul末尾,然後左移ul,接著刪除第一個圖片,最後恢復ul的left值;點選上一頁,將最後一個圖複製到頭部之前,然後右移並刪除最後一個元素。
優點:無縫切換,過渡自然;
缺點:實現複雜,程式碼量大
HTML

<div id='container'>
    <ul id='img-list'>
        <li><img src=''/></li>
        <li><img src=''/></li>
        <li><img src=''/></li>
        <li><img src=''/></li>
    </ul>
    <a id='pre-btn'><span></span></a>
    <a id='next-btn'><span></span></a>
</div>

CSS

#container{
    width:100%;
    position:relative;
    overflow:hidden;
}
/*佔位並保持長寬比*/
#container:before{
    content: "";
    display: inline-block;
    padding-bottom: 40%;
    width: .1px;
    vertical-align: middle;
}
#img-list{
    width: 400%;
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
    list-style:none;
}
#img-list li{
    width:100%;
    float:left;
    position:relative;
}
#img-list li img{
    max-width:100%;
}
#pre-btn{
    width:50px;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    z-index:10;
    cursor: pointer;
}
#next-btn{
    width:50px;
    height:100%;
    position:absolute;
    right:0;
    top:0;
    z-index:10;
    cursor: pointer;
}

JS

window.onload = function () {
    var container = document.getElementById('container');
    var img_list = document.getElementById('img-list');
    var li_list = img_list.getElementsByTagName('li');
    var pre_btn = document.getElementById('pre_btn');
    var next_btn = document.getElementById('next_btn');
    var n = li_list.length;
    var btn = true;

    //獲取元素當前屬性值
    function getStyle(obj, arr) {    
        if (obj.currentStyle) {      
            return obj.currentStyle[arr];  //針對ie
        } else {      
            return document.defaultView.getComputedStyle(obj, null)[arr];    
        }  
    }

    //自定義的移動函式
    //obj為節點,json為需要變化的屬性,interval為動畫間隔(決定幀數),sp可以用來改變變化速度,fn為回撥函式
    function move(obj, json, interval, sp, fn) {
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
            var flag = true;
            for (var arr in json) {
                var icur = 0;
                if (arr == 'toLeft') {
                    //獲取的**px轉化為整型
                    var icur = parseInt(getStyle(obj, 'left'));
                }
                var speed = (json[arr] - icur) * sp;
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                //判斷當前屬性值與變化的最終結果是否相等
                if (icur != json[arr]) {
                    flag = false;
                }
                //一幀的變化值
                if (arr == "toLeft") {
                    obj.style.left = (icur + speed) + "px";
                }
            }
            //如果變化完成了的話,呼叫回撥函式
            if (flag) {
                clearInterval(obj.timer);
                if (fn) {
                    fn();
                }
            }
        }, interval);
    }

    //點選下一張,把ul第一張複製到尾部,ul左移一個圖片寬度,將ul第一張刪除,ul的left設定為0(即右移一個圖片寬度)
    next_btn.onclick = function () {
        if (btn) {
            btn = false;
            //第一步複製到尾部
            var li_first = li_list[0].cloneNode(true);
            img_list.appendChild(li_first);
            //第二步ul左移
            var l = li_list[1].offsetWidth;
            move(container, {
                toLeft: -l
            }, 10, 0.03, function () {
                container.removeChild(img_list[0]);
                img_list.style.left = '0px';
                btn = true;
            })
        }
    }

    //點選上一張,將最後一張複製到ul頭部,將ul左移一個圖片寬度,最後ul右移至left為0
    pre_btn.onclick = function () {
        if (btn) {
            btn = false;
            var li_last = li_list[n - 1].cloneNode(true);
            img_list.insertBefore(li_last, li_list[0]);
            img_list.style.left = -li_list[1].offsetWidth + 'px';
            move(img_list, {
                toLeft: 0
            }, 10, 0.03, function () {
                img_list.removeChild(li_list[n]);
                btn = true;
            })
        }

    }
}

相關推薦

js實現效果方式

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。   輪播呢,也是各種網站上常見的一種展示效果,這裡我來寫一寫實現輪播的一些簡單方法。 //

原生JS實現方式

I 絕對定位+透明度 原理:首先,將所有輪播圖以絕對定位的方式定位父元素的相同位置;接著,實現上下鍵按鈕修改active的下標;最後,將所有圖片透明度重置為0,而被啟用的圖片透明度設定為1; 優點:實現最為簡單,程式碼量小,圖片過渡自然; 缺點:沒有左右滑

h5原生js實現

list sla head log startx creat ase hit eve 預覽地址:http://s.xnimg.cn/a90529/wap/wechatLive/test/slide.html <!DOCTYPE html> <html l

原生js實現原理分析

一、輪播圖需求 輪播圖需要實現左右翻頁的無縫連線 需要點選左右切換 需要實現跳轉 顯示當前位置的小圓點 二、輪播圖的原理 1.圖片移動實現原理: 利用浮動將所有所有照片依次排成一行,給這一長串圖片新增一個父級的遮罩,每次只顯示一張圖,其餘的都隱

原生js實現原理

輪播圖的原理1.圖片移動實現原理:利用浮動將所有所有照片依次排成一行,給這一長串圖片新增一個父級的遮罩,每次只顯示一張圖,其餘的都隱藏起來。對圖片新增絕對定位,通過控制left屬性,實現照片的移動。 2.圖片移動動畫原理:從a位置移動到b位置,需要先計算兩點之間的差值,通過差值和時間間隔,計算出每次移動的步

使用原生js實現效果

這幾天在逛網站的時候,發現很多網站都有輪播圖這個效果,所以我就仿照小米的官網用原生js寫了一個輪播圖效果,希望大家喜歡。 這是我釋出在github上的最後實現的效果:https://heternally.github.io/banner/ 下面我簡單跟大家說一下

原生js實現

今天分享一下簡單的輪播圖製作過程,用原生js實現。雖然網上有各種外掛製作的高大上又好用的輪播圖,但還是要清楚它的基本原理。 1.基本原理 將所有圖片並排放到一個div中,然後再放到展示視窗當中,讓裝有所有圖片的div通過改變left值,從而左右移動實現圖片切換。 2.htm

原生JS實現1---勻速動畫

                                JS實現輪播圖 專案實現結果圖: 需求:1 根據圖片動態新增小圓點            2 目標移動到小圓點輪播圖片            3 滑鼠離開圖片,定時輪播圖片;滑鼠在圖片上時暫

利用原生js實現效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js原生輪播圖</title> <style type="text

animate動畫、原生JS實現

寫在前面 最近在寫專案的時候,才發現自己對css3這部分的內容已經生疏了,複習css3的時候,看到animate屬性,就用其寫了個焦點輪播圖,當然自己也用原生JS碼了個,當然css3動畫無疑是錦上添花,還是要多總結啊,原始碼我們會在最後附上git地址,好了,下

原生JS實現

要求: 在和上一任務同一目錄下面建立一個task0002_3.html檔案,在js目錄中建立task0002_3.js,並在其中編碼,實現一個輪播圖的功能。 圖片數量及URL均在HTML中寫好 可以配置輪播的順序(正序、逆序)、是否迴圈、間隔時長 圖片切換的

JS原生程式碼實現(無左右滑動,底下圓點按鈕)

先上效果圖: 由於動態圖太大,所以只能截圖了;大致效果,圖片輪播的過程中,底下的灰色提示漸漸出現; 現在來說實現思路:        HTML部分: <div id="content"> <img id="img1" /> &

js實現

display lex tee 添加 har scrip con tle win 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF

原生js實現

tex tom enter utf-8 定義 radi absolut tco query <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

原生js封裝

round this getc 行間樣式 gets -m ++ fun ted 原生js封裝輪播圖 對於初學js的同學來說,輪播圖還是一個難點,尤其是原生js封裝輪播圖代碼,下面是我之前做的一個輪播圖項目中封裝好的一些代碼,有需要的同學可以看一下,有什麽不懂的可以看註釋,

授人以漁式解析原生JS

需求與分析 需求:迴圈無縫自動輪播五張圖,按左右箭頭可以手動切換圖片,滑鼠點選輪播圖下面按鈕 1 2 3 4 5會跳轉到對應的第1 2 3 4 5張圖片。滑鼠放到輪播圖的圖片上時不再自動輪播並且左右箭頭顯示出來,滑鼠移開時左右箭頭隱藏掉並且自動輪播。 效果圖: 分析: 佈局:準備七張圖片

Jquery和純JS實現(一)--左右切換式

var cur = 0, //當前的圖片序號 imgLis = getElementsByClassName("imgList")[0].getElementsByTagName("li"), //獲取圖片組 imgLen = imgLis.length, //獲取圖片的

最簡單 最詳細的原生js

最簡單最詳細的原生js寫輪播圖 該輪播圖實現了自動輪播,圖片切換,滑鼠移入移出事件,佈局簡單,容易上手。希望能幫到大家。效果圖如下: 佈局擴充套件 裡面用了幾種方式實現了div的垂直居中,可見樣式程式碼註釋。 HTML

原生JS實現 效果

<div id="playImages" class="play"> <ul class="big_pic"> <div class="prev"></div> <div class

js實現--淡入淡出的效果。

window.onload = function(){ mv.app.toBanner(); }; var mv = {}; mv.tools = {}; mv.ui = {}; //淡入淡出也算是是一個公用元件 mv.ui.fadein = function(obj)