WAP用户评论简单实现瀑布流加载

wap端经常会遇到产品或者评论的加载,但是分页的体验不是很好,所以选择通过js实现瀑布流加载方式。

第一步:需要动态加载的主要内容,这里需要动态加载的是li标签的内容

<ul class="back_ullist p20 back_ullist1" id="ulcontent">
 <li class="clearfix solidB_gray1 pb15 mb15" id="@item._id.ToString()">
                        <div class="clearfix">
                            <ul class="star_wk gl clearfix fr mt5">
  <li><img src="http://simg.xx.com.cn/custom/week/images/star1.png" width="30" height="30" alt="" /></li>
<li><img src="http://simg.xx.com.cn/custom/week/images/star.png" width="30" height="30" alt="" /></li>
  </ul>
                            <a href="javascript:" class="fl">
                                <img class="photo_style mr10 " src="@user.headimgurl" width="117" height="117" alt="" />
                            </a>
                            <a class="fl f14 name_wk lh30 oe" href="#">@user.nickname</a>
                        </div>
                        <div class="cb pt10 gray9 f12">
                            @item.content
                        </div>
                    </li>
</ul>

第二步:检测页面位置

 // 判断滚动条是否到底部
            function checkscrollside() {
                var arrBox = $('#ulcontent').children('li');
                //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载)
                var lastBoxH = arrBox.eq(arrBox.length - 1).offset().top;
                var scrollTop = $(window).scrollTop()//获取滚动条卷走的高度
                var documentH = $(window).height();;//显示页面文档的高
                return (lastBoxH < scrollTop + documentH) ? true : false;//到达指定高度后 返回true,触发waterfall()函数
            }

第三步:动态异步加载内容,每次追加5调数据

   // 数据插入
            function addDate() {
                var lastid = $("#ulcontent>li:last").attr("id");
                //console.log("获取ID" + lastid);
                $.ajax({//注意同步加载数据设置
                    url: "@Url.Content("~/WeClass/LoadEvaluate")", async: false, type: "POST", data: { 'classId': '@Model.Id', 'lastId': lastid, 'count': 1 }, dataType: "json", success: function (msg) {
                       
                    $.each(msg, function (index, val) {
                        var star1="";
                        var star2="";
                        for (var i = 1; i <= val.score; i++)
                    {
                            star1+='<li><img src="http://simg.instrument.com.cn/custom/week/images/star1.png" width="30" height="30" alt="" /></li>';
                }
                        for (var i = 1; i <= 5 - val.score; i++)
                {
                            star2 += '<li><img src="http://simg.instrument.com.cn/custom/week/images/star.png" width="30" height="30" alt="" /></li>';
                        }
                        //var ulcontent = $("#ulcontent").innerHeight();

                        $("#ulcontent").append('<li class="clearfix solidB_gray1 pb15 mb15" id="' + val._id + '" >' +
                        '<div class="clearfix">' +
                        '<ul class="star_wk gl clearfix fr mt5">' + star1 + star2+'</ul>'+
                        '<a href="javascript:" class="fl">'+
                        '<img class="photo_style mr10 " src="'+val.headimgurl+'" width="117" height="117" alt="" />'+
                        '</a>'+
                        '<a class="fl f14 name_wk lh30 oe" href="javascript:">'+val.nickname+'</a>'+
                        '</div>'+
                        '<div class="cb pt10 gray9 f12">' + val.content + ' </div>' +
                        '</li>');
                    });
                    console.log(msg);
                    if (msg.length > 0)
                    {
                        var conheight = $("#ulcontent").height();
                        $("#ulcontent").height(conheight + 100);
                    }
                }
                });                
            }

第四步:后台根据自己的业务返回对应格式的json数据

省略。。。

第五步:动态设置元素的高度宽度

//主函数
            function waterfall() {
                var arrBox = $('#ulcontent').children('li');// box对象
                var iBoxW = arrBox.eq(0).width();// 获取瀑布流块的宽度,注意width(),跟innerWidth()的区别
                var num =Math.floor($(window).width() / iBoxW);//计算窗口能容纳几列
                $('#ulcontent').css('width', iBoxW * num);//设置父级宽度
                var arrBoxH = [];//数组,用于存储每列中的所有块框相加的高度
                for (var i = 0; i < arrBox.length; i++) {//遍历数组瀑布流 块
                    var boxH =arrBox.eq(i).innerHeight();//获取当前块的高度
                    if (i < num) {
                        arrBox.eq(i).attr('style', '');//防止用户改变窗口大小,到时样式出错
                        arrBoxH[i] = boxH; //第一行中的num个块box 先添加进数组arrBoxH
                    } else {
                        var minH = Math.min.apply(null, arrBoxH);//获取数组arrBoxH中的最小值minH
                        var minHIndex = $.inArray(minH, arrBoxH);//使用jquery提供的工具
                        //arrBox.eq(i).css({ 'position': 'absolute', 'top': minH, 'left': minHIndex * iBoxW });//设置定位
                        arrBoxH[minHIndex] += arrBox.eq(i).innerHeight();//添加后,更新最小列高
                    }
                }
            }

第六步:动态检测是否加载流数据

 $(function () {
                waterfall();
                ////改变窗口大小时,重新排列
                $(window).resize(function(){
                    waterfall();
                });
                //如果数据不够,没出现滚动条,自动加载数据
                var time = setInterval(function () {
                    if (checkscrollside()) {
                        addDate();//插入数据
                        waterfall();//加载完数据从新排列
                    } else {
                        clearInterval(time);
                        $(window).scroll(function () {
                            if (checkscrollside()) {
                                addDate();
                                waterfall();
                            };
                        })
                    }
                }, 1000);

            });
原文地址:https://www.cnblogs.com/loyung/p/7421414.html