在實際的移動端開發中,經常會使用到刷新與加載的功能。使用一些成熟的控件既能節約開發時間,又能增強代碼的穩定性。本文介紹的是常用的關於移動端滾動和刷新與加載的控件。
iScroll的產生完全是因為移動版webkit瀏覽器,例如在iPhone,Android 的移動設備上。
iScroll的原理是外層有一個溢出隱藏(overflow:hidden;)的DOM,然后這個區域內的第一個DOM結構會被實例化,其包裹的內容可以縱向或者橫向的滾動,所以在使用iScroll的時候,滾動元素要盡量的簡單,減少DOM個數,減少嵌套,因為DOM結構越是復雜iScroll運行起來就越是吃力,有可能會造成某些節點顯示不正常的情況。 所以,推薦使用的DOM結構如下:
<div id="wrapper"> <ul> <li>row 11</li> <li>row 10</li> <li>row 9</li> <li>row 8</li> <li>row 7</li> <li>row 6</li> <li>row 5</li> <li>row 4</li> <li>row 3</li> <li>row 2</li> <li>row 1</li> </ul> </div>
注意:只有wrapper里的第一個子元素(ul)才可以被實例化滾動,並且要結合外層的DOM(wrapper)才能實現滾動。如果 wrapper中有多個ul,只有wrapper里的第一個子元素(ul)才可以被實例化滾動。
在JS插入頁面DOM結構和數據之前實例化iScroll,也就是在JS的最開始實例化,因為之后可能會使用JS來插入DOM或者數據,這樣以來能確保在插入數據之前iScroll已經實例化了。
關於iScroll詳細用法不過多講,后面會給到常用的api,然后是和pullToRefresh結合使用,達到我們想要的效果。
<!DOCTYPE html> <html> <head> <title>pull to refresh</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <link rel="stylesheet" href="pullToRefresh.css"/> <script src="iscroll.js"></script> <script src="pullToRefresh.js"></script> <style type="text/css" media="all"> body, html { padding: 0; margin: 0; height: 100%; font-family: Arial, Helvetica, sans-serif; } </style> </head> <body> <!--must content ul--> <div id="wrapper"> <ul> <li>row 11</li> <li>row 10</li> <li>row 9</li> <li>row 8</li> <li>row 7</li> <li>row 6</li> <li>row 5</li> <li>row 4</li> <li>row 3</li> <li>row 2</li> <li>row 1</li> </ul> </div> <script> refresher.init({ id:"wrapper", pullDownAction:Refresh, /*下拉刷新*/ pullUpAction:Load /*上拉加載*/ }); var generatedCount = 0; function Refresh() { setTimeout(function () { // 模擬網絡阻塞, 移除定時器 var el, li, i; el =document.querySelector("#wrapper ul"); el.innerHTML=''; for (i=0; i<11; i++) { li = document.createElement('li'); li.appendChild(document.createTextNode('async row ' + (++generatedCount))); el.insertBefore(li, el.childNodes[0]); } myScroll.refresh();/******操作成后一定要記得刷新*****/ }, 1000); } function Load() { setTimeout(function () { // 模擬網絡阻塞, 移除定時器 var el, li, i; el =document.querySelector("#wrapper ul"); for (i=0; i<2; i++) { li = document.createElement('li'); li.appendChild(document.createTextNode('async row ' + (++generatedCount))); el.appendChild(li, el.childNodes[0]); } myScroll.refresh();/******操作成后一定要記得刷新*****/ }, 1000); } </script> </body> </html>
以上為上下拉時候的效果,上拉加載后就會依次往下增加ul的長度(因為增加了li),下拉刷新則只會顯示最新的11條信息。
iScroll中的參數:
在實例化iScroll的時候,可以傳入兩個參數,第一個參數是實例化的外層的DOM的ID,第二個參數是iScroll執行方法的對象:
第二個參數內容如下,這個參數會控制iScroll的效果:
hScroll false 禁止橫向滾動 true橫向滾動 默認為true
vScroll false 禁止垂直滾動 true垂直滾動 默認為true
hScrollbar false隱藏水平方向上的滾動條
vScrollbar false 隱藏垂直方向上的滾動條
fadeScrollbar false 指定在無漸隱效果時隱藏滾動條
hideScrollbar 在沒有用戶交互時隱藏滾動條 默認為true
bounce 啟用或禁用邊界的反彈,默認為true
momentum 啟用或禁用慣性,默認為true,
此參數在你想要保存資源的時候非常有用
lockDirection false取消拖動方向的鎖定,
true拖動只能在一個方向上(up/down 或者left/right)
當然在第二個參數中,也有一些方法可以執行:
(1)scrollTo(x, y, time, relative)方法:傳入4個參數:X軸滾動距離,Y軸滾動距離,效果時間,是否相對當前位置。
(2)refresh()方法:在DOM結構發生改變之后,需要刷新iScroll,否則滾動插件會實例化的不准確
(3)onPosChange,有沒有一個方法能返回位置的變化?你可以查詢一下自己所用的iScroll中有沒有onPosChange方法
(4)onScrollEnd:滾動結束時執行的事件,如果想在滾動結束時出發摸個事件,這個方法就拍上用處了
(5)onRefresh:在DOM結構發生改變之后,需要刷新iScroll,否則滾動插件會實例化的不准確,onRefresh是刷新完iScroll會執行的方法。
(6)onBeforeScrollStart:開始滾動前的時間回調,默認是阻止瀏覽器默認行為 。
(7)onScrollStart:開始滾動的回調。
(8)onBeforeScrollMove:在內容移動前的回調。
(9)onScrollMove:內容移動的回調。
(10)onBeforeScrollEnd:在滾動結束前的回調。
(11)onTouchEnd:手離開屏幕后的回調。
(12)onDestroy:銷毀實例的回調。