成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

AlloyTouch實(shí)現(xiàn)下拉刷新

RdouTyping / 493人閱讀

摘要:但是在某些場(chǎng)景下,還是需要擁有自身的下拉刷新的能力。比如需要統(tǒng)一和安卓的體驗(yàn)需要自定義下拉刷新動(dòng)畫需要已內(nèi)的背景或者其他元素有聯(lián)動(dòng)交互反饋而拖動(dòng)整個(gè)的下拉刷新無(wú)法滿足這些場(chǎng)景。很明顯非常擅長(zhǎng)處理下拉刷新的需求。

原文地址:https://github.com/AlloyTeam/AlloyTouch/wiki/Pull-to-refresh

效果展示

掃碼體驗(yàn)

你也可以點(diǎn)擊這里訪問(wèn)Demo
可以點(diǎn)擊這里查看代碼

背景

在手機(jī)QQ內(nèi)部,其實(shí)客戶端提供了下拉刷新的能力,拖動(dòng)整個(gè)webview進(jìn)行下拉刷新,loading以及l(fā)oading相關(guān)的wording和動(dòng)畫都是客戶端的。解決了一部分需要下拉場(chǎng)景的問(wèn)題。但是在某些場(chǎng)景下,還是需要web擁有自身的下拉刷新的能力。比如:

需要統(tǒng)一IOS和安卓的體驗(yàn)

需要自定義下拉刷新動(dòng)畫

需要已web內(nèi)的背景或者其他Dom元素有聯(lián)動(dòng)交互反饋

而拖動(dòng)整個(gè)webview的下拉刷新無(wú)法滿足這些場(chǎng)景。AlloyTouch很明顯非常擅長(zhǎng)處理web下拉刷新的需求。

頁(yè)面骨架實(shí)現(xiàn)

pullRefresh在AlloyTouch header的下面,其中:
header zIndex > pullRefresh zIndex >wrapper和scroller的 zIndex。

下拉動(dòng)畫實(shí)現(xiàn)

看以看到,下拉到一定程度,箭頭有個(gè)旋轉(zhuǎn)動(dòng)畫,以及wording描述也會(huì)變化。這里主要利用js去切換class去實(shí)現(xiàn),動(dòng)畫使用CSS transition實(shí)現(xiàn)。所以要預(yù)先定義好兩種class。

.arrow {
    margin-top: 5px;
    margin-bottom: 5px;
}

.arrow:after {
    content: "Pull to refresh";
}
    
.arrow_up.arrow:after {
    content: "Release to refresh";
}

.arrow_up img {
    transform: rotateZ(180deg);
    -webkit-transform: rotateZ(180deg);
}

.pull_refresh img {
    width: 20px;
    transition: transform .4s ease;
}

通過(guò)上面定要好的class,在js邏輯里面只需要負(fù)責(zé)remove和add arrow_up clas便可以實(shí)現(xiàn)箭頭旋轉(zhuǎn)和wording的切換。

Loading動(dòng)畫實(shí)現(xiàn)

    
        
    
        
       ...
       ...

loading效果使用SVG去實(shí)現(xiàn),利用12個(gè)rect的 indefinite animate去實(shí)現(xiàn)。begin代表開(kāi)始時(shí)間有個(gè)遞增達(dá)到loading的效果。

核心實(shí)現(xiàn)
var scroller = document.querySelector("#scroller"),
    arrow = document.querySelector("#arrow"),
    pull_refresh = document.querySelector("#pull_refresh"),
    list = document.querySelector("#list"),
    index = 0;

//給pull_refresh注入transform屬性并且關(guān)閉透視投影
Transform(pull_refresh, true);
//給scroller注入transform屬性并且關(guān)閉透視投影
Transform(scroller, true);

new AlloyTouch({
    touch: "#wrapper",
    target: scroller, 
    property: "translateY",  
    initialVaule: 0,
    min: window.innerHeight - 45 - 48 - 2000, 
    max: 0,
    change: function (value) {
        //pull_refresh的translateY由scroller的value決定,所以向下拉scroller的時(shí)候,可以拉動(dòng)pull_refresh
        pull_refresh.translateY = value;
    },
    touchMove: function (evt, value) {
        if (value > 70) { //當(dāng)下拉到達(dá)70px的時(shí)候下箭頭變成上箭頭并且修改wording
            //為了代碼簡(jiǎn)潔,直接使用classList
            //http://caniuse.com/#search=classList
            //下箭頭變成上箭頭并且修改wording
            arrow.classList.add("arrow_up");
        } else {  //當(dāng)下拉未到達(dá)70px上箭頭變成下箭頭并且修改wording
            arrow.classList.remove("arrow_up");
        }
    },
    touchEnd: function (evt, value) {
        if (value > 70) {
            //運(yùn)動(dòng)到60px的地方,用來(lái)顯示loading
            this.to(60);
            //模擬請(qǐng)求~~~
            mockRequest(this);
            //return false很重要,用來(lái)防止執(zhí)行alloytouch內(nèi)部超出邊界的回彈和慣性運(yùn)動(dòng)
            return false;
        }
    }
});

