移動 Web 端滾動框架:XScroll
XScroll 是移動端web高性能模擬滾動解決方案,包含節點回收、下拉刷新、上拉加載等功能。
XScroll
-
config
: -
renderTo
渲染節點,內部需要包含class為xs-container,xs-content兩個容器 -
height
外容器視窗高度 -
width
外容器視窗寬度 -
containerHeight
內容器高度 -
containerWidth
內容器寬度 -
scrollbarX
是否開啟橫向滾動條 -
scrollbarY
是否開啟縱向滾動條 -
lockX
是否鎖定橫向滾動 -
lockY
是否鎖定縱向滾動 -
gpuAcceleration
是否開啟GPU硬件加速(在性能提升的同時需要注意內存控制) -
enableGPUAcceleration()
開啟硬件加速 -
disableGPUAcceleration()
開啟硬件加速 -
getOffset()
獲取水平和垂直偏移量,如:{x:0,y:100} -
getOffsetTop()
獲取垂直偏移量 -
getOffsetLeft()
獲取水平偏移量 -
scrollTo(offset, duration, easing, callback)
滾動到某處 offset必須為{x:a,y:b}格式。 -
scrollX(x, duration, easing, callback)
水平滾動到某處 -
scrollY(y, duration, easing, callback)
垂直滾動到某處 -
bounce(enable,callback)
手動觸發邊緣回彈 -
on(event,handler)
監聽某個事件 -
fire(event)
觸發某個事件 -
detach(event,[handler])
移除某個事件 -
plug(plugin)
綁定插件 -
unplug(pluginId|plugin)
移除某插件 -
getPlugin(pluginId)
獲取某個插件
XList
-
extand XScroll
-
config
: -
renderHook
逐行渲染的function,和傳入的data相關聯 -
itemHeight
默認每行行高,如果data中有定義,則該屬性被覆蓋 -
data
頁面的數據,為一個Array,數組中每個對象必須為{data:{},style:{},recycled:false} 的格式,其中data代表真實數據,style代表樣式,recycled代表當前行dom是否需要回收 -
appendDataSet(dataset)
添加一個數據集合 -
removeDataSet(datasetId)
移除一個數據集合 -
getDataSets()
獲取所有數據集合 -
getDataSetById(datasetId)
根據集合ID獲取數據集合 -
getCellByPageY(pageY)
根據視圖坐標位置獲取當前行單元 -
getCellByRow(row)
根據行號獲取當前單元 -
getCellByOffsetY(offsetY)
根據當前滾動容器的offsetTop值獲取當前單元 -
insertData(datasetIndex,rowIndex,data)
插入某組數據,插入位置為第datasetIndex組,第rowIndex行 -
getData(datasetIndex,rowIndex)
-
updateData(datasetIndex,rowIndex,data)
-
removeData(datasetIndex,rowIndex)
Private Methods
-
_getDomInfo()
獲取當前xlist文檔流內所有元素的位置、樣式、數據信息
XList.DataSet
var xlist = new XList({ //set configs here }) var dataset = new XList.DataSet({ id:"section1", data:[ { data:{ name:"Jack" } }, { data:{ name:"Tom" } } ] }); //appendTo Xlist xlist.appendDataSet(dataset); //reflow xlist.render();
-
config
-
id
唯一ID,可省略 -
data
傳入數據 -
appendData(data)
追加數據 -
insertData(index,data)
插入數據至某處 -
removeData(index)
刪除數據 -
getData(index)
獲取數據,參數為空則所有數據 -
setId(datasetId)
設置ID -
getId()
獲取ID
Plugins
PullDown
-
pull down to refresh or reload.
Example
var xlist = new XList(); // or XScroll.Plugin.PullDown var pulldown = new XList.Plugin.PullDown(); //plug xlist.plug(pulldown); xlist.render();
-
config
-
content
內容,若需要使用動畫進行如上下箭頭切換,則配置此項 -
downContent
下拉前展示的內容,默認為'Pull Down To Refresh' -
upContent
松手展示內容,默認為'Release To Refresh' -
loadingContent
加載中展示內容,默認為'Loading...' -
prefix
class前綴,默認為'xs-plugin-pulldown-' -
height
進行下拉和松手以及加載狀態切換的高度,默認60 -
setContent(html)
改變數據 -
reset(callback)
數據加載完畢后,通知控件進行回彈 -
on("loading",fn)
監聽loading事件,進行異步請求等邏輯
PullUp
-
pull up to reload.
Example
var xlist = new XList(); var pullup = new XList.Plugin.PullUp(); //plug xlist.plug(pullup); xlist.render(); pullup.on("loading",function(){ // get remote data getData(); }); var page = 1, totalPage = 10; function getData(){ // $.ajax({ url:"demo.php", dataType:"json", callback:function(data){ if(page > totalPage) { //last page pullup.reset(); //destroy plugin xlist.unplug(pullup); return; }; ds.appendData(data); xlist.render(); //loading complate pullup.complete(); page++; } }) }
-
config
-
content
內容,同PullDown -
upContent
下拉前展示的內容,默認為'Pull Up To Refresh' -
downContent
松手展示內容,默認為'Release To Refresh' -
loadingContent
加載中展示內容,默認為'Loading...' -
prefix
class前綴,默認為'xs-plugin-pullup-' -
height
加載狀態時底部被拓展的邊界高度,默認40 -
pullUpHeight
up和down切換的高度,默認80 -
setContent(html)
改變數據 -
reset(callback)
數據加載完畢后,通知控件進行回彈 -
on("loading",fn)
監聽loading事件,進行異步請求等邏輯 -
complete()
加載結束后恢復上拉控件的狀態至'up'
SwipeEdit
-
swipe left to delete or favourite etc.
Example
var xlist = new XList({ renderTo: "#J_Scroll", data: data, itemHeight: 62 , infiniteElements:"#J_Scroll .xs-row", renderHook:function(el,row){ el.innerHTML = '<div class="lbl">'+row.data.text+'</div>'+ '<div class="control"><div class="btn btn-mark">mark</div>'+ '<div class="btn btn-delete">delete</div></div>'; } }); var swipeEditPlugin = new XList.Plugin.SwipeEdit({ labelSelector:".lbl", width:maxWidth }); xlist.plug(swipeEditPlugin); xlist.on("click",function(e){ //delete if(e.target.className.match("btn-delete")){ xlist.removeData(0,e.cell._row) xlist.render(); } //mark if(e.target.className.match("btn-mark") && !e.target.className.match("btn-marked")){ var data = xlist.getData(0,e.cell._row) data.data.marked = true; e.target.className += " btn-marked"; } }) xlist.on("click", function(e) { //hide the buttons if(!e.target.parentNode.className.match('control')){ swipeEditPlugin.slideAllExceptRow(); } }); xlist.render();
-
config
-
labelSelector
操作欄的類選擇器,如'.lbl' -
width
操作欄總寬度
Questions?
-
Email:huxiaoqi567@gmail.com