網站設計瀑布流佈局淺析 幾種實現方式

來源:互聯網
上載者:User

仲介交易 HTTP://www.aliyun.com/zixun/aggregation/6858.html">SEO診斷 淘寶客 雲主機 技術大廳

如果你經常隨意瀏覽,這樣參差不齊的多欄佈局,是不是很眼熟啊?

類似的佈局,似乎一夜之間出現在國內外大大小小的網站上,比如 Pinterest (貌似是最早使用這種佈局的網站了),Mark之,蘑菇街,點點網,以及淘寶最新上線的「哇哦」 等等,倒是很流行哈~ 在淘寶即將上線的眾多產品中, 你還會大量看到這樣的形式呢。

這種佈局適合於小資料塊,每個資料塊內容相近且沒有側重。 通常,隨著頁面捲軸向下滾動,這種佈局還會不斷載入資料塊並附加至當前尾部。 所以,我們給這樣的佈局起了一個形象的名字 — 瀑布流式佈局。

  

幾種實現方式

隨著越來越多設計師愛用這種佈局,我們作為前端,要盡可能滿足視覺/交互設計師的需求。 所以,我們整理了下這種佈局的幾種實現方式,有三種:

1) 傳統多列浮動。 即 蘑菇街和哇哦 採用的方式,如下圖所示:

  

各列固定寬度,並且左浮動;

一列中的資料塊為一組,列中的每個資料塊依次排列即可;

更多資料載入時,需要分別插入到不同的列上;

線上例子。

優點:

佈局簡單,應該說沒啥特別的難點;

不用明確知道資料塊高度,當資料塊中有圖片時,就不需要指定圖片高度。

缺點:

列數固定,擴展不易,當瀏覽器視窗大小變化時,只能固定的x列,如果要添加一列,很難調整資料塊的排列;

滾動載入更多資料時,還要指定插入到第幾列中,還是不方便。

2) CSS3 定義。 W3C 中有講述關於多列佈局的文檔,排列出來的樣子:

  

由 chrome/ff 瀏覽器直接渲染出來,可以指定容器的列個數,列間距,列中間邊框,列寬度來實現;

#container {
-webkit-column-count: 5;
/*-webkit-column-gap: 10px;
-webkit-column-rule: 5px solid #333;
-webkit-column-width: 210px;*/

-moz-column-count: 5;
/*-moz-column-gap: 20px;
-moz-column-rule: 5px solid #333;
-moz-column-width: 210px;*/

column-count: 5;
/*column-gap: 10px;
column-rule: 5px solid #333;
column-width: 210px;*/
}

column-count 為列數; column-gap 為每列間隔距離; column-rule 為間隔邊線大小; column-width 為每列寬度; 當只設置 column-width 時,瀏覽器視窗小於一列寬度時,列中內容自動隱藏; 當只設置 column-count 時,平均計算每列寬度,列內內容超出則隱藏; 都設了 column-count 和column-width,瀏覽器會根據 count 計算寬度和 width 比較,取大的那個值作為每列寬度,然後當視窗縮小時,width 的值為每列最小寬度。 這邊其實很簡單,簡易自己嘗試下,詳細可參考HTTPs://developer.mozilla.org/en/CSS3_Columns 中的說明。

線上列子。

優點:

直接 CSS 定義,最方便了;

擴展方便,直接往容器裡添加內容即可。

缺點:

只有高級瀏覽器中才能使用;

還有一個缺點,他的資料塊排列是從上到下排列到一定高度後,再把剩餘元素依次添加到下一列,這個本質上就不一樣了;

鑒於這兩個主要缺點,註定了該方法只能局限于高端瀏覽器,而且,更適合於文字多欄排列。

3) 絕對位置。 即 Pinterest ,Mark之,KISSY 採用的方式:

  

可謂是最優的一種方案,方便添加資料內容,視窗變化,列數/資料塊都會自動調整;

線上列子。

缺點:

需要實現知道資料塊高度,如果其中包含圖片,需要知道圖片高度;

JS 動態計算資料塊位置,當視窗縮放頻繁,可能會狂耗性能。

KISSY. Waterfall 實現思路

KISSY 的 Waterfall 元件主要包含兩個部分,一個是對現有資料塊進行排列計算各自所在的位置; 二是下拉滾動時,觸發載入資料操作,並把資料添加到目標容器中。

1) 資料塊排列,演算法步驟簡述下:

初始化時,對容器中已有資料塊元素進行第一次計算,需要使用者給定: a,容器元素 — 以此獲取容器總寬度; b,列寬度; c,最小列數; 最終列數取的是容器寬度/列寬度和最小列數的最大值,這樣保證了,當視窗很小時,仍然出現最小列數的資料;

獲得列數後,需要保存每個列的當前高度,這樣在添加每個資料塊時,才知道起始高度是多少;

依次取容器中的所有資料塊,先尋找當前高度最小的某列,之後根據列序號,確定資料塊的left,top值,left 為所在列的序號乘以列寬,top 為所在列的當前高度,最後更新所在列的當前高度加上這個資料塊元素的高度,至此, 插入一個元素結束;

當所有元素插入完畢後,調整容器的高度為各列最大的高度值,結束依次調整;

性能效率上的注意點: a,如果當前正在調整中,又觸發了 resize 事件,需要將上次調整暫停後執行這次調整(見 timedChunk 函數); b,resize 觸發會很頻繁,可以將回呼函數緩存一段時候後執行,即當這段時間內多次觸發了resize事件,但回呼函數只會執行一次(見 S.buffer 函數)

感興趣的可以參見源碼。

2) 非同步載入資料,前面講的是如何對容器中已有元素進行排列,但很多情況下,還需要不斷載入新資料塊,為此專門設計了一個獨立的模組 KISSY. Waterfall.Loader,其實這個功能就更簡單了,僅包含兩個步驟:

綁定滾動事件,並確定預載入線高度值,即滾動到哪個高度後,需要去載入資料,其實這個就是列的最小高度值,這樣當前滾動值和最小高度值比較一下即可判斷出來,是否要觸發載入資料;

載入資料,為了不對資料來源做太多限制,完全由消費者自己決定資料來源從哪邊獲取和其格式,這樣更好的方便使用者使用。 為此,該元件只提供一個load(success,end) 介面,怎樣load 由使用者自己去定義,而其中的 success/end,分別給出如何添加新資料(suceess 即同 addItems)/如何停止載入的介面。 這樣真是太方便了~~

感興趣的可以參見源碼。

KISSY。 Waterfall 示例和文檔

看到這邊,是不是很想試用一下~~ 嗯嗯,這裡給出一些相關學習資料和示例,以供參考:

Waterfall API 文檔,相關構造器,配置項,方法都在這裡; HTTP://docs.kissyui.com/docs/html/api/component/waterfall/

示例,包含靜態和動態兩種。 HTTP://docs.kissyui.com/docs/html/demo/component/waterfall/

歡迎試用和提出意見~~

  來源:HTTP://ued.taobao.com/blog/2011/09/14/waterfall/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.