为了账号安全,请及时绑定邮箱和手机立即绑定

算法可否优化。

感觉布局时的算法有问题,一拖动滚动所有图片就要重新排列一遍,貌似可以将最下面一排的整体高度全部记录下来,后面加载的时候就不用再全部去遍历布局了。老师讲得不错。

正在回答

1 回答

是的,我们可以修改一下 waterfall 这个函数,把参数传入,而这个参数为  新加入的“盒子”,当hArr中有“数”时,我们应该按照 先求 hArr 最小值的方式设置 “盒子”的位置,并修改hArr中的值。当hArr没有“数”,说明我们是第一次摆放盒子,那么我们向 waterfall传入的盒子就是第1批盒子,需要先正确 摆放第1行盒子,即记录 hArr 的值。

(把hArr设置为全局变量)

类似这样:

//将所有 newBoxs 新盒子“放好”
function waterfall(newBoxs) {
   var w = newBoxs[0].outerWidth(); //盒子的宽度
   //计算列数
   var cols = Math.floor(ww/w);


   $.each(newBoxs, function(index) {
       var box = newBoxs[index];
       var h = box.outerHeight();

       if(index < cols && hArr.length < cols) {  //hArr.length < cols 条件是为了区分后续的数据加载,表明已经有一行排在第1行了。
           hArr[index] = h;

           //移动第1行盒子到正确的位置
           moveBox(box, index * w, 0);
       } else {
           var minH = Math.min.apply(null, hArr);
           var minHIndex = $.inArray(minH, hArr);

           hArr[minHIndex] += box.outerHeight();
           moveBox(box, minHIndex * w, minH);
       }
   });
}


那么加载数据时就可以:

$(window).on("scroll", function() {

   var boxArr = [];
   if(checkScrollSlide()) {

       $.each(dataInt.data, function(key, value) {
           $box = $("<div>").addClass("box");
           $pic = $("<div>").addClass("pic").appendTo($box);
           $img = $("<img>").attr("src", "images/" + value.src).appendTo($pic);

           boxArr.push($box);

           $box.appendTo($("#main"));
       });

        //initBoxsPos(boxArr);
       waterfall(boxArr);
   }
});

主要考虑的是是否是第1批数据。第2批以上的数据都是依据“最小高度”去摆放。第1批数据的第1行特例。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

算法可否优化。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信