$(document).width() height() 获取内容的宽高
$(window).width() height() 浏览器的宽高 //相当于可以document.documentElement.clientHeight
$(obj).width() height() 要获得的对象宽高
还有一种 $(obj).width() 普通宽 <innerwidth() 包括padding <outerwidth() padding+border < outerwidth(true) padding+border+margin
$(“#img1”).offset().left $(“#img1”).offset().top 到上左的距离
$(document).scrollTop() $(document).scrollLeft() 获取滚动的距离 使用window和document一样
e.pageX e.pageY 鼠标的坐标

项目原码地址:https://github.com/SummerXll123/js-jq-demo/blob/master/js-jq%E7%80%91%E5%B8%83%E6%B5%81.html

 

瀑布流特点:等宽不等高,瀑布流的效果,页面都是由很多数据块(这里将数据块分成多列)组成,每个数据块的高度不等,

思路

1、首先获取每列的高度,保存在一个数组中,然后求数组中最小项的值

2、(滚动条下拉)判断什么时候再次请求数据

当浏览器 视口高度+scrollTop 大于等于 最小列的底部位置时,再次请求数据

3.循环处理数据,每插入一个数据块,需要更新min_h,这样每次插入都是最先插入到高度最小列中

 

当浏览器 视口高度+scrollTop 大于等于 最小列的底部位置时,再次请求数据
列数=浏览器窗口宽度/图片宽度,图片定位是根据每一列数据库的高度进行定位
图片排序是按照计算的位置横向排列,位置是计算出来的,比较规范。
<div id="main">
    <div class="pin">
        <div class="box">
            <img src="images2/1.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/2.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/3.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/4.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/5.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/6.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/7.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/8.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/9.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/10.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/11.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/12.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/13.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/14.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/15.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/16.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/17.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/18.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/19.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/20.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="images2/21.jpg"/>
        </div>
    </div>
</div>

css

<style type="text/css">
    *{padding: 0;margin:0;}
    #main{
        position: relative;
    }
    .pin{
        padding: 15px 0 0 14px;
        float:left;
    }
    .box{
        padding: 10px;
        border:1px solid #ccc;
        box-shadow: 0 0 6px #ccc;
        border-radius: 5px;
    }
    .box img{
        width:162px;
        height:auto;
    }
</style>

js

<script>
    /*
    *
    注意:如果出现重叠问题,看看是不是padding的问题
    瀑布流实现:
     1求出列数,将每列的高度存放在一个数组内;
     2遍历数组,求出高度最小的图片;
     3将下一个图片放在min下
     4修改图片的当前高度;*/
    window.onload=function(){
        //封装一个函数
        waterFall('main','box')
        var dataInt={"data":[{"src":"5.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"}]}
        //滚动
        window.onscroll=function(){
            if(checkScrollSlide){
                var oParent=document.getElementById('main')
            //将数据块渲染到当前页面的尾部
                for(var i=0;i<dataInt.data.length;i++){
                    var oBox=document.createElement('div')
                    oBox.className='box'
                    oParent.appendChild(oBox)
                    var oPic=document.createElement('div')
                    oPic.className='pic'
                    oBox.appendChild(oPic)
                    var oImg=document.createElement('img')
                    oImg.src="images/"+dataInt.data[i].src;
                    oPic.appendChild(oImg)
                }
                waterFall('main','box')

            }
        }
    }
    function waterFall(parent,box){
        //将main下面所有class为box的元素取出来
        var oParent=document.getElementById(parent);
        var oBoxs=getByClass(oParent,box)
        console.log(oBoxs.length)
        //计算整个页面显示的列数(页面宽/box的宽)
        var oBoxW=oBoxs[0].offsetWidth;//获取第一个元素的宽度
        var cols=Math.floor(document.documentElement.clientWidth/oBoxW)
        //设置main的宽,oParent.style.cssText,#main一开始沒有设置宽度, 浏览器大小有变化, #main也就会跟着变化, 而列数就会变化, 所以要给#main设置固定
        oParent.style.cssText='width:'+oBoxW*cols+'px;margin:0 auto'
        //存放每一列的数组
        // 第二步,找第一行的高度值,高度值存放进数组,找出高度最小的图片,然后,每一行存放的是每一列的值
        var hArr=[];
        for(var i=0;i<oBoxs.length;i++){
            if(i<cols){//怎么获取第一行的高度?只要i小于列数(cols)就可以了
                hArr.push(oBoxs[i].offsetHeight)
            }else{
                var minH=Math.min.apply(null,hArr)//Math.min()求最小值,但是只能是一组数据,Math.min(45,4,1),不能对数组取最小值,用apply改变this指向
                //获取最小值的索引
                var index=getMinhIndex(hArr,minH)
                console.log(minH)
                oBoxs[i].style.position='absolute'
                oBoxs[i].style.top=minH+'px'
//                oBoxs[i].style.left=oBoxW*index+'px'
                oBoxs[i].style.left=oBoxs[index].offsetLeft+'px'
                //解决重叠问题,新的高度=原来  最小值得高度=新的图片高度+原来的高度
                hArr[index]+=oBoxs[i].offsetHeight

            }
        }
        console.log(hArr)
    }
    //根据class获取元素
    function getByClass(parent,clsName){
        var boxArr=new Array(),//用来存储获取到的所有class为box的元素
        oElements=parent.getElementsByTagName('*')
        for(var i=0;i<oElements.length;i++){
            if(oElements[i].className==clsName){
                boxArr.push(oElements[i]);
            }
        }
        return boxArr;
    }
    //获取最小值的索引
    function getMinhIndex(arr,val){
        for(var i in arr){
            if(arr[i]==val){
                return i
            }
        }
    }
    //检测是否具备记载数据块的条件
    function checkScrollSlide(){
        var oParent=document.getElementById('main')
        var oBoxs=getByClass(oParent,'box')
        //获取最后一个图片发高度
        var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetTop/2)
        //滚走的距离,兼容混杂模式和标准模式
        var scrollTop=document.body.scrollTop||document.documentElement.scrollTop
        var height=document.body.clientHeight||document.documentElement.clientHeight
