最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript實現(xiàn)花樣輪播效果

 更新時間:2021年09月06日 16:24:06   作者:最love酸奶  
這篇文章主要為大家詳細介紹了javascript實現(xiàn)花樣輪播效果,一種是帶按鈕的輪播,一種是自動輪播,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了javascript實現(xiàn)花樣輪播效果的兩種實現(xiàn)方法,供大家參考,具體內容如下

第一種:簡單的帶按鈕的輪播

介紹:左右按鈕控制輪播,點擊左按鈕切換上一張圖片,點擊右按鈕切換下一張

html如下:

<div class="box">
        <div class="imgbox">
            <a><img src="img/banner1.jpg" alt=""></a>
            <a><img src="img/banner2.jpg" alt=""></a>
            <a><img src="img/banner3.jpg" alt=""></a>
            <a><img src="img/banner4.jpg" alt=""></a>
            <a><img src="img/banner5.jpg" alt=""></a>
        </div>
        <div class="btns">
            <input type="button" id="left" value="<<<">
            <input type="button" id="right" value=">>>">
</div>

css如下:

.box{width: 1000px;height: 300px;margin: 20px auto;position: relative;overflow: hidden;}
        .box .imgbox{}
        .imgbox a{width: 1000px;height: 300px;position: absolute;left:1000px;top:0;}
        .imgbox a:nth-child(1){left:0;}
        .imgbox img{width: 1000px;height: 300px;}

        .btns input{width: 40px;height: 40px;position: absolute;top:130px;border: none;background: rgba(200,200,200,0.5);}
        #left{left:0;}
        #right{right: 0;}}

js如下:

class Banner{
        constructor(){
            this.left = document.getElementById("left");
            this.right = document.getElementById("right");
            this.child = document.querySelectorAll(".imgbox a");

            // 要進來的
            this.iNow = 0;
            // 要走的
            this.iPrev = this.child.length - 1;
        }
        init(){
            var that = this;
            this.left.addEventListener("click",function(){
                that.changeIndex(1);
            })
            this.right.addEventListener("click",function(){
                that.changeIndex(2);
            })
        }
        changeIndex(direct){
            if(direct == 1){
                if(this.iNow == 0){
                    this.iNow = this.child.length-1;
                    this.iPrev = 0;
                }else{
                    this.iNow--;
                    this.iPrev = this.iNow + 1;
                }
            }else{
                if(this.iNow == this.child.length-1){
                    this.iNow = 0;
                    this.iPrev = this.child.length-1;
                }else{
                    this.iNow++;
                    // 要走的索引永遠是進來的索引-1
                    this.iPrev = this.iNow - 1;
                }
            }
            // 根據(jù)索引開始運動
            this.move(direct);
        }
        move(direct){
            if(direct == 1){
                // iPrev走
                    // 從0,走到1000
                this.child[this.iPrev].style.left = 0;
                move(this.child[this.iPrev],{left:1000});
                // iNow進來
                    // 從-1000,進到0
                this.child[this.iNow].style.left = -1000 + "px";
                move(this.child[this.iNow],{left:0});
            }else{
                
                this.child[this.iPrev].style.left = 0;
                move(this.child[this.iPrev],{left:-1000});
                this.child[this.iNow].style.left = 1000 + "px";
                move(this.child[this.iNow],{left:0});
            }
        }
    }

var b = new Banner();
b.init();

第二種:自動輪播

介紹:兩個左右按鈕可以控制圖片左右切換,下面帶有數(shù)字的按鈕,點擊數(shù)字幾,就可以切換到第幾張,自動輪播的過程中,鼠標進入停止輪播,鼠標離開繼續(xù)輪播

htm代碼如下:

<div class="box">
        <div class="imgbox">
            <a><img src="../img/banner1.jpg" alt=""></a>
            <a><img src="../img/banner2.jpg" alt=""></a>
            <a><img src="../img/banner3.jpg" alt=""></a>
            <a><img src="../img/banner4.jpg" alt=""></a>
            <a><img src="../img/banner5.jpg" alt=""></a>
        </div>
        <div class="btns">
            <input type="button" id="left" value="<<<">
            <input type="button" id="right" value=">>>">
        </div>
        <div class="list">
        </div>
</div>

css代碼如下:

.box{width: 1000px;height: 300px;margin: 20px auto;position: relative;overflow: hidden;}
.box .imgbox{}
.imgbox a{width: 1000px;height: 300px;position: absolute;left:1000px;top:0;}
.imgbox a:nth-child(1){left:0;}
.imgbox img{width: 1000px;height: 300px;}

.btns input{width: 40px;height: 40px;position: absolute;top:130px;border: none;background: rgba(200,200,200,0.5);}
        #left{left:0;}
        #right{right: 0;}

