1. 程式人生 > >AlloyTouch實戰--60行程式碼搞定QQ看點資料卡

AlloyTouch實戰--60行程式碼搞定QQ看點資料卡

先驗貨

如你體驗所見,流程的滾動的同時還能支援頭部的動畫?不斷地載入新資料還能做到流暢的滑動!怎麼做得的?使用AlloyTouch CSS 0.2.0及以上版本便可!

頭部動畫

載入更多

實現程式碼

var infoList = document.getElementById("infoList"),
    mockHTML = infoList.innerHTML,
    scroller = document.getElementById("scroller"),
    header = document.getElementById("header"),
    userLogo = document.getElementById("user-logo-wrapper"),
    loading = false,
    alloyTouch = null;

Transform(scroller, true);
Transform(header);
header.originY = -70;
header.translateY = -70;
Transform(userLogo);

alloyTouch = new AlloyTouch({
    touch: "#wrapper",
    vertical: true,
    target: scroller,
    property: "translateY",
    maxSpeed: 2,
    outFactor: 0.1,
    min: 160 * -20 + window.innerHeight - 202 - 50,
    max: 0,
    lockDirection: false,
    touchStart: function () {
        reastMin();
    },
    lockDirection: false,
    change: function (v) {
        if (v <= this.min + 5 && !loading) {
            loading = true;
            loadMore();
        }
        if (v < 0) {
            if (v < -140) v = -140;
            var scaleY = (240 + v) / 240;
            header.scaleY = scaleY;
            userLogo.scaleX = userLogo.scaleY = scaleY;
            userLogo.translateY = v / 1.7;
        } else {
            var scaleY = 1 + v / 240;
            header.scaleY = scaleY;
            userLogo.scaleX = userLogo.scaleY = scaleY;
            userLogo.translateY = v / 1.7;
        }
    }
})

function loadMore() {
    setTimeout(function () {
        infoList.innerHTML += mockHTML;
        loading = false;
        reastMin();
    }, 500)
}

function reastMin() {
    alloyTouch.min = -1 * parseInt(getComputedStyle(scroller).height) + window.innerHeight - 202;
}

document.addEventListener("touchmove", function (evt) {
    evt.preventDefault();
}, false);

就這麼多程式碼。當然你要引用一個transformjs和alloy_touch.css.js。先看這一堆:

Transform(scroller, true);
Transform(header);
header.originY = -70;
header.translateY = -70;
Transform(userLogo);
  • Transform(xxx)是什麼意思?

    賦予xxx transformation能力

  • 第一個scroller加上true代表關閉透視投影,為什麼要關閉透視投影?

    因為scroller裡面是有文字,防止文字在IOS中模糊的情況。

  • header是頂部的那個藍色的區域。為什麼要設定originY和translateY?為什麼要設定為-70?

    因為header的高度為140px,使用者向上滾動的過程中,需要對其進行scaleY變換。通常我們的做法是設定CSS3 transform-origin為 center top。而使用transformjs之後,可以拋棄transform-origin,使用originY或者originX屬性便可。originY 設定為 -70,相對於高度為140的header來說就是center top。

再看這一堆:

alloyTouch = new AlloyTouch({
    touch: "#wrapper",
    vertical: true,
    target: scroller,
    property: "translateY",
    maxSpeed: 2,
    outFactor: 0.1,
    lockDirection: false,
    min: 160 * -20 + window.innerHeight - 202 - 50,
    max: 0,
    touchStart: function () {
        resetMin();
    },
    lockDirection: false,
    ...
    ...
    ...
})
...
...
function resetMin() {
    alloyTouch.min = -1 * parseInt(getComputedStyle(scroller).height) + window.innerHeight - 202;
}

使用AlloyTouch最關鍵的一點就是計算min和max的值。min和max決定了可以滾到哪裡,到了哪裡會進行回彈等等。這裡max是0毫無疑問。

  • 但是min那一堆加減乘除是什麼東西?

    這裡首次載入是20行資料,每一行高度大概160,主意是大概, window.innerHeight是視窗的高度,202px是滾動的容器的padding top的值,50px是用來留給顯示載入更多的...

如上圖所示,主要是需要求???的高度。

  • 那麼怎麼解決大概160*20的問題?

    touchStart的時候reastMin。resetMin會去通過getComputedStyle計算整個scroller的高度。

  • maxSpeed是幹什麼用的?

    用來限制滾動的最大速度,個人感覺調整到2挺舒適,這個可以根據場景和被運動的屬性靈活配置。

  • outFactor是幹什麼用的?

    用來設定超出min或者max進行拖拽的運動比例係數,係數越小,超出min和max越難拖動,也就是受到的阻力越大。

  • lockDirection是幹什麼用的?

    lockDirection預設值是true。代表使用者起手時候是橫向的,而你監聽的是豎直方向的touch,這樣的話是不會觸發運動。只有起手和監聽對應上才會有觸控運動。這裡把lockDirection設定成false就沒有這個限制,不管使用者起手的direction,都會有觸控運動。

