瀑布流形式的圖片佈局方式在手機等移動端設備上運用普遍,比較常見的是下面前兩種:html
1、等寬等高git
這種形式實現起來很是容易,這裏就再也不多說。github
2、等寬不等高算法
這種形式算是比較正統的瀑布流佈局形式,關於如何實現的請參考以前的一篇博文——jQuery瀑布流詳解。json
3、等高不等寬app
在以前的工做中接觸到了這種形式的瀑布流,它的主要特色是:同一行的兩張圖片高度相等,寬度不等,且寬高比與原圖近乎一致(沒有拉伸變形)。可是不一樣行的圖片高度不必定相等,下面就介紹下它的實現方式。模塊化
這裏先說一組中兩張圖片的比例算法。函數
首先,仍是須要兩張圖片的寬和高或者高寬比,好比一張是高寬比比較大(瘦)的圖,另外一張是高寬比比較小(胖)的圖。佈局
若是兩張圖片最終須要並列在同一行,而且擁有相同的高度,那麼圖片所佔該行的寬度,就與其高寬比成反比。即瘦的圖佔寬度小,胖的圖佔寬度多。
舉個例子:
左圖高寬比爲2:1 (2),右圖高寬比爲1:2 (0.5)
他們的高寬比之和爲2.5,那麼左圖的寬度比應該是較少的那部分 (0.5 / 2.5),右圖的寬度比應該是較多的那部分 (2 / 2.5)。
也就是左圖寬應爲容器的五分之一,右圖爲五分之四。
那麼高度就是圖片的寬度乘以其高寬比,爲了響應式這裏都不使用像素而使用百分比,爲了使高度與寬度保持比例,因此不使用 height,而用 padding-bottom 擠出來。原理見jQuery瀑布流詳解。
正確結果:
下面咱們經過一個實際的例子來試驗下這個算法:
左圖的尺寸爲 480*800,右圖的尺寸爲 500*311。
主要闡述下算法,代碼表達個大意:
var rate1 = 800 / 480,
rate2 = 311 / 500,
totalRate = rate1 + rate2, width1 = rate2 / totalRate * 100, // 27.2 width2 = rate1 / totalRate * 100, // 72.8 height = width1 * rate1;
return '<div style="width: '+width1+'%; padding-bottom: '+height+'%"></div>'+
'<div style="width: '+width2+'%; padding-bottom: '+height+'%"></div>';
即左圖佔72.2%,右圖佔72.8%。高度由於一致,只用計算其中一個就好。看下結果:
破費?還沒,咱們須要兩張圖之間有個間隙,假如這個間隙爲容器寬度的2%
width1 = rate2 / totalRate * 98;
width2 = rate1 / totalRate * 98;
這樣在計算兩張圖所佔寬度比的時候就會先減去間隙,間隙的生成能夠設置左圖的 margin-right,也能夠直接將右圖向右浮動。
因爲該插件是基於原生 JavaScript,因此咱們得實現幾個 jQuery 中的函數。
選擇器
由於該插件的選擇器惟一做用就是選中容器元素,因此只實現一個簡易版的便可。
function selector(ele) { if (!ele) { return; } return document.querySelector(ele); }
extend函數
該方法是用來合併對象的,在插件中它的主要做用是合併參數,將使用者傳入的參數覆蓋默認參數。
function extend() { var args = Array.prototype.slice.call(arguments), len = args.length, obj = null, i; for (i = 0; i < len; i ++) { if (typeof(args[i]) !== 'object') { break; } if (i !== 0) { for (var o in args[i]) { if (args[i].hasOwnProperty(o)) obj[o] = args[i][o]; } } else { obj = args[0]; } } return obj; }
var result = extend({color: red}, {color: blue}); console.log(result); // {color: blue}
調用方法
1. 引入 wf.css 和 wf.js 文件。
2. 經過 WaterFall 構造函數實例化,經過 create 方法生成瀑布流。
var waterFall = new WaterFall('.content', { type: 2, urlField: 'picUrl' }); waterFall.create(dataArr);
因爲 create 方法實際是經過 appendChild 來添加DOM元素的,因此分頁加載時只須要再次調用create方法並傳入新的數據便可。
3. 插件支持AMD等模塊化引用。
參數 (param)
type —— 瀑布流類型,默認1
1:等高等寬型,2:等寬型,3:等高型
urlField —— json中圖片地址的字段,默認爲 'url'。好比你接收到的數據中字段叫 'picUrl', 傳入該值會使對象的屬性名進行映射,下同
widthField —— json中寬度的字段,默認爲 'width'
HeightField —— json中高度的字段,默認爲 'height'
PS:TI6 西恩刀塔加油,小紅本我就不買了:)