摘要:對,滑動式幻燈片的關鍵就在于隱藏。在條件里我們添加一個事件相當于滑動后的回掉,依賴這個事件在幻燈片滑動執行完畢后立即執行里面的閃回操作。通過添加事件監聽滑動是否結束從而迅速閃回,達到貌似無限滑動的效果。
slider輪播組件,在各類網站上出現及其頻繁,有漸隱式的,滑動式的等等一系列。
栗子在這:
但我當初學習寫輪播時卻被各種入門教程搞得焦頭爛額。不是代碼太復雜,就是封裝太嚴重,初學者很難理清思路,今天我們就寫一個最基本輪播組件(當然功能也要完整),并探尋其中的規律。
觀察各類輪播組件,我們不難發現一個功能完善的組件具備如下幾個特點:
前進后退按鈕控制單張幻燈片
索引按鈕可以直接選擇某張幻燈片
mouseover 可取消滑動,mouseout 恢復滑動
部分幻燈片支持無限滑動
支持手勢操作
今天我們以構造一個最基本的幻燈片組件為出發點,實現前4個特點,只用50行js。
一般原理我們本次的幻燈片是滑動式幻燈片,觀察不難發現多張幻燈片其實是連續的,但我們卻只能看見一張幻燈片,其它的幻燈片其實是被隱藏掉了。說起隱藏我們想起一個屬性 overflow:hidden 。對,滑動式幻燈片的關鍵就在于隱藏。幻燈片是多張的就像一個隊列一樣,一般都包裹在 ul 標簽的 li中,而ul外層的容器(container)--就是我們的視窗,它的寬度一般只有一張幻燈片的大小,再在其上設置overflow:hidden ,其余的幻燈片便被隱藏掉了。
幻燈片隊列的寬度是各張幻燈片寬度的總和,他被固定在視窗內,我們通過改變隊列的 left或 margin-left 便能控制隊列的位置--哪張幻燈片可以被顯示在視窗中。在js中我們會設置一個全局變量,通過控制全局變量來控制幻燈片隊列的位置。
有了前面兩點的基礎我們就可以搞定一個普通的滑動幻燈片了,但如何讓它無限滑動呢?無限滾動的方案有很多種,但大多較復雜,我們這次介紹一個最簡單方案。原理是這樣的,假如我們有一個幻燈片隊列 1 2 3 4,我們克隆前后兩個幻燈片補充到隊列中變成 4 1 2 3 4 1 。當隊列運動到第二個4,再次滑動到第二個1,然后迅速閃回第一個1,因為速度極快在視覺上我們無法分辨,便造成了無限滑動的假象。有圖有真相哦。。?
1.我們先克隆第一張和最后一張,放置到隊列中。
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 函數負責滑動及主要邏輯 (2). tab 函數負責索引,動態添加類 (3). 為前后箭頭添加處理邏輯 (4). 處理鼠標操作
3.在 slide 函數里我們定義一個 cycle 變量,由它來判斷幻燈片是否應該循環閃回。 由 direction 判斷幻燈片的滑動方向,滑動前一張為 -1 后一張后 1 ,這里的 direction 默認設置為 1 即正方向,因為 this 指向的是全局對象 window ,window 沒有 prev 的 id 。在 cycle 條件里我們添加一個 transitionend 事件相當于滑動后的回掉,依賴這個事件在幻燈片滑動執行完畢后立即執行里面的閃回操作。
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 函數中動態設置類,并為每個 tab 設置 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.設置一個 timer 計時器,每3000毫秒調用一次 slide 函數
timer = setInterval(slide,3000);
6.最后添加鼠標事件,mouseover 取消滑動,mouseout 恢復滑動。
container.onmouseover = function (){ clearInterval(timer); }; container.onmouseout = function (){ timer = setInterval(slide,3000); };總結
滑動幻燈片的基本邏輯就是這些,主要需要一個全局變量 current 來控制滑動位置,并通過一定的限制條件來重置 current。
通過添加 transitionend 事件監聽滑動是否結束從而迅速閃回,達到貌似無限滑動的效果。
本文主要以分析一個幻燈片組件的原理,探尋其中的規律為主,但是在響應式為主的設計浪潮下,我依然推薦你在項目中使用那些支持手勢操作封裝良好的組件。有幾個出名的插件如下??猜猜哪個組件需要25美金的證書?。。。
slick 號稱一旦擁有,今生無憾的滑動組件.....
flickity 一個功能完善的滑動組件 *jqueryfree
lory 也還不錯
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81772.html
摘要:設置為,相對于高度為的來說就是。再看這一堆使用最關鍵的一點就是計算和的值。可以看到回調里可以拿到,也就是對象的實例,當等于代表滾到了底部,所以這里加上代表快要滾動底部已經看到了加載更多。開始任何意見和建議歡迎,團隊會第一時間反饋。 原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先驗貨 showImg(https://...
摘要:在基本信息通過幻燈效果顯示商品的大圖,通過手指的滑動來控制幻燈的顯示。在本設計中借鑒了各大主流電商平臺的主流做法,即在無效滑動情況下降低幻燈的滑動速度讓用戶知道已近無法移動了。 移動端人機交互方式同PC端發生了本質的變化,在PC端使用鼠標和鍵盤進行交互,而移動端使用的是手指的觸摸和滑動。PC端開發時主要監聽鼠標事件,例如mouseEnter(鼠標進入事件)、mouseMove(鼠標移動...
閱讀 688·2021-11-18 10:07
閱讀 2878·2021-09-22 16:04
閱讀 873·2021-08-16 10:50
閱讀 3326·2019-08-30 15:56
閱讀 1784·2019-08-29 13:22
閱讀 2647·2019-08-26 17:15
閱讀 1229·2019-08-26 10:57
閱讀 1103·2019-08-23 15:23