瀑布流-

本文详细介绍了如何使用原生JavaScript和jQuery实现瀑布流布局,包括计算列数、确定图片位置以及动态加载更多内容。同时,文章提供了完整的代码示例,帮助读者理解和实现瀑布流效果。

一、原生JS实现瀑布流

说明:瀑布流,图片(单模块)的宽度相等,高度不等。第二行第一个排在第一行高度最小的下面,如此类推。

css注意事项:父元素定位为relative因为子元素(单模块)需要是绝对定位(absolute)来确定位置

子元素的整个大小,不要使用margin,把所有宽度和高度都包括在单模块里面,且子元素要float left

js代码

window.onload=function () {
    waterFall('item','main');
};



function getByClass(clsName,parent) {
    var oparent;
    var items=new Array();
    if(parent){
        oparent=parent;
    }else {
        oparent=document;
    }
    var eles=oparent.getElementsByTagName('*');
    for(var i=0;i<eles.length;i++){
        if(eles[i].className===clsName){
            items.push(eles[i]);
        }
    }
    return items;
}
function waterFall(items,parent) {
    var oparent=document.getElementById(parent);
    var oitems=getByClass(items,oparent);
    console.log(oitems.length);
    //计算列数
    //首先是一个模块的宽度
    var itemW=oitems[0].offsetWidth;
    //获取浏览器宽度
    var doW=document.documentElement.clientWidth||document.body.clientWidth;
    //相除获得列数
    var cols=Math.floor(doW/itemW);
    //赋予父元素宽度;
    oparent.style.cssText="width:"+cols*itemW+"px;margin:0 auto";
    //获取每一列的高度
    var colsH=new Array();

    for(var i=0;i<oitems.length;i++){
        //获取第一行的高度
        if(i<cols){
            colsH.push(oitems[i].offsetHeight);

        }else{

            //把第二行第一张图片放在最短的第一列图片下面
            //获取第一行最短的图片
            var minH=Math.min.apply(null,colsH);//Math.min(num1,num2,num3)但是我们是直接是数组,所以用apply(this对象,xxxx)
          /*  console.log(minH);*/
            //获取这张图片的index
            var index=getImgIndex(minH,colsH);
            //根据上述获取的值,设置这一个模块的top和left
            oitems[i].style.position="absolute";
            oitems[i].style.left=itemW*index+'px';
            oitems[i].style.top=minH+'px';
            colsH[index]+=oitems[i].offsetHeight;
            console.log(colsH[index]);
        }

    }


}
function getImgIndex(Hei,HArr) {
    for(var i=0;i<HArr.length;i++){
        if(HArr[i]===Hei){
            return i;
        }
    }
}
var minH=Math.min.apply(null,colsH);//Math.min(num1,num2,num3)但是我们是直接是数组,所以用apply(this对象,xxxx)
          /*  console.log(minH);*/
            //获取这张图片的index
            var index=getImgIndex(minH,colsH);
            //根据上述获取的值,设置这一个模块的top和left
            oitems[i].style.position="absolute";
            oitems[i].style.left=itemW*index+'px';
            oitems[i].style.top=minH+'px';
            colsH[index]+=oitems[i].offsetHeight;
            console.log(colsH[index]);
        }

    }


}
function getImgIndex(Hei,HArr) {
    for(var i=0;i<HArr.length;i++){
        if(HArr[i]===Hei){
            return i;
        }
    }
}

css代码:

 

div,img{
    margin:0;
    padding:0;
}
#main{
    position: relative;
    margin:0 auto;

}
.item{
    float: left;
    padding:15px 0 0 15px;/*在左边和上边设置15pxpadding*/
}
.pic{
    padding:10px;
    border:1px solid #ccc;
    border-radius:5px;
    box-shadow: 0 0 5px #ccc;
}
.pic img{
    width:165px ;
    height:auto;
}

 

div,img{
            margin:0;
            padding:0;
        }
        #main{
            position: relative;
            margin:0 auto;

        }
        .item{
            float: left;
            padding:15px 0 0 15px;/*在左边和上边设置15pxpadding*/
        }
        .pic{
            padding:10px;
            border:1px solid #ccc;
            border-radius:5px;
            box-shadow: 0 0 5px #ccc;
        }
        .pic img{
            width:165px ;
            height:auto;
        }

 

html代码

 

<div id="main">
        <div class="item">
            <div class="pic">
                <img class="img" src="images/shijian13.png">
            </div>
        </div>
</div>

二、onscroll加载数据

1)蓝条:当顶部距离最后一个单模块一半距离即====》最后模块距顶(offsetTop)+offsetHeight/2

2)黑条:浏览器底部到达最后一个单模块的中心====》滚动条滚动的距离+浏览器高度

当蓝条<黑条,即到达触发条件~可以加载新的图片

//判断是否触发加载数据的条件
function checkScroll(items,parent) {
    var oparent=document.getElementById(parent);
    var oitems=getByClass(items,oparent);
    var lastItem=oitems[oitems.length-1];
    //蓝条:当顶部距离最后一个单模块一半距离即====》最后模块距顶(offsetTop)+offsetHeight/2
    var lastItemH=lastItem.offsetTop+Math.floor(lastItem.offsetHeight/2);
    //滚动的距离
    var scrollH=document.documentElement.scrollTop||document.body.scrollTop;
    //浏览器高度
    var clientWidth=document.documentElement.clientHeight || document.body.clientHeight;

    //黑条:浏览器底部到达最后一个单模块的中心====》滚动条滚动的距离+浏览器高度
    //当蓝条<黑条,即到达触发条件~可以加载新的图片
    if(lastItemH<=(scrollH+clientWidth)){
        return true;
    }else {
        return false;
    }
}
window.onload=function () {
    waterFall('item','main');
    window.onscroll=function (ev) {
        var dataInt={
          "data":[
              {
                "src":'0.jpg'
              },
              {
                  "src":'1.jpg'
              },
              {
                  "src":'2.jpg'
              },
              {
                  "src":'3.jpg'
              },
              {
                  "src":'4.jpg'
              },
              {
                  "src":'5.jpg'
              },
              {
                  "src":'6.jpg'
              },
              {
                  "src":'7.jpg'
              },
              {
                  "src":'8.jpg'
              }

          ]
        };
        if(checkScroll('item','main')){
            //将数据块渲染到当前页面
            var parent=document.getElementById('main');
            for(var i=0;i<dataInt.data.length;i++){
                var oItem=document.createElement('div');
                oItem.className='item';
                parent.appendChild(oItem);
                var oPic=document.createElement('div');
                oPic.className='pic';
                oItem.appendChild(oPic);
                var oImg=document.createElement('img');
                oImg.src="images/"+dataInt.data[i].src;
                oImg.className='img';
                oPic.appendChild(oImg);
                waterFall('item','main');重新调用,重新瀑布流
            }
        }
    }
};waterFall('item','main');重新调用,重新瀑布流
            }
        }
    }
};

 

 

 三、jq实现瀑布流

 

 

1.获取盒子宽度:

$item.eq(0).outerWidth(),通过eq获取第1个元素,通过outerwidth()获取盒子宽度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值