一分鐘搞定AlloyTouch圖片輪播組件

来源:http://www.cnblogs.com/iamzhanglei/archive/2016/12/09/6149063.html
-Advertisement-
Play Games

輪播圖也涉及到觸摸和觸摸反饋,同時,AlloyTouch可以把慣性運動打開或者關閉,並且設置min和max為運動區域,超出會自動回彈。 除了一般的豎向滾動,AlloyTouch也可以支持橫向滾動,甚至任何屬性的運動,因為它的設計的本質就是屬性無關,觸摸可以反饋到任何屬性的運動。所以 "AlloyTo ...


輪播圖也涉及到觸摸和觸摸反饋,同時,AlloyTouch可以把慣性運動打開或者關閉,並且設置min和max為運動區域,超出會自動回彈。
除了一般的豎向滾動,AlloyTouch也可以支持橫向滾動,甚至任何屬性的運動,因為它的設計的本質就是屬性無關,觸摸可以反饋到任何屬性的運動。所以AlloyTouch製作各種各樣的輪播組件還是得心應手。

第一種輪播圖如上圖所示。下麵開始實現的過程。

第0秒

<div id="carousel-container">
    <div class="carousel">
        <div class="carousel-scroller" id="carousel-scroller">
            <img style="width: 88%;" src="asset/ci1.jpg">
            <img style="width: 88%;" src="asset/ci2.jpg">
            <img style="width: 88%;" src="asset/ci3.jpg">
            <img style="width: 88%;" src="asset/ci4.jpg">
            <img style="width: 88%;" src="asset/ci5.jpg">
        </div>

    </div>
</div>

一共五張圖,每張圖占有屏幕比例的百分之88,所以用戶的屏幕里可以看到一張多一點的圖片,給用戶可以橫向滑動查看的感覺。

第10秒

<script src="../transformjs/transform.js"></script>
<script src="../alloy_touch.js"></script>
<script>
    var scroller = document.querySelector("#carousel-scroller");
    Transform(scroller); 
</script>

通過Transform(scroller); 註入CSS3 transform屬性。

第20秒

new AlloyTouch({
    touch: "#carousel-container",//反饋觸摸的dom
    vertical: false,// 監聽用戶橫向觸摸
    target: scroller, //運動的對象
    property: "translateX",  //被運動的屬性
    min:0.88 * window.innerWidth * -5 + window.innerWidth, 
    max: 0
})

這裡最大的難點(其實也沒有什麼難的),就是就是min的值。因為初始值是0,所有向左邊滑動一定是負值。可以得到max一定是0。
那麼min的值就是: 屏幕的寬度-圖片的張數*圖片的寬度

  • 圖片的寬度為0.88 * window.innerWidth
  • 屏幕的寬度為window.innerWidth
  • 圖片的張數為 5

第30秒

如上圖所示,相對於傳統的swipe然後再去觸發滾動,上面的跟手然後再去校正的體驗是更加良好的。那麼怎麼實現呢?
首先,AlloyTouch是支持step配置。

new AlloyTouch({
    step: 100,
    ...
    ...
    ...
})

只要用戶設置的step,最後運動結束之後,AlloyTouch都會幫用戶校正到最接近的step的整數倍的位置。
比如上面是100:

  • 如果運動的對象停在 120,會被校正到100
  • 如果運動的對象停在 151,會被校正到200
  • 如果運動的對象停在 281,會被校正到300
  • 如果運動的對象停在 21,會被校正到0

第40秒

當然這有個問題,比如用戶從0滑倒30,其實他是想去100,但是會被校正到0!!!
所以光使用校正是不夠。還需要一個API去阻止校正自己去註入邏輯滾動相應的位置。所以你必須支持AlloyTouch的:

to 方法

  to(v [, time, easing]) 

其中time和easing不是必須。time的預設值是600.

第50秒

