瀑布式布局适合于小数据块,每个数据块内容相近且没有侧重。通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。所以,我们形象的称此类布局为瀑布流布局。
在此之前,我们用CSS实现此类布局,通常会有以下两种方式:
1.传统多列浮动
虽然说这种布局方式很简单,也不需要明确的知道数据块的高度。但是如果浏览器窗口大小变化时,只能固定X列,很难调整数据块的排列。
2.CSS多列布局
需要使用到CSS3中一项属性:column。我们需要指定容器的列个数、列间距、列中间边框、列宽度来实现
#container {
-webkit-column-count: 5;
/*-webkit-column-gap: 10px;
-webkit-column-rule: 5px solid #333;
-webkit-column-width: 210px;*/
-moz-column-count: 5;
/*-moz-column-gap: 20px;
-moz-column-rule: 5px solid #333;
-moz-column-width: 210px;*/
column-count: 5;
/*column-gap: 10px;
column-rule: 5px solid #333;
column-width: 210px;*/
}但是我们考虑这样一个问题,此类方法的实现思路是从上到下排列到一定高度后,再把剩余元素依次添加到下一列,这个与我们之前所欲想的思路是完全相悖的。因此,它更适用于文字多栏排列。
所以,我们考虑用JavaScript来实现绝对定位下的瀑布流布局。
先说一下实现思路:
至于我们是怎样创建一个工程,怎样把图片资源添加进去这些一啪啦琐碎的事,我也就不再说了(Ps.哈哈哈~~~怎么办,就是懒。也是任性O(∩_∩)O)
在html文件中,我们先使用几个div模型充当容器,里面盛放我们想要盛放的内容,这里我们使用的图片瀑布流的形式来展示
<body>
<div id="contenter">
<div class="box">
<div class="box_img">
<img src="image/img1.jpg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img2.jpg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img3.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img5.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img6.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img7.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img8.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img9.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img10.jpeg">
</div>
</div>
<div class="box">
<div class="box_img">
<img src="image/img11.jpeg">
</div>
</div>
</div>
</body>在开始的时候,我们先默认加载10张图片,然后我们在css文件中,更改他们的样式
*{
margin: 0;
padding: 0;
}
/*父容器采用相对定位的方式*/
#contenter{
position: relative;
}
/*向左浮动*/
.box{
float: left;
padding: 5px;
}
.box_img{
padding: 5px;
border: 1px solid #cccccc;
box-shadow: 0 0 5px #cccccc;
border-radius:5px;
}
.box_img img{
width: 200px;
height: auto;
}最后,我们在js文件中,开始具体的实现瀑布流布局
/**
* Created by pc on 2015/8/28.
*/
window.onload = function(){
imgLocation("contenter","box");
var imgData = {"data":[{"src":"img12.jpeg"},{"src":"img13.jpg"},{"src":"img14.jpg"},{"src":"img15.jpeg"},{"src":"img16.jpeg"},{"src":"img17.jpeg"},{"src":"img18.jpeg"}]};
/*不断加载新的内容*/
window.onscroll = function(){
if(checkFlag()){
var parentid = document.getElementById("contenter");
for(var i =0;i<imgData.data.length;i++){
var childcontent = document.createElement("div");
childcontent.className="box";
parentid.appendChild(childcontent);
var boximg = document.createElement("div");
boximg.className = "box_img";
childcontent.appendChild(boximg);
var img = document.createElement("img");
img.src = "image/"+imgData.data[i].src;
boximg.appendChild(img);
}
imgLocation("contenter","box");
}
}
}
/*确定图片摆放位置*/
function imgLocation(parent,content){
/* 将父级元素下的content全部提取出来*/
var parentid = document.getElementById(parent);
var childelement = getChildElement(parentid,content);
/*每张图片的宽度一样,所以我们只需要提取第一张图片的宽度*/
var imgWidth = childelement[0].offsetWidth;
/*确定每排放的列数*/
var cols = Math.floor(document.documentElement.clientWidth/imgWidth);
parentid.style.cssText = "width:"+imgWidth*cols+"px;margin:0 auto";
/*确定一个存放图片高度的数组*/
var imgHeightArr = [];
for(var i=0;i<childelement.length;i++){
if(i<cols){
imgHeightArr[i]=childelement[i].offsetHeight;
}else{
/*找到每列当中最小的高度,将剩余的图片排列到下方*/
var minHeight = Math.min.apply(null,imgHeightArr);
var minIndex = getMinHeightLocation(imgHeightArr,minHeight);
/*使用绝对定位的方法,确定图片的摆放位置*/
childelement[i].style.position = "absolute";
childelement[i].style.top = minHeight +"px";
childelement[i].style.left = childelement[minIndex].offsetLeft + "px";
imgHeightArr[minIndex] = imgHeightArr[minIndex]+childelement[i].offsetHeight;
}
}
}
/*得到最小高度图片的位置*/
function getMinHeightLocation(imgHeightArr,minHeight){
for(var i in imgHeightArr){
if(imgHeightArr[i] == minHeight){
return i;
}
}
}
/*得到子级元素*/
function getChildElement(parent,content){
var colArr=[];
/*将所有元素提取出来,存放到一个数组当中*/
var allchildelement = parent.getElementsByTagName("*");
for(var i=0;i<allchildelement.length;i++){
if(allchildelement[i].className ==content){
colArr.push(allchildelement[i]);
}
}
return colArr;
}
/*判断滚动条是否在页面最下端*/
function checkFlag(){
var parentid = document.getElementById("contenter");
var childelement = getChildElement(parentid,"box");
/*以最下方的图片作为判断依据*/
var lastElementHeight = childelement[childelement.length-1].offsetTop;
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
var pageHeight = document.documentElement.clientHeight||document.body.clientHeight;
if(lastElementHeight<scrollTop+pageHeight){
return true;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/u011318165/article/details/48050751