再看AlloyTouch注入的change事件!頭部動效核心的一個配置函式:

change: function (v) {
    if (v <= this.min + 5 && !loading) {
        loading = true;
        loadMore();
    }
    if (v < 0) {
        if (v < -140) v = -140;
        var scaleY = (240 + v) / 240;
        header.scaleY = scaleY;
        userLogo.scaleX = userLogo.scaleY = scaleY;
        userLogo.translateY = v / 1.7;
    } else {
        var scaleY = 1 + v / 240;
        header.scaleY = scaleY;
        userLogo.scaleX = userLogo.scaleY = scaleY;
        userLogo.translateY = v / 1.7;
    }
}

v代表當前被運動物件的被運動屬性的當前的值,根據這個v去做一些效果和載入更多。

  • 什麼時候載入更多?

    當滾動你能看到載入更多的時候去載入更多

  • 什麼時候能看到載入更多?

    v <= this.min + 5。 可以看到change回撥裡可以拿到this,也就是AlloyTouch物件的例項,當v等於this.min代表滾到了底部,所以這裡加上5代表快要滾動底部已經看到了載入更多。就去執行loadMore函式。

  • loading是幹什麼用的?

    防止重複loadMore用得,因為change執行得很頻繁,所以這裡會通過loading的狀態去鎖上。

  • 下面一堆設定scaleX、scaleY、translateY以及一堆數字是怎麼來的?

    慢慢除錯得出的最佳效果~~反正就是根據v的數值對映到 header和使用者頭像的transform屬性上,這裡就不一一講了。

再看loadMore:

function loadMore() {
    setTimeout(function () {
        infoList.innerHTML += mockHTML;
        loading = false;
        reastMin();
    }, 500)
}

這裡使用了一段假的HTML去模擬AJAX非同步請求以及資料轉HTML的過程,整個耗時500ms,500ms後會去:

  • 插入HTML
  • 重置loading狀態
  • 重置AlloyTouch的min

最後:

document.addEventListener("touchmove", function (evt) {
    evt.preventDefault();
}, false);

阻止掉整個document的預設事件,不會把整個頁面拖下來,在手Q裡的話,你就看不到網址和X5核心提供技術支援了。

開始AlloyTouch

任何意見和建議歡迎new issue,AlloyTouch團隊會第一時間反饋。

相關推薦

AlloyTouch實戰--60程式碼QQ資料

先驗貨 訪問DEMO你也可以點選這裡 原始碼可以點選這裡 如你體驗所見,流程的滾動的同時還能支援頭部的動畫?不斷地載入新資料還能做到流暢的滑動!怎麼做得的?使用AlloyTouch CSS 0.2.0及以上版本便可! 頭部動畫 載入更多 實現程式碼 var infoList = document.