.list{width: 1000px;height: 30px;position: absolute;left: 0;bottom: 0;display: flex;background: rgba(200,200,200,0.5);}
.list span{flex: 1;line-height: 30px;text-align: center;border-left:solid 1px black;border-right: solid 1px black;}
.list span.active{background: red;color: #fff;}

js代碼如下:

class Banner{
        constructor(){
            this.left = document.getElementById("left");
            this.right = document.getElementById("right");
            this.child = document.querySelectorAll(".imgbox a");
            this.list = document.querySelector(".list");
            this.box = document.querySelector(".box");

            this.iNow = 0;
            this.iPrev = this.child.length - 1;
        }
        init(){
            var that = this;
            this.left.addEventListener("click",function(){
                that.changeIndex(1);
            })
            this.right.addEventListener("click",function(){
                that.changeIndex(-1);
            })
            // L3.事件委托綁定事件
            this.list.onclick = function(eve){
                var e = eve || window.event;
                var tar = e.target || e.srcElement;
                if(tar.tagName == "SPAN"){
                    // L4.觸發(fā)事件時,執(zhí)行改變索引,同時將點前點擊的span傳入
                    that.listChangeIndex(tar);
                }
            }
        }
        changeIndex(direct){
            if(direct == 1){
                if(this.iNow == 0){
                    this.iNow = this.child.length-1;
                    this.iPrev = 0;
                }else{
                    this.iNow--;
                    this.iPrev = this.iNow + 1;
                }
            }else{
                if(this.iNow == this.child.length-1){
                    this.iNow = 0;
                    this.iPrev = this.child.length-1;
                }else{
                    this.iNow++;
                    this.iPrev = this.iNow - 1;
                }
            }
            this.move(direct);
        }
        move(direct){
            // 根據(jù)左右按鈕傳入的狀態(tài):左1,右-1
            // 利用乘法
            // 改變不同按鈕的方向問題
            this.child[this.iPrev].style.left = 0;
            move(this.child[this.iPrev],{left:this.child[0].offsetWidth * direct});
            this.child[this.iNow].style.left = -this.child[0].offsetWidth * direct + "px";
            move(this.child[this.iNow],{left:0});

            this.setActive();
        }
        createList(){
            // L1.創(chuàng)建對應圖片數(shù)量的span,同時編號
            var str = ``;
            for(var i=0;i<this.child.length;i++){
                str += `<span index='${i}'>${i+1}</span>`;
            }
            this.list.innerHTML = str;

            // L2.設置默認的當前項
            this.setActive();
        }
        setActive(){
            for(var i=0;i<this.list.children.length;i++){
                this.list.children[i].className = "";
            }
            this.list.children[this.iNow].className = "active";
        }
        listChangeIndex(tar){
            // L5.確定要走的索引和要進來的索引
            // this.iNow    要走的
            // 拿到點擊的span的編號     要進來的
            var index = parseInt(tar.getAttribute("index"));
            // console.log(this.iNow, index);
            // L6-1.判斷方向
            if(index > this.iNow){
                // L7-1.向左運動
                this.listMove(1,index);
            }
            // L6-2.判斷方向
            if(index < this.iNow){
                // L7-2.向右運動
                this.listMove(-1,index);
            }

            // L8.將當前點擊的索引設置成下次要走的索引
            this.iNow = index;

            // L9.根據(jù)修改之后的索引,設置當前項
            this.setActive();
        }
        listMove(direct,index){
            // this.iNow走
                // 從哪走,走到哪
            this.child[this.iNow].style.left = 0;
            move(this.child[this.iNow],{left:-1000 * direct})
            // index進來
                // 從哪進來,進到哪s
            this.child[index].style.left = 1000 * direct + "px";
            move(this.child[index],{left:0});
        }
        autoPlay(){
            var t = setInterval(()=>{
                this.changeIndex(-1);
            },2000)

            this.box.onmouseover = function(){
                clearInterval(t);
            }

            var that = this;
            this.box.onmouseout = function(){
                t = setInterval(()=>{
                    that.changeIndex(-1);
                },2000)
            }
            
            // console.log(that);
        }
    }


var b = new Banner();
b.init();
b.createList();
b.autoPlay();

兩個案例 js 里面的move是一個緩沖運動的封裝,代碼如下:

function move(ele,obj,cb){
    clearInterval(ele.t);
    ele.t = setInterval(() => {
        // 假設狀態(tài)為:可以清除計時器
        var i = true;
        // 因為在計時器中才開始使用到對象中的信息,所以在計時器中遍歷
        // 并提前換來的屬性和目標變量
        for(var attr in obj){
            if(attr == "opacity"){
                var iNow = getStyle(ele,attr) * 100;
            }else{
                var iNow = parseInt(getStyle(ele,attr));
            }
    
            let speed = (obj[attr] - iNow)/10;
            speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
            // 只要有一個屬性到目標,就停了,不對
            // 必須所有屬性到目標,才能停

            // 只要有一個屬性沒到目標,絕對不能停
                // 用狀態(tài)來標記到底要不要停止計時器

            // 只要有一個屬性沒到目標:絕對不能清除計時器
            if(iNow !== obj[attr]){
                i = false;
            }
            if(attr == "opacity"){
                ele.style.opacity = (iNow + speed)/100;
            }else{
                ele.style[attr] = iNow + speed + "px";
            }
        }
        // 如果每次計時器執(zhí)行結束,所有屬性都執(zhí)行了一遍之后,狀態(tài)還是true,表示,沒有被改成false,如果沒有被改成false,表示沒有屬性沒到終點,那么狀態(tài)還是false就不清除
        if(i){
            clearInterval(ele.t);
            // 用戶決定在動畫結束時要執(zhí)行的功能,萬一用戶沒傳參,做個默認判斷
            if(cb){
                cb();
            }
            // cb && cb();
        }
    }, 30);
}

function getStyle(ele,attr){
    if(ele.currentStyle){
        return ele.currentStyle[attr];
    }else{
        return getComputedStyle(ele,false)[attr];
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript獲取Excel表格的列序號和列名

    JavaScript獲取Excel表格的列序號和列名

    這篇文章主要介紹了JavaScript獲取Excel表格的列序號和列名,在處理Excel文件時,通常要獲取xx列的數(shù)據(jù),這就要求先找到列序號,下文關于列名獲取需要的小伙伴可以參考一下
    2022-05-05
  • 詳解JavaScript實現(xiàn)動態(tài)的輪播圖效果

    詳解JavaScript實現(xiàn)動態(tài)的輪播圖效果

    這篇文章主要介紹了JavaScript實現(xiàn)動態(tài)的輪播圖效果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • JavaScript學習筆記之取數(shù)組中最大值和最小值

    JavaScript學習筆記之取數(shù)組中最大值和最小值

    在實際業(yè)務中有的時候要取出數(shù)組中的最大值或最小值。但在數(shù)組中并沒有提供arr.max()和arr.min()這樣的方法。那么是不是可以通過別的方式實現(xiàn)類似這樣的方法呢?那么今天我們就來整理取出數(shù)組中最大值和最小值的一些方法,需要的朋友一起學習吧
    2016-03-03
  • js實現(xiàn)盒子拖拽動畫效果

    js實現(xiàn)盒子拖拽動畫效果

    這篇文章主要為大家詳細介紹了js實現(xiàn)盒子拖拽動畫效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JS實現(xiàn)數(shù)組扁平化的方法分享

    JS實現(xiàn)數(shù)組扁平化的方法分享

    數(shù)組扁平化指的是:將一個多層嵌套的數(shù)組,處理成只有一層的數(shù)組。本文主要和大家介紹了幾個常用的JS數(shù)組扁平化方法,希望對大家有所幫助
    2023-04-04
  • js通過location.search來獲取頁面?zhèn)鱽淼膮?shù)

    js通過location.search來獲取頁面?zhèn)鱽淼膮?shù)

    js獲取通過window.location.search來獲取頁面?zhèn)鱽淼膮?shù),經(jīng)測試可用,大家可以學習下
    2014-09-09
  • js?scrollTop如何到達指定位置

    js?scrollTop如何到達指定位置

    很早之前就想分享這篇心得,幸之今天能在這里完成,好了,話不多說,進入正題。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • JS運動特效之完美運動框架實例分析

    JS運動特效之完美運動框架實例分析

    這篇文章主要介紹了JS運動特效之完美運動框架,結合實例形式分析了javascript針對運動中的元素屬性檢測與判斷相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • input輸入框限制只能輸入數(shù)字的方法實例(個人認為最好的)

    input輸入框限制只能輸入數(shù)字的方法實例(個人認為最好的)

    在很多業(yè)務中需要對輸入框進行字符限制,比如金額輸入框、手機號碼輸入框等,下面這篇文章主要給大家介紹了關于input輸入框限制只能輸入數(shù)字的相關資料,文中介紹的方法個人認為最好的,需要的朋友可以參考下
    2022-10-10
  • 微信小程序 scroll-view 實現(xiàn)錨點跳轉功能

    微信小程序 scroll-view 實現(xiàn)錨點跳轉功能

    這篇文章主要介紹了微信小程序 scroll-view 實現(xiàn)錨點跳轉功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12

最新評論

武邑县| 都昌县| 饶平县| 临沂市| 明水县| 即墨市| 平武县| 平乡县| 兰溪市| 岳普湖县| 平凉市| 江阴市| 齐河县| 荆门市| 凤冈县| 精河县| 高清| 苏尼特左旗| 扶沟县| 毕节市| 中方县| 哈巴河县| 永仁县| 乐陵市| 永登县| 金乡县| 柘荣县| 涞水县| 延津县| 南江县| 平邑县| 潮安县| 印江| 阜阳市| 寻乌县| 新宁县| 湘西| 固始县| 金秀| 佛冈县| 大兴区|