扒一扒瀑布流布局的几种实现
自Pinterest首次使用瀑布流式布局,现在这种页面布局已经得到了非常广泛的应用,比如蘑菇街、美丽说等各类购物网站,图丽网等美女图片展示网站等。
现在我们扒一扒瀑布流的几种实现方式(今天在公司加班到10点才回,眼睛好累,代码先不写注解了,有时间再补上,感兴趣的同学可以自己敲着看看效果):
一、css3
实现原理:使用css3的多列属性(column),优点是实现起来比较简单,缺点是兼容性不太好。
上代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>waterFall01-css多列</title> <style> html,body{ margin:0; padding: 0; } #container{ column-width:250px;/*列宽*/ -webkit-column-width:250px; -moz-column-width:250px; column-gap:5px;/*列间距*/ -webkit-column-gap:5px; -moz-column-gap:5px; } .item{ margin:5px 0;/*因为左右有gap*/ padding:10px; border: 1px solid #ccc; box-shadow: 0 0 6px #ccc; border-radius: 5px; } .item img{ width: 100%; } .item p{ text-align: center; font-family: Microsoft Yahei; } </style> </head> <body> <div id="container"> <div class="item"><img src="images/01/img (1).jpg" alt=""></div> <div class="item"><img src="images/01/img (2).jpg" alt=""></div> <div class="item"><img src="images/01/img (3).jpg" alt=""><p>描述信息</p></div> <div class="item"><img src="images/01/img (4).jpg" alt=""></div> <div class="item"><img src="images/01/img (5).jpg" alt=""></div> <div class="item"><img src="images/01/img (6).jpg" alt=""></div> <div class="item"><img src="images/01/img (7).jpg" alt=""></div> <div class="item"><img src="images/01/img (8).jpg" alt=""></div> <div class="item"><img src="images/01/img (9).jpg" alt=""></div> <div class="item"><img src="images/01/img (10).jpg" alt=""></div> <div class="item"><img src="images/01/img (11).jpg" alt=""></div> <div class="item"><img src="images/01/img (12).jpg" alt=""></div> <div class="item"><img src="images/01/img (13).jpg" alt=""></div> <div class="item"><img src="images/01/img (14).jpg" alt=""></div> <div class="item"><img src="images/01/img (15).jpg" alt=""></div> <div class="item"><img src="images/01/img (16).jpg" alt=""></div> <div class="item"><img src="images/01/img (17).jpg" alt=""></div> <div class="item"><img src="images/01/img (18).jpg" alt=""></div> <div class="item"><img src="images/01/img (19).jpg" alt=""></div> <div class="item"><img src="images/01/img (20).jpg" alt=""></div> <div class="item"><img src="images/01/img (21).jpg" alt=""></div> <div class="item"><img src="images/01/img (22).jpg" alt=""></div> <div class="item"><img src="images/01/img (23).jpg" alt=""><p>描述信息</p></div> <div class="item"><img src="images/01/img (21).jpg" alt=""></div> <div class="item"><img src="images/01/img (22).jpg" alt=""></div> <div class="item"><img src="images/01/img (23).jpg" alt=""><p>描述信息</p></div> <div class="item"><img src="images/01/img (1).jpg" alt=""></div> <div class="item"><img src="images/01/img (2).jpg" alt=""></div> <div class="item"><img src="images/01/img (3).jpg" alt=""></div> <div class="item"><img src="images/01/img (9).jpg" alt=""><p>描述信息</p></div> <div class="item"><img src="images/01/img (4).jpg" alt=""></div> <div class="item"><img src="images/01/img (5).jpg" alt=""></div> <div class="item"><img src="images/01/img (9).jpg" alt=""><p>描述信息</p></div> <div class="item"><img src="images/01/img (20).jpg" alt=""></div> <div class="item"><img src="images/01/img (11).jpg" alt=""></div> <div class="item"><img src="images/01/img (19).jpg" alt=""></div> <div class="item"><img src="images/01/img (13).jpg" alt=""></div> <div class="item"><img src="images/01/img (15).jpg" alt=""></div> <div class="item"><img src="images/01/img (14).jpg" alt=""></div> <div class="item"><img src="images/01/img (16).jpg" alt=""></div> <div class="item"><img src="images/01/img (21).jpg" alt=""></div> <div class="item"><img src="images/01/img (17).jpg" alt=""></div> <div class="item"><img src="images/01/img (18).jpg" alt=""></div> <div class="item"><img src="images/01/img (12).jpg" alt=""></div> <div class="item"><img src="images/01/img (9).jpg" alt=""><p>描述信息</p></div> <div class="item"><img src="images/01/img (10).jpg" alt=""></div> <div class="item"><img src="images/01/img (6).jpg" alt=""></div> <div class="item"><img src="images/01/img (7).jpg" alt=""></div> <div class="item"><img src="images/01/img (8).jpg" alt=""></div> </div> </body> </html>
二、JavaScript
实现原理:原生js操作dom,动态插入新图片
上代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>waterFall02</title> <style> *{ margin: 0; padding: 0; } #main{ position: relative;; } .item{ padding: 15px 0 0 15px; float: left; } .box{ padding: 10px; border: 1px solid #ccc; box-shadow: 0 0 6px #ccc; border-radius: 5px; } .box img{ width:162px; } </style> <script> window.onload = function(){ waterFall("#main",".item"); var fakeData = {'data':[{'src':'img (1).jpg'},{'src':'img (2).jpg'},{'src':'img (3).jpg'},{'src':'img (5).jpg'},{'src':'img (9).jpg'},{'src':'img (4).jpg'},{'src':'img (6).jpg'},{'src':'img (7).jpg'}]}; window.onscroll = function(){ if(checkScroll()){ var oParent = g("#main"), oItem, oBox, oImg; for(var i = 0;i < fakeData.data.length; i++){ oItem = c("div"); oItem.className = "item"; oParent.appendChild(oItem); oBox = c("div"); oBox.className = "box"; oItem.appendChild(oBox); oImg = c("img"); oImg.src = "images/01/" + fakeData.data[i].src; oBox.appendChild(oImg); } waterFall("#main",".item"); } } }; function g(selector){ return selector.substr(0,1) === "#" ? document.getElementById(selector.substr(1)) : document.getElementsByClassName(selector.substr(1)); } function c(ele){ return document.createElement(ele); } function waterFall(parent, item){ var oParent = g(parent); var items = g(item); var iWidth = items[0].offsetWidth; var cols = Math.floor(document.documentElement.clientWidth / iWidth); oParent.style.cssText = "width:" + iWidth * cols +"px;margin: 0 auto;"; var iHeightArr = [],iHeight, minH, minHIndex; for(var i = 0;i < items.length; i++){ iHeight = items[i].offsetHeight; if(i < cols){ iHeightArr[i] = iHeight; }else{ minH = Math.min.apply(null,iHeightArr); minHIndex = getMinHeightIndex(iHeightArr, minH); items[i].style.position = "absolute"; items[i].style.top = minH + "px"; items[i].style.left = items[minHIndex].offsetLeft + "px"; iHeightArr[minHIndex] += items[i].offsetHeight; } } } var main = g("#main"); /* *获取元素数组中最小高度元素的index */ function getMinHeightIndex(arr, minHeight){ for(var i =0;i < arr.length;i++){ if(arr[i] === minHeight) return i; } return -1; } function checkScroll(){ var items = g(".item"); var doc = document.documentElement, body = document.body; var lastItemHeight = items[items.length - 1].offsetTop + Math.floor(items[items.length - 1].offsetHeight /2);//最后一个item距离网页顶部+自身高度的一半,这样未滚到底就开始加载 var scrollTop = doc.scrollTop || body.scrollTop; var documentHeight = doc.clientHeight; return lastItemHeight < scrollTop + documentHeight; } </script> </head> <body> <div id="main"> <div class="item"> <div class="box"><img src="images/01/img (1).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (2).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (3).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (4).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (5).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (6).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (7).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (8).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (9).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (10).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (11).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (12).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (13).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (14).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (15).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (16).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (17).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (18).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (19).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (20).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (21).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (22).jpg" alt=""></div> </div> <div class="item"> <div class="box"><img src="images/01/img (23).jpg" alt=""></div> </div> </div> </body> </html>
三、jQuery
实现原理:同上一种,用jQuery,只为简化dom操作代码
上代码:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>waterFall03</title> <style> *{ padding: 0; margin: 0; } .box{ position: relative; float: left; } .content{ padding: 10px; border: 1px solid #ccc; box-shadow: 0 0 5px #ccc; border-radius: 5px; } .content img{ width: 180px; height: auto; } </style> <script src="jquery-2.1.1.min.js"></script> <script> $(function(){ $(window).on("load",function(){ imgLocation(); var dataImg = {"data":[{"src":"img (1).jpg"},{"src":"img (2).jpg"},{"src":"img (3).jpg"},{"src":"img (4).jpg"},{"src":"img (5).jpg"},{"src":"img (6).jpg"},{"src":"img (7).jpg"}]}; window.onscroll = function(){ if(scrollside()){ $.each(dataImg.data,function(index,value){ var box = $("<div>").addClass("box").appendTo($("#container")); var content = $("<div>").addClass("content").appendTo(box); $("<img>").attr("src","images/01/"+$(value).attr("src")).appendTo(content); }); imgLocation(); } }; }); }); function scrollside(){ var box = $(".box"); var lastboxHeight = box.last().get(0).offsetTop+Math.floor(box.last().height()/2); var documentHeight = $(document).width(); var scrollHeight = $(window).scrollTop(); return (lastboxHeight<scrollHeight+documentHeight)?true:false; } function imgLocation(){ var box = $(".box"); var boxWidth = box.eq(0).width(); var num = Math.floor($(window).width()/boxWidth); var boxArr=[]; box.each(function(index,value){ var boxHeight = box.eq(index).height(); if(index<num){ boxArr[index]= boxHeight; }else{ var minboxHeight = Math.min.apply(null,boxArr); var minboxIndex = $.inArray(minboxHeight,boxArr); $(value).css({ "position":"absolute", "top":minboxHeight, "left":box.eq(minboxIndex).position().left }); boxArr[minboxIndex]+=box.eq(index).height(); } }); } </script> </head> <body> <div id="container"> <div class="box"> <div class="content"> <img src="images/01/img (1).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (2).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (3).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (4).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (5).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (6).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (7).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (8).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (9).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (10).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (11).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (12).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (13).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (14).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (15).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (16).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (17).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (18).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (19).jpg"> </div> </div> <div class="box"> <div class="content"> <img src="images/01/img (20).jpg"> </div> </div> </div> </body> </html>
附:代码包下载链接