1. 程式人生 > >JS+JQ實現無縫輪播及原理介紹

JS+JQ實現無縫輪播及原理介紹

雖然網上已經多如牛毛關於這個特效實現的介紹,但今天還是想自己擼一份加上自己的理解。

首先來看下什麼是無縫輪播什麼是非無縫輪播

非無縫輪播圖
非無縫輪播圖

這是某騰體育的首頁輪播圖,可以看到當到最後一張返回第一張輪播或者第一張到最後一張時會有一個回拉的動作

這種視覺使用者體驗比較不友好有種晃眼的感覺。

下面看看無縫輪播效果

無縫輪播效果

可以看到無縫輪播當最後一張到第一張或是第一張到最後一張切換時是一種很平滑的效果,是一種較好的使用者體驗

下面就來看看用原生的JS是怎麼完成的

css:

a, ul, li {
    list-style: none;
    text-decoration: none;
    margin: 0;
    padding: 0;
}

.wrap {
    width: 600px;
    height: 400px;
    margin: 100px auto;
    position: relative;
    overflow: hidden;
}

.wrap .left {
    position: absolute;
    top: 142px;
    left: -18px;
}

.wrap .left img {
    width: 80px;
    height: 80px;
}

.wrap .right {
    position: absolute;
    top: 142px;
    right: -16px;
}

.wrap .right img {
    width: 80px;
    height: 80px;
}

.navs {
    width: 4200px;
    height: 100%;
    position: absolute;
    top: 0;
    left: -600px;
    /*transition: all .3s;*/
}

.navs li {
    width: 600px;
    height: 100%;
    float: left;
}

.navs li img {
    width: 100%;
    height: 100%;
}

#bots {
    display: inline-block;
    width: 600px;
    height: 40px;
    background: rgba(0, 0, 0, .3);
    text-align: center;
    position: absolute;
    bottom: 0;
    left: 0;
}

#bots li {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #cccccc;
    position: relative;
    left: 220px;
    top: 10px;
    margin-left: 10px;
    float: left;
}

#bots .active {
    background: red;
}

dom: 

<div class="wrap" id="box">
    <ul id='navs' class="navs" style="left: -600px">
        <li><a href="javascript:;"><img src="image/banner5.png"/></a></li>
        <li><a href="javascript:;"><img src="image/banner1.png"/></a></li>
        <li><a href="javascript:;"><img src="image/banner2.png"/></a></li>
        <li><a href="javascript:;"><img src="image/banner3.png"/></a></li>
        <li><a href="javascript:;"><img src="image/banner4.png"/></a></li>
        <li><a href="javascript:;"><img src="image/banner5.png"/></a></li>
        <li><a href="javascript:;"><img src="image/banner1.png"/></a></li>
    </ul>
    <a id="pre" class="left"><img src="image/left1.png"/></a>
    <a id="nex" class="right"><img src="image/right1.png"/></a>
    <ul id="bots">
        <!--<li class="bot active"></li>-->
        <!--<li class="bot"></li>-->
        <!--<li class="bot"></li>-->
        <!--<li class="bot"></li>-->
        <!--<li class="bot"></li>-->
    </ul>
</div>

上面的佈局在第一張克隆一個最後一張的副本,在最後一張克隆一張第一張的副本

當我們切換到最後一張的時候點選下一張時移動到第一張副本的同時利用js設定css樣式迅速切換到真正的第一張這個過程是肉眼無法看到的來達到無縫的目的

 

下面是滑鼠每次點選就改變一點點位置,所以我們可以利用定時器來設計很小的時間不斷移動位置來實現過渡切換的效果。

js:

<script>
    window.onload = function () {
        var pre = document.getElementById('pre'); // 上一張
        var nex = document.getElementById('nex'); // 下一張
        var list = document.getElementById('navs'); // 輪播圖
        var bots = document.getElementById('bots'); // 小圓點
        var box = document.getElementById('box'); // 最外層容器用來判斷滑鼠移入移除停止自動輪播
        var index = 0; // 記錄當前小圓點下標
        var isanimate = true; // 是否自動播放
        var interval; // 自動播放定時器
        var disable = true; // 用來控制快速點選導致頁面錯亂
        //初始化小圓點
        for (let i = 0; i < list.children.length - 2; i++) {
            let li = document.createElement('li')
            bots.appendChild(li)
        }
        bots.children[0].className = 'active' // 預設第一個為初始圓點高亮
        // 上一張
        pre.onclick = function () {
            if(disable){
                disable = false // 這裡設定為false表示進入切換動畫未完成時就不能點選
                index--;  // 小圓點下標--
                changebots() //改變高亮
                animate(600) // 切換輪播圖動畫
            }

        }
        // 下一張
        nex.onclick = function () {
            if(disable){
                disable = false
                index++;
                changebots()
                animate(-600)
            }
        }

        // 改變圓點高亮
        function changebots() {
            if (index < 0) {  // 如果小於0圖片到最後一張高亮也對應到最後一個圓點
                index = 4
            }
            else if (index > 4) { // 如果大於於4圖片到第一張一張高亮也對應到第一個圓點
                index = 0
            }
            for (let i = 0; i < bots.children.length; i++) {
                bots.children[i].className = ''
            }
            bots.children[index].className = 'active'
        }

        // 圖片切換動畫
        function animate(offset) {
            let newLeft = parseInt(list.style.left) + offset;  // 下一張輪播圖應該位移到的位置
            let interval = 10;  // 圖片位移的時間
            let speed = (offset / 10) / 3 //每10ms移動的位置這裡是設定20px 這裡可以根據自己需求改動
            // 自動輪播小圓點自動切換
            if (isanimate) {
                index++;
                changebots(index)
            }

            // 利用定時器遞迴的模擬動畫效果切換圖片
            function change() {
                if (parseInt(list.style.left) === -3600) {
                    list.style.left = -600 + 'px'
                    newLeft = -1200
                }
                if (parseInt(list.style.left) > 0) {
                    list.style.left = -3000 + 'px'
                    newLeft = -2400
                }
                this.timer = setTimeout(() => {
                    list.style.left = list.offsetLeft + speed + 'px'
                    if (parseInt(list.style.left) != newLeft) { // 判斷是否到了應該到的位移位置,到達就清除計時器停止遞迴
                        change()
                    } else {
                        clearTimeout(this.timer)
                        disable = true //動畫完成進行下一次點選
                        console.log(disable)
                        console.log(list.style.left)
                    }
                }, interval)
            }
            change()

        }

        // 小圓點切換
        bots.onclick = function (ev) {
            var ev = ev || window.event;
            let target = ev.target || ev.srcElement;
            if (target.nodeName.toLowerCase() == 'li') {
                for (let i = 0; i < bots.children.length; i++) {
                    if (bots.children[i] === target) {
                        index = i;
                        console.log(index)
                        break;
                    }
                }
                changebots() // 切換下標
                list.style.left = ((index + 1) * -600) + 'px' // 切換輪播圖
            }

        }
        // 自動輪播
        function autoplay() {
            interval = setInterval(() => {
                animate(-600)
            }, 2000)
        }

        // 滑鼠移入停止自動輪播
        box.onmouseover = function () {
            isanimate = false
            console.log('in')
            clearInterval(interval)
        }
        //滑鼠移出開始輪播
        box.onmouseleave = function () {
            isanimate = true
            autoplay()
            console.log('out')
        }
        autoplay()
    }
</script>

上面是原生JS去實現那麼怎麼用JQ實現呢,用JQ 來實現就簡單的多了

<script>
    $(function () {

        var index = 0; // 記錄當前小圓點下標
        var isanimate = true; // 是否自動播放
        var interval; // 自動播放定時器
        //初始化小圓點
        for (let i = 0; i < 5; i++) {
            let li = $('<li></li>')
            $('#bots').append(li)
        }
        $('#bots li').first().addClass('active')
        // 上一張
        $('#pre').click(function () {
            index--;
            if (index < 0) {
                $('#navs').css('left', -3600)
                index = 4
            }
            manimate(index)
            changebots(index)
        })
        //下一張
        $('#nex').click(function () {
            index++;
            if (index >5) {
                $('#navs').css('left', -600)
                index = 1
            }
            manimate(index)
            changebots(index)
        })
        //小圓點切換
        $('#bots').click(function (ev) {
            var ev = ev || window.event;
            let target = ev.target || ev.srcElement;
            if (target.nodeName.toLowerCase() == 'li') {
                for (let i = 0; i < 5; i++) {
                    if ($('#bots')[0].children[i] === target) {
                        index = i;
                        console.log(index)
                        break;
                    }
                }
            }
            $('#navs').css('left', (index + 1) * -600)
            changebots(index)
        })

        // 切換動畫效果
        function manimate(i) {
            i +=1;
            // console.log(i)
            $('#navs').stop().animate({left: -i * 600}, 500)
        }

        // 切換圓點
        function changebots(i) {
            if (i < 0) {
                i = 4
            } else if (i > 4) {
                i = 0
            }
            $('#bots li').eq(i).addClass('active').siblings().removeClass('active')

        }

        // 自動輪播
        function autoplay() {

            interval = setInterval(() => {
                index++;
                if (index >5) {
                    $('#navs').css('left', -600)
                    index = 1
                }
                changebots(index)
                manimate(index)
            }, 2000)
        }

        // 滑鼠移入停止自動輪播
        $('#box').mouseover(function () {
            console.log('in')
            clearInterval(interval)
        })
        //滑鼠移出開始輪播
        $('#box').mouseleave(function () {
            console.log('out')
            autoplay()
        })
        autoplay()

    })
</script>

相關推薦

JS+JQ實現無縫播及原理介紹

雖然網上已經多如牛毛關於這個特效實現的介紹,但今天還是想自己擼一份加上自己的理解。 首先來看下什麼是無縫輪播什麼是非無縫輪播 非無縫輪播圖 這是某騰體育的首頁輪播圖,可以看到當到最後一張返回第一張輪播或者第一張到最後一張時會有一個回拉的動作 這種視覺使用者體驗比較不