var items = document.querySelectorAll("#nav a");
var scroller = document.querySelector("#carousel-scroller");
Transform(scroller);
new AlloyTouch({
    touch: "#carousel-container",//反饋觸摸的dom
    vertical: false,//不必需,預設是true代表監聽豎直方向touch
    target: scroller, //運動的對象
    property: "translateX",  //被運動的屬性
    min: window.innerWidth * -3, //不必需,運動屬性的最小值
    max: 0, //不必需,滾動屬性的最大值
    step: window.innerWidth,
    inertia: false, //不必需,是否有慣性。預設是true
    touchEnd: function (evt, v, index) {

        var step_v = index * this.step * -1;
        var dx = v - step_v;

        if (v < this.min) {
            this.to(this.min);
        } else if (v > this.max) {
            this.to(this.max);
        } else if (Math.abs(dx) < 30) {
            this.to(step_v);
        }
        else if (dx > 0) {
            this.to(step_v + this.step);
        } else {
            this.to(step_v - this.step);
        }

        return false;
    },
    animationEnd: function (evt , v) {
        var i = 0,
            len = items.length;
        for (; i < len; i++) {
            if (i === this.currentPage) {
                items[i].classList.add("active");
            } else {
                items[i].classList.remove("active");
            }
        }

    }
})

因為一共四張圖,所以
min得到的結果是 window.innerWidth * -3
max的值依然是0
step的值是 window.innerWidth
通過設置 inertia: false,把慣性運動關掉
註意看touchEnd裡面的return false是為了不去計算手指離開屏幕後的校正位置、慣性運動等邏輯。
touchEnd可以拿到當前的位置v以及當前所處的位置index。
animationEnd是運動結束後的回調,用來設置nav的active。當然不是所有瀏覽器都支持classList,這裡只是為了演示代碼足夠簡潔。
再註意,在touchEnd和animationEnd中能拿到this,也就是AlloyTouch當前對象的實例。其中,
to方法用來運動當前對象
step是當前的步長
還可以拿到currentPage去獲取當前所處的頁碼
還能拿到min和max值,得到運動的區間。

最後

所有例子演示和代碼可以在Github上找到。
Github:https://github.com/AlloyTeam/AlloyTouch



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

-Advertisement-
Play Games
更多相關文章
  • 用 Vue.js 2.x 與相配套的 Vue Router、Vuex 搭建了一個最基本的後臺管理系統的骨架。 當然先要安裝 node.js(包括了 npm)、vue-cli 項目結構如圖所示: assets 中是靜態資源,components 中是組件(以 .vue 為尾碼名的文件),store 中 ...
  • 在學習產品的道路上,第一篇產品分析報告。 鏈接:http://www.woshipm.com/evaluating/486208.html ...
  • 移動端不同尺寸設備dpi不同,會造成1px線條不同程度的縮放,可利用媒體查詢device-pixel-ratio,進行不同情況匹配: @media(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5){//dpi:1.5 . ...
  • 測試手機為IPHONE6,開發者工具版本0.10.102800 微信小程式里的canvas 非 h5 canvas有很多不一樣的地方,以下把微信小程式的canvas叫做wxcanvas 下麵全是我一點點測試出的乾貨,耐心看: 1.wxcanvas,不像h5canvas那樣有width和height屬 ...
  • 以後用起來就方便了把 css文件引入 <link rel="stylesheet" type="text/css" href="css/jquery.mCustomScrollbar.css"> js引入 <script type="text/javascript" src="js/jquery.m ...
  • 開始記錄js學習; udacity,edx上不去; ...
  • 移動端響應式頁面開發說簡單也簡單,根據屏幕尺寸調節根字體大小。 大寬度用%,高度和小寬度全部使用rem,簡單粗暴。 之前閱讀過大漠老師的 "使用Flexible實現手淘H5頁面的終端適配" ,介紹了手淘項目的H5製作規範。 在手淘的設計師和前端開發協作過程中:手淘設計師常選擇iPhone6作為基準設 ...
  • [1]操作說明 [2]目錄參照 [3]目錄連接 [4]目錄顯示 [5]目錄樣式 [6]點擊事件 [7]隱藏功能 [8]滾輪功能 [9]拖拽功能 [10]代碼展示 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...