码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript实现瀑布流布局以及页面的自动加载

时间:2015-08-28 19:45:24      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:布局   javascript   

    瀑布式布局适合于小数据块,每个数据块内容相近且没有侧重。通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。所以,我们形象的称此类布局为瀑布流布局。

 在此之前,我们用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文件中,开始具体的实现瀑布流布局

  • 我们先找到父级元素,就像我们去摘果子,肯定先要找到树然后再去爬树摘果子。找到父级元素之后,我们将父级元素下的content全部取出存放在一个变量当中。
  • 我们在之前设定样式的时候,将每张图片的宽度都设为一样的。那我们如何确定每排摆放的列数?应该是整个屏幕的[宽度/图片宽度]取整!
  • 我们遍历整个图片数组,得到每张图片的高度存入一个数组中得到其中的最小高度
  • 将剩余的图片定位到最小高度的图片的下方
  • 再进行监听滚动条,检查是否加载到最后,怎样判断?
  • 我们是得到最后一张图片的高度,当它的高度<滚动条距离上方的高度+页面高度时,我们就可以确定这一页已经到了最后,我们可以加载另一页了。
/**
 * 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;
    }

}

最后,是最后的实现效果(我家Dear love的尊和凛,不要拦我,狂舔屏~~~)
技术分享





版权声明:本文为博主原创文章,未经博主允许不得转载。

JavaScript实现瀑布流布局以及页面的自动加载

标签:布局   javascript   

原文地址:http://blog.csdn.net/u011318165/article/details/48050751

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!