<div class="switch">
<button>关闭瀑布流</button>
</div>
<div class="waterfall-container">
<div class="box">
<div class="box-content">
<img src="http://cdn2.mhpbooks.com/2016/02/google.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p>
</div>
</div>
<div class="box">
<div class="box-content">
<img src="https://www.google.com/landing/2step/images/why-need-img-2.png">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p>
</div>
</div>
<div class="box">
<div class="box-content">
<img src="https://4.bp.blogspot.com/-Nyfdpymc_Lo/VkQw-nJ79mI/AAAAAAAARYg/6o9VeoTvu-I/s1600-r/logo_chrome.png"
>
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://lh3.googleusercontent.com/jN9tX6dCJ6_XL9E4K1KCO2Tuwe9_rYUbwv723eu6XGI0PWGLcPs0259VscOu249PPKKcU5AOXrq6JnleEaoK6K_JvZ2PY9lw3pMApzOpTQ=s660"
>
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://i1.sinaimg.cn/IT/2013/0320/U5385P2DT20130320080117.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://www.people.com.cn/mediafile/pic/20150906/81/15788599594280374761.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://www.kuqin.com/upimg/topic/google.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://www.xjp.cc/img.xjp.cc/2010/07/google-china.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcT6PwQ_Z2SO1lADWUw--QxVOFyHTr5JVRNuE89u5s99xoGerxK55A"
>
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://is4.mzstatic.com/image/thumb/Purple62/v4/c0/41/29/c04129a1-9b56-88b6-ae59-f424c6d9d343/source/512x512bb.jpg"
>
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://images.ifanr.cn/wp-content/uploads/2016/05/eric-schmidt.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTjr4L3m4efhuQK-6-DoNh4AmwIV4gIaVY0mb1SABPTTdi3SW60"
>
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://pad2.whstatic.com/images/thumb/f/f9/Delete-Google-Browsing-History-Step-4-Version-4.jpg/728px-Delete-Google-Browsing-History-Step-4-Version-4.jpg"
>
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="https://www.google.com.hk/intl/zh-CN/mobile/google-mobile-app/googlesuggest.jpg">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
<div class="box">
<div class="box-content">
<img src="http://img.ithome.com/newsuploadfiles/2016/10/20161005_014140_718.png">
<p>谷歌公司成立于1998年9月4日,被公认为全球最大的搜索引擎。</p></div>
</div>
</div>
* {
margin: 0;
padding: 0;
}
.switch {
text-align: center;
}
.switch button {
height: 30px;
width: 100px;
}
.waterfall-container {
}
.box {
border: 1px dashed lightgray;
}
.box-content {
border: 1px dashed brown;
}
.box-content img {
width: 100%;
border: 1px solid black;
box-sizing: border-box;
}
.box-content p {
font-size: 14px;
box-sizing: border-box;
}
(function ($) {
//-----------------全局属性
//储存选项
var settings;
//窗口改变的setouttim方法
var st;
//-----------------暴露接口
var methods = {
init: function (options) {
settings = $.extend({
container: this, // 父容器
autoResize: true, // 当浏览器大小改变时是否自动调整
offsetWidth: 5, // 每个元素之间的宽度距离(不加单位默认px)
offsetHeight: 10, // 每个元素之间的高度距离(不加单位默认px)
itemWidth: 260, // 每个元素的宽度,瀑布流高度是不限制的,所以只要宽度固定就可以了
colNumber: 4, // 规定一行有几个元素,只有autoResize: false才生效
colNumberMin: 2, // 规定一行最小有几个元素
colNumberMax: 5, // 规定一行最大有几个元素
resizeDelay: 0 // 自动调整延迟时间,一般情况下不需要设置,默认的就好了
}, options);
//参数验证
if (typeof settings.autoResize !== 'boolean') {
settings.autoResize = true;
}
if (isNaN(settings.offsetWidth) || settings.offsetWidth < 0) {
settings.offsetWidth = 5;
}
if (isNaN(settings.offsetHeight) || settings.offsetHeight < 0) {
settings.offsetHeight = 10;
}
if (isNaN(settings.itemWidth) || settings.itemWidth < 0) {
settings.itemWidth = 10;
}
if (isNaN(settings.colNumber) || settings.colNumber < 0) {
settings.colNumber = 4;
}
if (isNaN(settings.colNumberMin) || settings.colNumberMin < 0) {
settings.colNumberMin = 2;
}
if (isNaN(settings.colNumberMax) || settings.colNumberMax < 0) {
settings.colNumberMax = 5;
}
if (isNaN(settings.resizeDelay) || settings.resizeDelay < 0) {
settings.resizeDelay = 50;
}
//窗口改变触发重新布局
if (settings.autoResize) {
$(window).on("resize", windowChangeAutoLayout);
}
//初始化布局
methods.layout();
return this;
},
destroy: function () {
return this.each(function () {
//绝对布局改为浮动
$(this).find('.box').css({"position": "", "top": "", left: "", float: "left"});
//解绑window的resize事件
$(window).off("resize", windowChangeAutoLayout);
});
},
layout: function () {
//判断页面能承载多少列
var colsNum = window.innerWidth / settings.itemWidth;
colsNum = Math.floor(colsNum);
if (!settings.autoResize) {//如果列数被用户固定
colsNum = settings.colNumber;
} else if (colsNum > settings.colNumberMax) {//如果超过最大列数
colsNum = settings.colNumberMax;
} else if (colsNum < settings.colNumberMin) {//如果低于最小列数
colsNum = settings.colNumberMin;
}
console.log("now cols-number:" + colsNum);
//设置contianer的宽度以便居中
settings.container.width(colsNum * settings.itemWidth);
//设置box的宽度
settings.container.find(".box").width(settings.itemWidth);
//设置item剩下元素的默认CSS
setCss();
//setCss需要时间
setTimeout(function () {
var elesHeight = [];//每个元素的高度
var colsHeight = new Array(colsNum); //每列元素现有的高度
//初始化colsHeight数组
for (var i = 0; i < colsHeight.length; ++i) {
colsHeight[i] = 0;
}
//给elesHeight赋值
settings.container.find(".box").each(function (index, item) {
var eleHeight = $(this).height();
elesHeight.push(eleHeight);
});
//依次摆放每一个item
settings.container.find(".box").each(function (index, item) {
//获得该元素应该在第几列(也就是高度最小的那一列)
var colShould = getMinHeightCol(colsHeight);
//给item绝对定位到恰当位置
var tempTop = colsHeight[colShould];
var tempLeft = colShould * settings.itemWidth;
$(this).css({position: "absolute", top: tempTop + "px", left: tempLeft + "px"});
//同时更新colsHeight数据
colsHeight[colShould] += $(this).outerHeight(true);
});
}, 50);
return this;
}
};
//-------------外部分发接口
$.fn.waterfall = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.waterfall');
}
};
//-------------内部功能函数
//当窗口改变的注册事件
function windowChangeAutoLayout() {
if (st) {
clearTimeout(st);
}
st = setTimeout(function () {
methods.layout();
}, settings.resizeDelay);
}
//得到n列中高度最小的那一列
function getMinHeightCol(arr) {
var minHeight = Math.min.apply(null, arr);
//console.log("最小高度:" + minHeight);
for (var i in arr) {
if (arr[i] == minHeight) {
return i;
}
}
//默认第一列
return 0;
}
//设置item的css
function setCss() {
if (!isNaN(settings.offsetWidth)) {
settings.offsetWidth = settings.offsetWidth + "px";
}
if (!isNaN(settings.offsetHeight)) {
settings.offsetHeight = settings.offsetHeight + "px";
}
settings.container.css({"position": "relative", "margin": "0 auto"});
settings.container.find(".box-content").css({
"text-align": "center",
"margin": settings.offsetHeight + " " + settings.offsetWidth,
"box-sizing": "border-box"
});
}
})(jQuery);
$(function () {
//初始化开启瀑布流布局
$(".waterfall-container").waterfall({
autoResize: true, // 当浏览器大小改变时是否自动调整
offsetWidth: 5, // 每个元素之间的宽度距离(不加单位默认px)
offsetHeight: 20, // 每个元素之间的高度距离(不加单位默认px)
itemWidth: 200, // 每个元素的宽度,瀑布流高度是不限制的,所以只要宽度固定就可以了
colNumber: 4, // 规定一行有几个元素,只有autoResize: false才生效
colNumberMin: 2, // 规定一行最小有几个元素
colNumberMax: 5, // 规定一行最大有几个元素
resizeDelay: 0 // 自动调整延迟时间,一般情况下不需要设置,默认的就好了
});
//开关控制开关瀑布流布局
$(".switch button").click(function () {
if ($(this).html() == "开启瀑布流") {
$(".waterfall-container").waterfall('init');
$(this).html("关闭瀑布流");
} else if ($(this).html() == "关闭瀑布流") {
$(".waterfall-container").waterfall('destroy');
$(this).html("开启瀑布流");
}
});
});