如何寫一個簡單的猜數字遊戲?60程式碼,進來轉轉吧

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void menu() { printf("******************************\n"); printf(“歡迎來到猜數

python中三程式碼發郵件

一般發郵件方法 我以前在通過Python實現自動化郵件功能的時候是這樣的: import smtplib from email.mime.text import MIMEText from email.header import Header # 傳送郵箱伺服器 smtpserver

Swift.輪轉動畫,100程式碼

實現效果: 靜止時:子view對稱排列,允許動態新增,0~24個都能較好的顯示. 旋轉時:中心view不動,子view隨手勢旋轉,最下方子view變大突出. 實現思路: 所有的控制元件全部加到一個大的背景view上,本質上旋轉的是這個背景view,在旋轉背景view的同

Swift.左側弧形tableView,50程式碼

實現效果: 左側有弧形區域的tableview,實現簡單螢幕適配,可修改弧度和cell高度. 可增加中間cell最大,上下端cell依次變小的效果. 實現方式: 1.實現根據tableView.contentOffset.y獲取偏移角度方法 2.獲取螢幕中顯示的ce

用java8實現6程式碼遞迴刪除多級非空目錄

在review 程式碼的時候,看到同事寫的程式碼刪除多級非空目錄,寫的很長一串,太複雜,就自己寫了一個,分享給大家: package com.test.java8; import java.io.File; import java.util.Arrays; import java.uti

python入門機器學習,3程式碼線性迴歸

  本文著重是重新梳理一下線性迴歸的概念,至於幾行程式碼實現,那個不重要,概念明確了,程式碼自然水到渠成。   “機器學習”對於普通大眾來說可能會比較陌生,但是“人工智慧”這個詞簡直是太火了,即便是風雲變化的股市中,只要是與人工智慧、大資料、雲端計算相關的概念股票都會有很好的表現。機器學習是實現人工智慧的基

如何把小電影女主角換成Angelababy,一百程式碼AI換臉技術

在座的各位,是不是已經試過人臉解鎖手機了?是不是嘗試過刷臉購物了?玩過人臉識別的動物表情小遊戲了沒?如果都有的話,那麼想必咱們可以達成一個共識:AI在人臉這件事上已經越來越精通了。 如果說識別只是AI對人臉做出的第一件事,那麼第二件事是什麼呢?從種種跡象來看,答案只有一個,那就是給人換臉。

10程式碼微信支付(Java版)

微信支付痛點 對於大多數同學來說,要開發微信支付可不簡單。 附上微信支付官方文件https://pay.weixin.qq.com/wiki/doc/api/index.html 從文件上可以看出,你需要解決很多問題,我就隨便挑幾個吧。 xml與物件的互轉: 微

python九程式碼百度翻譯

筆者最近在做一個前端的翻譯功能,用到了百度翻譯的api,不過每月都有200萬字的翻譯限制。所以就開始用python爬蟲來嘗試爬取一下百度的翻譯。     先進入百度的翻譯頁面,網址 http://fanyi.baidu.com/translate。然後進入開發者模式(F12

Java三程式碼MD5加密

Get MD5 Hash In A Few Lines Of Java /** * 對字串md5加密 * * @param str * @return */ public String getMD5(String str) { String ret = null; try

android6.0動態許可權的設定——幾程式碼

只需要兩步走: 一、程式碼請求許可權 /** * android6.0執行時許可權,檢測 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//6.0以上 int checkPermission =

5程式碼floyd演算法

簡介 floyd是圖搜演算法中很經典的一個演算法,用於求一副圖中任意兩點之間的最短路徑(時間,花費等)。其演算法思想感覺比Dijkstra簡單,而且程式碼也很容易實現。不過就是效率比較低,三個for迴圈導致複雜度為O(n3)。 例項 假如有如下的地圖,

For迴圈7程式碼九九乘法表

      相信剛開始Python入門的小夥伴都有列印過九九乘法表, 下面分享一個用for迴圈實現的列印方法. 就7行程式碼,可以放在IDE中debug一下,體會一下簡單巧妙的實現過程! ! for i in list(range(1, 10)): for

Android兩程式碼ViewPager的過渡動畫

[Java] 純文字檢視 複製程式碼 ? 1 2 3 4 5 6 viewpager.setPageTransformer(false, new ViewPager.PageTransformer() { @Override public void tr

超簡單,幾程式碼Android底部導航欄

  咳咳,答應過年增加新功能的,沒想到拖到現在,延遲了一個來月,尷尬,尷尬 那個,我們先忽略這尷尬的事情吧,進入正題才是最重要滴 老規矩,先上效果圖: BottomTabBar.png 跟原來的圖有個很明顯的區別,你們也一定都發現了,對不對。那麼顯眼的小紅

Golang搭建靜態伺服器- 兩程式碼

windows下,新建資料夾D:\webserver\gowww\site 並放入一個靜態網站的所有檔案 新建go原始檔 staticweb.go // staticweb package main import ( "net/http" ) func

Python黑科技 實現U盤自動讀取複製~幾程式碼

python玩蛇群 歡迎加入      901170193 先貼程式碼 import os,time,shutil,re #識別檔案的格式 regex_filename = re.compile(r'(.*zip$)|(.rar$)|(.*docx$)|(.*ppt

150程式碼輪播圖

思路:底層scrollview contentsize為3個螢幕寬 新增三個圖片檢視0,1,2  初始便偏移到中間檢視1(中間一個圖片檢視,左右各一個)   左滑或者右滑結束 scrollview都滑回原來位置,且無動畫,重新整理的是圖片檢視圖片地址,也就是每滑動一下需要處理

十幾程式碼Android呼叫支付寶支付

最近專案用到了支付寶支付,但是百度搜到的都是些如何把支付寶官方的demo進行修改,伺服器端的程式碼依舊存留在我們的專案中,非常影響我們的閱讀文件能力,在這裡,我把伺服器程式碼全部刪除,僅僅保留我們android需要呼叫的方法。 支付寶android整合地址