<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("开启瀑布流"); } }); });