jQuery模擬原生態(tài)App上拉刷新下拉加載更多頁(yè)面及原理
很多App中,新聞或者展示類(lèi)都存在下拉刷新和上拉加載的效果,網(wǎng)上提供了實(shí)現(xiàn)這種效果的第三方類(lèi)(詳情請(qǐng)見(jiàn)MJRefresh和EGOTableViewPullRefresh),用起來(lái)很方便,但是閑暇之余,我們可以思考下,這種效果實(shí)現(xiàn)的原理是什么,我以前說(shuō)過(guò),只要是動(dòng)畫(huà)都是騙人的,只要不是硬件問(wèn)題大部分效果都能在系統(tǒng)UI的基礎(chǔ)上做出來(lái).
下面通過(guò)jQuery手機(jī)端上拉下拉刷新頁(yè)面代碼,很像QQ空間客戶端或者微信下拉刷新頁(yè)面特效代碼。
請(qǐng)看下面效果圖:
html代碼:
<div id="wrapper"> <ul> <li>row </li> <li>row </li> <li>row </li> <li>row </li> <li>row </li> <li>row </li> <li>row </li> <li>row </li> <li>row </li> <li>row </li> </ul> </div> <script> for (var i = ; i < document.querySelectorAll("#wrapper ul li").length; i++) { document.querySelectorAll("#wrapper ul li")[i].colorfulBg(); } refresher.init({ id: "wrapper",//<------------------------------------------------------------------------------------┐ pullDownAction: Refresh, pullUpAction: Load }); var generatedCount = ; function Refresh() { setTimeout(function () { // <-- Simulate network congestion, remove setTimeout from production! var el, li, i; el = document.querySelector("#wrapper ul"); el.innerHTML = ''; for (i = ; i < ; i++) { li = document.createElement('li'); li.appendChild(document.createTextNode('async row ' + (++generatedCount))); el.insertBefore(li, el.childNodes[]); } wrapper.refresh();/****remember to refresh after action completed! ---yourId.refresh(); ----| ****/ for (var i = ; i < document.querySelectorAll("#wrapper ul li").length; i++) { document.querySelectorAll("#wrapper ul li")[i].colorfulBg(); } }, ); } function Load() { setTimeout(function () {// <-- Simulate network congestion, remove setTimeout from production! var el, li, i; el = document.querySelector("#wrapper ul"); for (i = ; i < ; i++) { li = document.createElement('li'); li.appendChild(document.createTextNode('async row ' + (++generatedCount))); el.appendChild(li, el.childNodes[]); } wrapper.refresh();/****remember to refresh after action completed!?。?---id.refresh(); --- ****/ for (var i = ; i < document.querySelectorAll("#wrapper ul li").length; i++) { document.querySelectorAll("#wrapper ul li")[i].colorfulBg(); } }, ); } </script>
下拉刷新和上拉加載更多原理詳解,具體介紹通過(guò)代碼分析。
代碼如下:
// 下拉刷新的原理 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { if (scrollView.contentOffset.y < - 100) { [UIView animateWithDuration:1.0 animations:^{ // frame發(fā)生偏移,距離頂部150的距離(可自行設(shè)定) self.tableView.contentInset = UIEdgeInsetsMake(150.0f, 0.0f, 0.0f, 0.0f); } completion:^(BOOL finished) { /** * 發(fā)起網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求刷新數(shù)據(jù) */ }]; } } // 上拉加載的原理 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { NSLog(@"%f",scrollView.contentOffset.y); NSLog(@"%f",scrollView.frame.size.height); NSLog(@"%f",scrollView.contentSize.height); /** * 關(guān)鍵--> * scrollView一開(kāi)始并不存在偏移量,但是會(huì)設(shè)定contentSize的大小,所以contentSize.height永遠(yuǎn)都會(huì)比contentOffset.y高一個(gè)手機(jī)屏幕的 * 高度;上拉加載的效果就是每次滑動(dòng)到底部時(shí),再往上拉的時(shí)候請(qǐng)求更多,那個(gè)時(shí)候產(chǎn)生的偏移量,就能讓contentOffset.y + 手機(jī)屏幕尺寸高大于這 * 個(gè)滾動(dòng)視圖的contentSize.height */ if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height) { NSLog(@"%d %s",__LINE__,__FUNCTION__); [UIView commitAnimations]; [UIView animateWithDuration:1.0 animations:^{ // frame發(fā)生的偏移量,距離底部往上提高60(可自行設(shè)定) self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 60, 0); } completion:^(BOOL finished) { /** * 發(fā)起網(wǎng)絡(luò)請(qǐng)求,請(qǐng)求加載更多數(shù)據(jù) * 然后在數(shù)據(jù)請(qǐng)求回來(lái)的時(shí)候,將contentInset改為(0,0,0,0) */ }]; } }
以上內(nèi)容就是本文針對(duì)jQuery模擬原生態(tài)App上拉刷新下拉加載更多頁(yè)面及原理詳解,希望對(duì)大家有所幫助。
相關(guān)文章
Easyui Datagrid自定義按鈕列(最后面的操作列)
做項(xiàng)目的時(shí)候因?yàn)樾枨?要在表格的最后添加一列操作列,easyUI貌似沒(méi)有提供這種功能,下面我們來(lái)自定義按鈕列,具體實(shí)現(xiàn)代碼,大家參考下本文吧2017-07-07淺談jQuery hover(over, out)事件函數(shù)
下面小編就為大家?guī)?lái)一篇淺談jQuery hover(over, out)事件函數(shù)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-12-12jQuery教程 $()包裝函數(shù)來(lái)實(shí)現(xiàn)數(shù)組元素分頁(yè)效果
最近一周在做中文站搜索禮品widget的需求,這個(gè)需求中有一個(gè)分頁(yè)的功能2013-08-08使用jquery獲取url以及jquery獲取url參數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇使用jquery獲取url以及jquery獲取url參數(shù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05jQuery 中$(this).index與$.each的使用指南
這篇文章主要介紹了jQuery 中$(this).index與$.each的使用方法,以及使用環(huán)境,有需要的小伙伴自己參考下吧2014-11-11jquery點(diǎn)擊頁(yè)面任何區(qū)域?qū)崿F(xiàn)鼠標(biāo)焦點(diǎn)十字效果
鼠標(biāo)點(diǎn)擊聚焦,地圖定位,在圖片上突出顯示,焦點(diǎn)定位頁(yè)面元素,這些都是在系統(tǒng)開(kāi)發(fā)是經(jīng)常需要用到的,下面為大家介紹下具體的實(shí)現(xiàn),感興趣的朋友可以參考下哈2013-06-06JQUERY簡(jiǎn)單按鈕輪換選中效果實(shí)現(xiàn)方法
這篇文章主要介紹了JQUERY簡(jiǎn)單按鈕輪換選中效果實(shí)現(xiàn)方法,涉及jQuery鼠標(biāo)事件與css樣式操作的基本技巧,需要的朋友可以參考下2015-05-05jQuery remove()過(guò)濾被刪除的元素(推薦)
jQuery remove() 方法也可接受一個(gè)參數(shù),允許您對(duì)被刪元素進(jìn)行過(guò)濾。下面通過(guò)實(shí)例代碼給大家介紹jQuery remove()過(guò)濾被刪除的元素,需要的的朋友參考下吧2017-07-07jQuery實(shí)現(xiàn)類(lèi)似標(biāo)簽風(fēng)格的導(dǎo)航菜單效果代碼
這篇文章主要介紹了jQuery實(shí)現(xiàn)類(lèi)似標(biāo)簽風(fēng)格的導(dǎo)航菜單效果代碼,涉及jquery鼠標(biāo)事件操作頁(yè)面元素的遍歷與樣式動(dòng)態(tài)修改技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08