欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

瀑布流布局淺析

系統 1684 0

簡介

瀑布流布局淺析

如果你經常網上沖浪,這樣參差不齊的多欄布局,是不是很眼熟啊?

類似的布局,似乎一夜之間出現在國內外大大小小的網站上,比如 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 示例和文檔

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

歡迎試用和提出意見~~

原文: http://ued.taobao.org/blog/2011/09/waterfall/

?

瀑布流布局淺析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 龙珠z在线观看 | 久久99视频精品 | 香蕉福利久久福利久久香蕉 | 黄色一级视频欧美 | 色AV亚洲AV永久无码精品软件 | 精品视频网站 | 日韩av不卡在线 | hd性videos意大利复古 | 特黄做愛又硬又大A片视频 小视频在线看 | 成人欧美在线观看 | 鲁丝片一区二区三区免费 | 91久久国产 | 欧美激情免费观看一区 | 91精品久久久久久久久久久 | 亚洲99| 日本精品久久久一区二区三区 | 日韩视频在线观看 | 日本高清视频www夜色资源网 | 成人免费看黄网站yyy456 | 免费特黄一级欧美大片在线看 | 国产精品第1页 | 亚洲视频 中文字幕 | 成人在线观看国产 | 国产精品亚洲va在线观看 | 欧美日韩亚洲国产 | 久久久久无码国产精品一区 | 国产精品国产三级国产aⅴ入口 | 欧美精品观看 | 午夜啪视频 | 国产视频精品视频 | 免费午夜不卡毛片 | 日本黄免费 | 精品国产三级 | 色成人在线 | 91xxx在线观看| 国产精品毛片久久久久久久 | 乳欲人妻办公室奶水在线电影国产 | 亚洲精品在线视频 | 91拍拍在线观看 | 午夜亚洲国产成人不卡在线 | 亚洲精选久久 |