3) 絕對(duì)定位。即 Pinterest ,Mark之,KISSY 采用的方式:
- 可謂是最優(yōu)的一種方案,方便添加數(shù)據(jù)內(nèi)容,窗口變化,列數(shù)/數(shù)據(jù)塊都會(huì)自動(dòng)調(diào)整;
- 線上例子。
缺點(diǎn):
- 需要實(shí)現(xiàn)知道數(shù)據(jù)塊高度,如果其中包含圖片,需要知道圖片高度;
- JS 動(dòng)態(tài)計(jì)算數(shù)據(jù)塊位置,當(dāng)窗口縮放頻繁,可能會(huì)狂耗性能。
KISSY.Waterfall 實(shí)現(xiàn)思路
KISSY 的 Waterfall 組件主要包含兩個(gè)部分,一個(gè)是對(duì)現(xiàn)有數(shù)據(jù)塊進(jìn)行排列計(jì)算各自所在的位置; 二是下拉滾動(dòng)時(shí),觸發(fā)加載數(shù)據(jù)操作,并把數(shù)據(jù)添加到目標(biāo)容器中。
1) 數(shù)據(jù)塊排列,算法步驟簡(jiǎn)述下:
- 初始化時(shí),對(duì)容器中已有數(shù)據(jù)塊元素進(jìn)行第一次計(jì)算,需要用戶給定: a,容器元素 — 以此獲取容器總寬度; b,列寬度; c,最小列數(shù); 最終列數(shù)取的是容器寬度/列寬度和最小列數(shù)的最大值,這樣保證了,當(dāng)窗口很小時(shí),仍然出現(xiàn)最小列數(shù)的數(shù)據(jù);
- 獲得列數(shù)后,需要保存每個(gè)列的當(dāng)前高度,這樣在添加每個(gè)數(shù)據(jù)塊時(shí),才知道起始高度是多少;
- 依次取容器中的所有數(shù)據(jù)塊,先尋找當(dāng)前高度最小的某列,之后根據(jù)列序號(hào),確定數(shù)據(jù)塊的left,top值,left 為所在列的序號(hào)乘以列寬,top 為所在列的當(dāng)前高度,最后更新所在列的當(dāng)前高度加上這個(gè)數(shù)據(jù)塊元素的高度,至此,插入一個(gè)元素結(jié)束;
- 當(dāng)所有元素插入完畢后,調(diào)整容器的高度為各列最大的高度值,結(jié)束依次調(diào)整;
- 性能效率上的注意點(diǎn): a,如果當(dāng)前正在調(diào)整中,又觸發(fā)了 resize 事件,需要將上次調(diào)整暫停后執(zhí)行這次調(diào)整(見(jiàn) timedChunk 函數(shù)); b,resize 觸發(fā)會(huì)很頻繁,可以將回調(diào)函數(shù)緩存一段時(shí)候后執(zhí)行,即當(dāng)這段時(shí)間內(nèi)多次觸發(fā)了resize事件,但回調(diào)函數(shù)只會(huì)執(zhí)行一次(見(jiàn) S.buffer 函數(shù))
- 感興趣的可以參見(jiàn)源碼。
2) 異步加載數(shù)據(jù),前面講的是如何對(duì)容器中已有元素進(jìn)行排列,但很多情況下,還需要不斷加載新數(shù)據(jù)塊,為此專門(mén)設(shè)計(jì)了一個(gè)獨(dú)立的模塊 KISSY.Waterfall.Loader,其實(shí)這個(gè)功能就更簡(jiǎn)單了,僅包含兩個(gè)步驟:
- 綁定滾動(dòng)事件,并確定預(yù)加載線高度值,即滾動(dòng)到哪個(gè)高度后,需要去加載數(shù)據(jù),其實(shí)這個(gè)就是列的最小高度值,這樣當(dāng)前滾動(dòng)值和最小高度值比較一下即可判斷出來(lái),是否要觸發(fā)加載數(shù)據(jù);
- 加載數(shù)據(jù),為了不對(duì)數(shù)據(jù)源做太多限制,完全由使用者自己決定數(shù)據(jù)源從哪邊獲取和其格式,這樣更好的方便用戶使用。為此,該組件只提供一個(gè)load(success,end) 接口,怎樣load 由用戶自己去定義,而其中的 success/end,分別給出如何添加新數(shù)據(jù)(suceess 即同 addItems)/如何停止加載的接口。這樣真是太方便了~~
- 感興趣的可以參見(jiàn)源碼。
KISSY.Waterfall 示例和文檔
看到這邊,是不是很想試用一下~~ 嗯嗯,這里給出一些相關(guān)學(xué)習(xí)資料和示例,以供參考:
歡迎試用和提出意見(jiàn)~~
原文:http://ued.taobao.com/blog/2011/09/14/waterfall/
本文鏈接:http://m.95time.cn/tech/web/2011/8581.asp
出處:taobaoued
責(zé)任編輯:bluehearts
上一頁(yè) 瀑布流布局淺析 [2] 下一頁(yè)
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|