练习-瀑布流

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #wrap{
            width:900px;
            background-color:#ccc;
            margin:0 auto;
        }
        ul{
            margin:0;
            padding:0;
            list-style:none;
            overflow:hidden;
        }
        li{
            width:200px;
            /* height:200px; */
            background-color:rgba(255,255,0,0.3);
            float:left;
            margin-right:33px;
        }
        img{  /*不设置图片的大小的话,他就是原来的大小*/
            width:200px;
        }
        p{/*p的上下自带margin*/
            margin:0;
            line-height:30px;
            font-size:20px;
            color:#333;
        }
        li div{  /*一个div就是一个块的高,让一个块的下面有间距*/
            margin-bottom:10px;
            border-bottom:1px solid black;
        }
        li:nth-last-child(1){
            margin-right:0;
        }
    </style>
</head>
<body>
    <div id="wrap">
        <ul>
            <li>
                <!-- div和img和p是我们动态创建出来的,所以得注销掉,自己创建 -->
                <!-- <div>
                    <img src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2367059193,1415540431&fm=26&gp=0.jpg" alt="">
                    <p>客服都是客观看开个口打开上开发可是对方</p>
                </div> -->
            </li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    <script src="jquery-1.10.1.min.js"></script>
    <script>
        $.getJSON("data.txt",function(result){
            // console.log(result);
            // 遍历result,每遍历一个对象,就要生成一个div和p
            // for(var i=0;i<result.length;i++){
                // var oDiv=$("<div>").appendTo($("li").eq(whichLi()));   //把创建的div放在高度最矮的li的下面(如何判断哪个li的高度最矮,就得调用下面的函数了)
                // 分别创建img和p放到div里
                // $("<img>").attr("src",result[i].url).appendTo(oDiv);
                // $("<p>").html(result[i].content).appendTo(oDiv);
                // 出现问题1:所有的图片都放在了第一列的li中
                // 原因:图片的加载是需要时间的,但循环是一瞬间的,所以第一次循环结束后,我们往第一个li里放的图片还没加载(此时li的高度为0)出来就开始了第二次循环,所以第二个图片也放在第一列li的下面,永远是第0个li的高度最小,所以都放在同一列
                // 图片加载需要一定的时间,为了避免上面问题,得在第一个图片之后,外套一个onload事件,图片加载完之后( oImg.load)
                // var oImg=null;
                // if(i!=0){  
                //     oImg.load(function(){ //如果i!=0,就得等图片加载完成之后再判断li的高度
                //         var oDiv=$("<div>").appendTo($("li").eq(whichLi())); 
                //         $("<img>").attr("src",result[i].url).appendTo(oDiv);
                //         $("<p>").html(result[i].content).appendTo(oDiv);
                //     });
                // }else{
                //     var oDiv=$("<div>").appendTo($("li").eq(whichLi())); 
                //     $("<img>").attr("src",result[i].url).appendTo(oDiv);
                //     $("<p>").html(result[i].content).appendTo(oDiv);
                // }
            // }
            var oImg=null;
            var i=0;
            var lastPic=20;
            creatPic(lastPic);     //懒加载,一次显示20个li
            $(window).on("scroll",function(){   //滚动条事件
                if(bOn){
                    if($(document).scrollTop()+document.documentElement.clientHeight>$("li").eq(whichLi()).outerHeight()){
                        bOn=false;
                        lastPic+=15;     //找到最矮的li在它下面一次加15张图片,但不能超过数组的长度
                        if(lastPic>result.length){
                            lastPic=result.length;
                            // 说明把所有的图片都加载完了,所以就要关闭鼠标滚动事件
                            $(window).off("scroll");
                        }
                        creatPic(lastPic);
                    }
                }
            });
            function creatPic(n){
                var oDiv=$("<div>").appendTo($("li").eq(whichLi())); 
                oImg=$("<img>").attr("src",result[i].url).appendTo(oDiv);
                $("<p>").html(result[i].content).appendTo(oDiv);
                i++;
                oImg.load(function(){
                    if(i<n){
                        creatPic(n);   //递归
                    }else{   //图片没加载完就不开开关(一直递归,等图片加载完),加载完了就开开关
                        bOn=true;
                    }
                })
            }
        });
        // 判断哪个li是最矮的li,然后返回最矮li的下标
        function whichLi(){
            var arr=[];
            $("li").each(function(){
                arr.push($(this).outerHeight());
            });
            // var heightMin=arr.sort((a,b)=>a-b)[0];   //将数组从小到大排序,然后拿出第一个就是最小的给heightMin
            // return arr.indexOf(heightMin);
            // 上面代码是产生问题1的原因。因为arr.sort改变了原数组,然后取数组的第一个数据,取出来的永远是第一个,所以接下来的图片会放到第一个li的下面。用深拷贝解决:
            var arr2=Array.from(arr);
            var heightMin=arr2.sort((a,b)=>a-b)[0];
            return arr.indexOf(heightMin);
        }
        console.log(whichLi());
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值