console.log(clos)输出列数为7,浏览器显示为6列,且前第七个和第八个图片(第二列的一和二)没有内边距

来源:2-4 JavaScript实现瀑布流布局中图片排序

qq_付注东流的岂止是时间_03709607

2018-03-23 14:58

// JavaScript Document

window.onload=function(){

waterfall("main","box");

}

function waterfall(parent,box){

var oParent=document.getElementById(parent);

getByClass(oParent,box);

var oBoxs=getByClass(oParent,box);

var aBoxW=oBoxs[0].offsetWidth;

var cols=Math.floor(document.documentElement.clientWidth/aBoxW);

oParent.style.cssText='width:'+aBoxW*cols+'px;margin:auto';

var hArr=[];

for(var i=0;i<oBoxs.length;i++){

if(i<cols-1){

hArr.push(oBoxs[i].offsetHeight);

}else{

var minH=Math.min.apply(null,hArr);

var index=getMinHIndex(hArr,minH);

oBoxs[i].style.position="absolute";

oBoxs[i].style.top=minH+'px';

//oBoxs[i].style.left=aBoxW*index+'px';

oBoxs[i].style.left=oBoxs[index].offsetLeft+'px';

hArr[index]+=oBoxs[i].offsetHeight;

}

}

console.log(cols);

console.log(hArr);

}

function getByClass(parent,clsName){

var boxArr=[];

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;

}

}

}


写回答 关注

2回答

  • 没毛病惨就完事了
    2018-07-30 13:43:49

    这个问题我也遇到了,我研究了一下午。是offsetWidth的问题。我console获取到值为201,但是实际盒子宽度为202,故第一行最后一张图,超边。

    解决方案:

    修改前:oParent.style.cssText='width:'+aBoxW*cols+'px;margin:auto';

    修改后:oParent.style.cssText='width:'+202*cols+'px;margin:auto';

    正确显示,不谢!


  • 阿阿影
    2018-03-30 16:26:55

    cols不用减一吧。在判断的时候:

    if(i<cols-1){

    hArr.push(oBoxs[i].offsetHeight);

    }else{


    qq_付注东...

    之前和老师的一样不减一就没有效果,可能是我电脑分辨率及图片大小的原因吧

    2018-04-10 06:40:34

    共 1 条回复 >

瀑布流布局

瀑布流布局是网站比较流行的一种布局方式,教你实现三大方式

97759 学习 · 736 问题

查看课程

相似问题