原生JS實現輪播圖

来源:https://www.cnblogs.com/Super-Lee/archive/2020/02/18/12325231.html
-Advertisement-
Play Games

使用原生JS實現輪播圖,僅需短短幾行代碼,代碼如下 當然,不可能這麼簡單,這裡我引入了自定義的 Carousel 類,是使用原生 JS 寫的,全部的代碼就不放出來了,只給出實現輪播的核心代碼 javascript // nextIndex 下一個 index change(nextIndex) { ...


使用原生JS實現輪播圖,僅需短短幾行代碼,代碼如下

let carousel = new Carousel();
carousel.render({
    'elem': '#carousel',
    'data': [
        {
            'src': 'http://dancheng.zxdyw.com/U_Image/2016/1201/e/20161201093248_7241.jpg',
            'alt': '1',
            'title': '1'
        },
        {
            'src': 'http://imgsrc.baidu.com/forum/w=580/sign=585c22802df5e0feee1889096c6134e5/9726a5d6277f9e2faf4b30911f30e924b999f35e.jpg',
            'alt': '2',
            'title': '2'
        },
        {
            'src': 'http://img4.imgtn.bdimg.com/it/u=1123599174,3662075684&fm=26&gp=0.jpg',
            'alt': '3',
            'title': '3'
        },
    ],
});

當然,不可能這麼簡單,這裡我引入了自定義的 Carousel 類,是使用原生 JS 寫的,全部的代碼就不放出來了,只給出實現輪播的核心代碼

// nextIndex 下一個 index
change(nextIndex) {
    let points = this.points;            // 小點點們
    let content = this.content;          // 主體內容
    let items = this.items;              // 所有的 item
    let maxlen = this.data.length;       // 數據個數
    let thisIndex = this.getThisIndex(); // 當前顯示的 index

    // 獲取真實的 nextIndex
    let realNextIndex = nextIndex;
    if (nextIndex > maxlen) {
        realNextIndex = 1;
    }
    if (nextIndex < 1) {
        realNextIndex = maxlen;
    }
    // 獲取最小 index 最大 index
    let minIndex = Math.min(thisIndex, nextIndex);
    let maxIndex = Math.max(thisIndex, nextIndex);
    // 獲取 index 的差
    let subIndex = maxIndex - minIndex;
    // 獲取 transform 數據的 index
    let type = thisIndex > nextIndex;
    // 定義起始終止 transform
    let startTransform = type ? String(subIndex * this.itemWidth) : '0';
    let endTransform = type ? '0' : String(subIndex * this.itemWidth);
    // 顯示兩者及兩者之間的 item
    for (let i = minIndex; i <= maxIndex; i++) {
        items[i].className = ITEMSHOW;
    }
    // 設置起始 transform
    content.style.transform = `translateX(-${startTransform}%)`;
    // 給 next 小點點添加 this
    points[realNextIndex - 1].className = INDITEMTHIS;
    // 去掉之前的小點點的 this
    points[thisIndex - 1].className = INDITEM;
    // 給 content 添加 transition 和 transform
    setTimeout(function () {
        content.style.transition = 'transform linear .5s';
        content.style.transform = `translateX(-${endTransform}%)`;
    }, 5);
    // 工作完成後,清除
    let timer = setTimeout(function () {
        // 清除 content 的 transition 和 transform
        content.style.transition = 'transform linear 0s';
        content.style.transform = 'translateX(0)';
        // 取消掉除 nextItem 之外的其它元素的顯示
        for (let i = 0; i < items.length; i++) {
            items[i].className = ITEM;
        }
        items[realNextIndex].className = ITEMSHOW;
        clearTimeout(timer);
    }.bind(this), 500);
}

所有的代碼我已經上傳到 碼雲 了,裡面有使用方法。
也可以使用百度雲下載壓縮包(博客園好像不能上傳)。
鏈接:https://pan.baidu.com/s/1u5eNjp0iMDVHAJ3U3e5DYg
提取碼:ipvq
(註意,下載之後,文件路徑需要修改)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ajax實例,檢測用戶與註冊 檢測用戶名是否被占用: 在用戶填寫完用戶名之後,ajax會非同步向伺服器發送請求,判斷用戶名是否存在 首先寫好靜態頁面: index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> < ...
  • 模板字元串:我理解為將字元串格式化、模板化,將字元串加強處理,此處的模板有動詞的意思。 字元串模板基本格式: `xxxxxx`(前後都用反引號【tab鍵上面按鍵】引起來)。除了作為普通字元串 外;還可以用來定義多行字元串;也可以在字元串中加入變數和表達式,進行字元串內容擴充和計算。 1、普通字元串: ...
  • 前言 一直身在武漢,基於眾所周知的疫情原因,這個春節只能宅著。 不過其實這個春節是這些年來過得最爽的一個了。 沒有鞭炮,不用四處跑,安安心心呆在家裡玩玩游戲看看書寫寫代碼,其實日子過得還是挺悠閑的。 廢話少說,這段時間買了《古劍奇譚3》,全成就拿齊了之後,就抽了點時間來分享在玩游戲的過程中自製的一個 ...
  • 解構賦值概述 1、解構賦值是對賦值運算符的擴展。 2、它是一種針對數組或者對象進行模式匹配,然後對其中的變數進行賦值。 3、代碼書寫上顯得簡潔且易讀,語義更加清晰明瞭;而且還方便獲取複雜對象中的數據欄位。 解構模型 在解構賦值操作過程中,有下麵兩部分參與: 1、解構的源:解構賦值表達式的右邊部分。如 ...
  • [TOC] 1.vue框架使用註意事項和經驗 本文主要總結了在開發vue項目中的一些實踐經驗和踩過的一些坑,後續會接著更新,便於後期復盤,希望也對你有所幫助 1.1 解決Vue動態路由參數變化,頁面數據不更新 問題描述: 遇到動態路由如:/page/:id 從/page/1 切換到 /page/2 ...
  • ajax 不重新載入整個網頁的情況下,更新部分網頁的技術 註意:ajax只有在伺服器上運行才能生效,我在本地一般用phpstudy 優點: 1、優化用戶體驗 2、承擔了一部分本該伺服器端的工作,減輕了伺服器端的壓力 3、優化了伺服器端和瀏覽器端的傳輸,減少了帶寬占用 缺點: 1、不支持回退按鈕 2、 ...
  • Array 定義 數組也是一個對象,是一個用來存儲數據的對象。和Object類似,但是它的存儲效率比普通對象要高。數組中保存的內容我們稱為元素。數組使用索引(index)來操作元素。索引指由0開始的整數。 數組操作 方法 push() 用來向數組的末尾添加一個或多個元素,並返回數組新的長度 語法:數 ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="htt ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...