//        console.log(scrollTop)
        console.log(height)
        return(lastBoxH<scrollTop+height?true:false)
    }

    function getClassName(className,parent){
        var oParent=parent?document.getElementById(parent):document
        var oChild=oParent.getElementsByTagName('*')//获取所有的标签元素
        var arr=[]
        for(i in oChild){
            //判断遍历的元素的类名是否和要查找的类名相等
            if(oChild[i].className==className){
                arr.push(oChild[i])
            }
        }
        return arr
    }
</script>

jq

<script>
    $(window).on('load',function(){
        waterfall()
        var dataInt={"data":[{"src":"5.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"}]}

        $(window).scroll(function(){
            //判断是否具备加载条件
            if(checkScrollSlide()){
                $.each(dataInt.data,function(index,value){
                    console.log()
                    $('#main').append(`<div class="pin"><div class="box"><img src='images2/${dataInt.data[index].src}'></div></div>`)
                })
                waterfall()
            }
        })

    })

    function waterfall(){
        var $boxs=$('#main .pin')
        var w=$boxs.eq(0).outerWidth()//小div的宽度
        var cols=Math.floor($(window).width()/w) //求列数
        var mainW=$('#main').width(cols*w); //大div的宽度
        //设置空数组,盛放第一行所有的列数
        var arr=[]
        $.each($boxs,function(index,value){
//            var h=$boxs.eq(index).outerHeight() //获取第几个的高度
//            arr[index]=h; //arr数组索引值对应的内容是h
            //获取第一行所有的列数的高度值,并取最小值和最小值的索引
            if(index<cols){  //后边的图片放到高度最小的图片下面
                arr[index]=$boxs.eq(index).outerHeight()  //对第一行的元素进行遍历,获取高度放在arr里面
            }else{
                //对第一行所有的列数进行遍历,取最小值
                var minH=Math.min.apply(null,arr) //记住是apply,apply只对数组操作
                var minHIndex= $.inArray(minH,arr)  //获取最小高度在数组中的索引
                //设置第一行以后的元素的位置,第八张图片定位到第一行最小高度的下面,top为最小高度值
                $(value).css({  //value加$()是为了转成jq对象,使用jq方法
                    'position':'absolute',
                    'top':minH+'px',
                    'left':minHIndex*w+'px'
                })
                //arr盛放每一行的列数,
                arr[minHIndex]+=$boxs.eq(index).outerHeight()  //第7张图片以后,每个图片的位置是:上一行的最小高度+当前的高度
            }
        })
    }
    //滚动时候是否加载
    function checkScrollSlide(){


        var lastH=$('#main :last') //最后一个图片
        var lastHeight=Math.floor(lastH.outerHeight()/2)+lastH.offset().top  //最后一个图片高度的一半加上相对于文档的偏移量
        var documentH=$(window).height()  //
        var scrollTop=$(window).scrollTop()  //获取滚动的距离
        //最后一张图片高度的一半和它自身的偏移量<浏览器滚动高度+浏览器的高度,才会继续加载
        return (lastHeight<scrollTop+documentH)?true:false
    }
</script>

 

posted on 2017-03-06 16:21  懒人猫  阅读(266)  评论(0)    收藏  举报