最近做手機端項目使用到瀑布流布局,所以在這邊總結(jié)下實現(xiàn)瀑布流布局的幾種方法品姓。
1寝并、使用插件(Wookmark.js)
這個網(wǎng)上一搜一大把箫措,把這個方法的應用總結(jié)下。有很多博客可以參考下:博客1衬潦、博客2斤蔓。使用該插件容器(myContent)的定位必須是相對定位
//html
<div id="myContent">
<div class="item"></div>......
</div>
//第一種使用方式
$('.item').wookmark();
//第二種使用方式
$('.item').wookmark({
container: $('#myContent'),
offset: 0,
itemWidth: 196,
autoResize: true
});
//第三種使用方式
$(function(){
$(window).load(function(){
$("#myContent").wookmark();
});
})
跟ajax結(jié)合使用
var handler = null;
$(function(){
//綁定滾動事件
$(document).bind('scroll', onScroll);
$(window).load(function(){
handler=$("#myContent");
handler.wookmark();
});
})
//定義滾動函數(shù)
function onScroll(event) {
//是否到底部(這里是判斷離底部還有100px開始載入數(shù)據(jù)).
var closeToBottom = ($(window).scrollTop() + $(window).height() > $(document).height() - 100);
if(closeToBottom) {
$.ajax({url:"",async: false, dataType:"html", success:function(data){
$('#myContent').append(data);
//清除原來的定位
if (handler.wookmarkInstance) {
handler.wookmarkInstance.clear();
}
// //創(chuàng)建新的wookmark對象
handler = $('#myContent');
handler.wookmark();
}
});
}
};
2、使用css3
這種方式簡單易于理解别渔,但是布局比較難調(diào)整附迷,可能會將div拆分顯示。如果考慮到兼容性問題哎媚,就不推薦這種方式喇伯。
<style>
#myContent {
padding-left:100px;
-webkit-column-count: 5;
/* -webkit-column-gap: -20px;*/
/* -webkit-column-rule: 5px solid #333;*/
/* -webkit-column-width: 200px;*/
-moz-column-count: 5;
/* -moz-column-gap: -20px;*/
/* -moz-column-rule: 5px solid #333;*/
/* -moz-column-width: 200px;*/
column-count: 5;
/*column-gap: -20px;*/
/* column-rule: 5px solid #333;*/
/* column-width: 200px;*/
}
.item{
float:left;
}
</style>
//html
<div id="myContent">
<div class="item"></div>......
</div>
3、使用float
這種方法也是比較簡單的實現(xiàn)方法拨与,但是靈活性太差
<style>
#myContent{
margin:0 auto;
width:880px;
}
.item{
float:left;
}
</style>
<div id="myContent">
<div class="item">
<div class="item1"></div>.....
</div>
<div class="item">
<div class="item1"></div>.....
</div>
<div class="item">
<div class="item1"></div>.....
</div>
</div>
4稻据、使用絕對定位+jquery方式
原理跟使用Wookmark.js類似,容器使用相對定位买喧,子元素使用絕對定位捻悯,然后通過jquery計算每個元素的高度進行元素的排列。
var margin = 10;//這里設置間距
var li=$("li");//這里是區(qū)塊名稱
var li_W = li[0].offsetWidth+margin;//取區(qū)塊的實際寬度
function liuxiaofan(){//定義成函數(shù)便于調(diào)用
var h=[];//記錄區(qū)塊高度的數(shù)組
var n = document.documentElement.offsetWidth/li_W|0;//窗口的寬度除以區(qū)塊寬度就是一行能放幾個區(qū)塊
for(var i = 0;i < li.length;i++) {//有多少個li就循環(huán)多少次
li_H = li[i].offsetHeight;//獲取每個li的高度
if(i < n) {//n是一行最多的li淤毛,所以小于n就是第一行了
h[i]=li_H;//把每個li放到數(shù)組里面
li.eq(i).css("top",0);//第一行的Li的top值為0
li.eq(i).css("left",i * li_W);//第i個li的左坐標就是i*li的寬度
}
else{
min_H =Math.min.apply(null,h) ;//取得數(shù)組中的最小值今缚,區(qū)塊中高度值最小的那個
minKey = getarraykey(h, min_H);//最小的值對應的指針
h[minKey] += li_H+margin ;//加上新高度后更新高度值
li.eq(i).css("top",min_H+margin);//先得到高度最小的Li,然后把接下來的li放到它的下面
li.eq(i).css("left",minKey * li_W); //第i個li的左坐標就是i*li的寬度
}
$("h3").eq(i).text("編號:"+i+"低淡,高度:"+li_H);//把區(qū)塊的序號和它的高度值寫入對應的區(qū)塊H3標題里面
}
}
/* 使用for in運算返回數(shù)組中某一值的對應項數(shù)(比如算出最小的高度值是數(shù)組里面的第幾個) */
function getarraykey(s, v) {for(k in s) {if(s[k] == v) {return k;}}}
/*這里一定要用onload姓言,因為圖片不加載完就不知道高度值*/
window.onload = function() {liuxiaofan();};
/*瀏覽器窗口改變時也運行函數(shù)*/
window.onresize = function() {liuxiaofan();};