//模擬請(qǐng)求~~~
function mockRequest(at) {
    //顯示loading~~
    pull_refresh.classList.add("refreshing");
    //模擬cgi請(qǐng)求
    setTimeout(function () {
        var i = 0,
            len = 3;
        for (; i < len; i++) {
            var li = document.createElement("li");
            li.innerHTML = "new row " + index++;
            list.insertBefore(li, list.firstChild);
        }
        //重置下拉箭頭和wording
        arrow.classList.remove("arrow_up");
        //移除loading
        pull_refresh.classList.remove("refreshing");
        //回到初始值
        at.to(at.initialVaule);
        //由于加了三個(gè)li,每個(gè)li高度為40,所以min要變得更小
        at.min -= 40 * 3;
    }, 500);
}

不廢話,都在注釋里。

開(kāi)始AlloyTouch

Github:https://github.com/AlloyTeam/AlloyTouch

任何意見(jiàn)和建議歡迎new issue,AlloyTouch團(tuán)隊(duì)會(huì)第一時(shí)間反饋。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81123.html

相關(guān)文章

  • AlloyTouch手勢(shì)庫(kù)學(xué)習(xí)筆記

    摘要:動(dòng)畫庫(kù)學(xué)習(xí)筆記可以很方便的用做下拉刷新,抽獎(jiǎng)轉(zhuǎn)盤等效果,我一直很好奇他是如何工作的,尤其是它能完美模擬原生的平滑滾動(dòng)和慣性回彈等效果,而且體積小,速度快。當(dāng)軸逐漸增加到達(dá)時(shí),當(dāng)前值軸會(huì)到達(dá)目標(biāo)值。類似的還有,屬性值的排序會(huì)造成影響。 AlloyTouch動(dòng)畫庫(kù)學(xué)習(xí)筆記 alloyTouch可以很方便的用做下拉刷新,抽獎(jiǎng)轉(zhuǎn)盤等效果,我一直很好奇他是如何工作的,尤其是它能完美模擬原生的平滑...

    OBKoro1 評(píng)論0 收藏0
  • 一分鐘搞定AlloyTouch圖片輪播組件

    摘要:所以制作各種各樣的輪播組件還是得心應(yīng)手。第一種輪播圖如上圖所示。因?yàn)槌跏贾凳?,所有向左邊滑?dòng)一定是負(fù)值。可以得到一定是??梢阅玫疆?dāng)前的位置以及當(dāng)前所處的位置。是運(yùn)動(dòng)結(jié)束后的回調(diào),用來(lái)設(shè)置的。 輪播圖也涉及到觸摸和觸摸反饋,同時(shí),AlloyTouch可以把慣性運(yùn)動(dòng)打開(kāi)或者關(guān)閉,并且設(shè)置min和max為運(yùn)動(dòng)區(qū)域,超出會(huì)自動(dòng)回彈。除了一般的豎向滾動(dòng),AlloyTouch也可以支持橫向滾動(dòng),甚...

    tanglijun 評(píng)論0 收藏0
  • AlloyTouch實(shí)戰(zhàn)--60行代碼搞定QQ看點(diǎn)資料卡

    摘要:設(shè)置為,相對(duì)于高度為的來(lái)說(shuō)就是。再看這一堆使用最關(guān)鍵的一點(diǎn)就是計(jì)算和的值??梢钥吹交卣{(diào)里可以拿到,也就是對(duì)象的實(shí)例,當(dāng)?shù)扔诖頋L到了底部,所以這里加上代表快要滾動(dòng)底部已經(jīng)看到了加載更多。開(kāi)始任何意見(jiàn)和建議歡迎,團(tuán)隊(duì)會(huì)第一時(shí)間反饋。 原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先驗(yàn)貨 showImg(https://...

    wenyiweb 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<