日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

50行代码搞定无限滑动幻灯片

發(fā)布時間:2024/4/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 50行代码搞定无限滑动幻灯片 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

slider輪播組件,在各類網(wǎng)站上出現(xiàn)及其頻繁,有漸隱式的,滑動式的等等一系列。
栗子在這:

但我當(dāng)初學(xué)習(xí)寫輪播時卻被各種入門教程搞得焦頭爛額。不是代碼太復(fù)雜,就是封裝太嚴(yán)重,初學(xué)者很難理清思路,今天我們就寫一個最基本輪播組件(當(dāng)然功能也要完整),并探尋其中的規(guī)律。

觀察各類輪播組件,我們不難發(fā)現(xiàn)一個功能完善的組件具備如下幾個特點(diǎn):

  • 前進(jìn)后退按鈕控制單張幻燈片

  • 索引按鈕可以直接選擇某張幻燈片

  • mouseover 可取消滑動,mouseout 恢復(fù)滑動

  • 部分幻燈片支持無限滑動

  • 支持手勢操作

  • 今天我們以構(gòu)造一個最基本的幻燈片組件為出發(fā)點(diǎn),實(shí)現(xiàn)前4個特點(diǎn),只用50行js。

    一般原理

    我們本次的幻燈片是滑動式幻燈片,觀察不難發(fā)現(xiàn)多張幻燈片其實(shí)是連續(xù)的,但我們卻只能看見一張幻燈片,其它的幻燈片其實(shí)是被隱藏掉了。說起隱藏我們想起一個屬性 overflow:hidden 。對,滑動式幻燈片的關(guān)鍵就在于隱藏。幻燈片是多張的就像一個隊(duì)列一樣,一般都包裹在 ul 標(biāo)簽的 li中,而ul外層的容器(container)--就是我們的視窗,它的寬度一般只有一張幻燈片的大小,再在其上設(shè)置overflow:hidden ,其余的幻燈片便被隱藏掉了。

    幻燈片隊(duì)列的寬度是各張幻燈片寬度的總和,他被固定在視窗內(nèi),我們通過改變隊(duì)列的 left或 margin-left 便能控制隊(duì)列的位置--哪張幻燈片可以被顯示在視窗中。在js中我們會設(shè)置一個全局變量,通過控制全局變量來控制幻燈片隊(duì)列的位置。

    有了前面兩點(diǎn)的基礎(chǔ)我們就可以搞定一個普通的滑動幻燈片了,但如何讓它無限滑動呢?無限滾動的方案有很多種,但大多較復(fù)雜,我們這次介紹一個最簡單方案。原理是這樣的,假如我們有一個幻燈片隊(duì)列 1 2 3 4,我們克隆前后兩個幻燈片補(bǔ)充到隊(duì)列中變成 4 1 2 3 4 1 。當(dāng)隊(duì)列運(yùn)動到第二個4,再次滑動到第二個1,然后迅速閃回第一個1,因?yàn)樗俣葮O快在視覺上我們無法分辨,便造成了無限滑動的假象。有圖有真相哦。。?

    js控制邏輯

    1.我們先克隆第一張和最后一張,放置到隊(duì)列中。

    const first_slide = slide_items[0].cloneNode(true); const last_slide = slide_items[slide_items.length-1].cloneNode(true); slide_list.insertBefore(last_slide, slide_items[0]); slide_list.appendChild(first_slide);

    2.這里有四個操作 (1). slide 函數(shù)負(fù)責(zé)滑動及主要邏輯 (2). tab 函數(shù)負(fù)責(zé)索引,動態(tài)添加類 (3). 為前后箭頭添加處理邏輯 (4). 處理鼠標(biāo)操作

    3.在 slide 函數(shù)里我們定義一個 cycle 變量,由它來判斷幻燈片是否應(yīng)該循環(huán)閃回。 由 direction 判斷幻燈片的滑動方向,滑動前一張為 -1 后一張后 1 ,這里的 direction 默認(rèn)設(shè)置為 1 即正方向,因?yàn)?this 指向的是全局對象 window ,window 沒有 prev 的 id 。在 cycle 條件里我們添加一個 transitionend 事件相當(dāng)于滑動后的回掉,依賴這個事件在幻燈片滑動執(zhí)行完畢后立即執(zhí)行里面的閃回操作。

    function slide() {let cycle = false;const direction = (this.id == 'prev')? -1: 1;current += direction;slide_list.style.left = -4*current + '00px';slide_list.style.transition = 'left 0.5s';cycle = !!(current == 0 || current > len);if (cycle) {current = (current === 0)? len : 1;slide_list.addEventListener("transitionend", function() {slide_list.style.left = -4*current + '00px';slide_list.style.transition = 'left 0s';})}tab(current-1); }

    4.在 tab 函數(shù)中動態(tài)設(shè)置類,并為每個 tab 設(shè)置 click 事件。

    function tab(i) {slide_dots_items.forEach(function(i){ i.classList.remove('current')});slide_dots_items[i].classList.add('current'); } slide_dots_items.forEach(function(i) {i.addEventListener('click', function() {current = [...slide_dots_items].indexOf(i);slide();}) });

    5.設(shè)置一個 timer 計(jì)時器,每3000毫秒調(diào)用一次 slide 函數(shù)

    timer = setInterval(slide,3000);

    6.最后添加鼠標(biāo)事件,mouseover 取消滑動,mouseout 恢復(fù)滑動。

    container.onmouseover = function (){clearInterval(timer); }; container.onmouseout = function (){timer = setInterval(slide,3000); };

    總結(jié)

    滑動幻燈片的基本邏輯就是這些,主要需要一個全局變量 current 來控制滑動位置,并通過一定的限制條件來重置 current。

    通過添加 transitionend 事件監(jiān)聽滑動是否結(jié)束從而迅速閃回,達(dá)到貌似無限滑動的效果。

    本文主要以分析一個幻燈片組件的原理,探尋其中的規(guī)律為主,但是在響應(yīng)式為主的設(shè)計(jì)浪潮下,我依然推薦你在項(xiàng)目中使用那些支持手勢操作封裝良好的組件。有幾個出名的插件如下??猜猜哪個組件需要25美金的證書?。。。

  • slick 號稱一旦擁有,今生無憾的滑動組件.....

  • flickity 一個功能完善的滑動組件 *jqueryfree

  • lory 也還不錯

  • 總結(jié)

    以上是生活随笔為你收集整理的50行代码搞定无限滑动幻灯片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。