jq 實現無縫播圖

工作中經常會用到輪播圖,這裡記載兩種輪播圖,供大家參考 一、自動播放的無縫輪播圖(一張圖片佔滿屏) 首先是HTML, <div class='bannerCon'> <ul class="bannerContainer" id="ban

JS 實現無縫滾動動畫原理(初學者入)

padding absolute hidden 高度 pos sof add align meta   這段時間在教培訓班的學生使用原生javascript實現無縫滾動的動畫案例,做了這個原理演示的動畫,分享給自學JS的朋友!博主希望對你們有幫助! 在講解之前先看一下de

原生js實現無縫

cli spl city ive ont eve 通過 動畫 change 原生js實現無縫輪播   因為要做到無縫,所以就要把第一張圖片和最後一張連接起來,在此處采用js克隆了第一張圖片的節點,添加到最後,顯示圖片序號的小圓按鈕也是使用js動態添加的。 html部分

js實現無縫播圖

很多時候我們都會用到無縫輪播圖,那麼下面我就把無縫輪播獻給大家 1.左右無縫輪播 <!DOCTYPE html > <html> <head> <

jq實現簡單

cti 標簽 function radi har mil ott ava 懸停 一個簡單的實例: css代碼: <style type="text/css">@charset "utf-8";*{ padding:0px; border:

js jq 實現鼠標經過div背景以進度條方式 變寬,鼠標離開變小,同時文字顏色和原來不一樣

最大 java hidden pan absolute 顏色 tin http center 1 <!DOCTYPE html> 2 <html> 3 <head> 4 5 <title></tit

原生JavaScript實現無縫播圖

原生 原生js ted 結束 阻止 time == 實現圖 put 無縫輪播圖是頁面常用的特效之一,然而在實際的開發過程中,大部分的開發者都會使用插件來對輪播圖進行開發,那麽它的底層到底是怎麽實現的呢,本文章將圍繞這一問題展開探討。 在討論如何利用原生JS實現圖片之間無縫切

[JavaScript]使用jQuery實現無縫

方式 child margin blog turn use leave 分享 不同的 代碼鏈接:我的GitHub 項目預覽:預覽 目的:通過CSS + jQuery的方式實現自動無縫輪播。 上一篇博文總結了使用jQuery實現輪播,雖然是自動輪播,但是這個輪播有個不足之處:

jq實現碎片

效果如下: 實現原理:將背景圖片分成100等分 實現寬高從0到他們本身的寬高的動 畫 html <div id="banner"> <div id="pic"> <ul> <li class="ac

JQ實現簡易播圖

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ini

JS(JQ)實現table表格固定表頭且表頭可以隨橫向滾動而滾動

先看一張效果圖 思路: 1、頭部用一個table並用一個div包裹著, 表格的具體內容用一個table 2、頭部外面的div用positon: relative相對定位 3、獲取整個表格的高度 4、獲取表格的dom(或者包裹著表格的dom)距離頁面頂部的距離 offset

zepto框架以及原生方法實現無縫播圖

注 :zepto實現在pc端模擬有一定的bug,把裡面的start=false註釋掉即可 Zepto實現。 HTML程式碼: <div class="homePageBanner"> <ul> <li><a hr

html+css+js簡單實現圖片播效果

<script>  index=0;function show_img(){             imgs=document.getElementById("shidian_img").children; //獲取所以圖片 並且儲存到陣列imgs數組裡             for(i =0

jQuery外掛slides實現無縫播圖特效

初始化外掛: slides是一款基於jQuery無縫輪播圖外掛,支援圖內元素動畫,可以自定義動畫型別 1 2 3 4 5 6 7 8 9 10 $(".slideInner").slide({

Java HelloWorld實現及Java執行原理介紹

首先我們新建一個字尾是java的HelloWorld檔案; 然後編寫HelloWorld程式碼;(程式碼暫時不需要全部理解,後面會詳細講到) 上程式碼: 1 2 3 4 5 public class HelloWorld{ public st

js面向物件---無縫播圖(附面向過程程式碼)

window.onload = function(){ var t1 = new Lb("box"); t1.l(); //設定包含圖片的ul寬度 t1.dot(); //點哪個圓,相對應的圖片顯示

JQ實現無縫滾動

<script type="text/javascript">     var timer = 0; //定時器初始化     var index = 0; //圖片索引值     var left = 714;//圖片的寬度     var $len = $(".box>li").size

HTML+CSS+JQ實現圖片播效果

焦點圖廣泛運用於主頁的醒目位置放置廣告,簡單好用,加上效果也很好看。 實現的效果: 5張圖片每兩秒輪播一次,右下角的數字隨圖片而變換,滑鼠放在數字上圖片停止,移走滑鼠繼續播放。 實現步驟: 1

jq實現無限

$(function(){ function Slide(){ this.data={ img_width:300, img_height:300,