Js瀑布流-自适应宽度

来源:互联网 发布:ip端口号怎么打开 编辑:程序博客网 时间:2024/06/05 18:38
最近在研究JS瀑布流,过程中当然是遇到了几个问题的,但是都已成功解决啦!

关于瀑布流,我想说最重要的就是实现方法的核心算法问题!只要将核心算法搞清楚,搞正确,那就木有大问题的。

1. 首先是核心算法:

第一排显示图片个数num = 浏览器宽度clientWidth / 单张图片宽度imgWidth

下一排图片排放位置 = 从第一排最矮的那张图开始,从低到高挨个放(不懂的话请看下图哈...)

在最矮图片下边添加图片后,需要把这个最矮的高度值minHeight改变下,让指针去寻找第二矮的图,以此类推(图在下面...)

然后需要做的是实时监听浏览器宽度值,以便改变布局(图真的在下面...)

最后再模拟一个本地的循环无限加载的效果,类似百度图片(你看我没骗你吧,下面真的有图...)



2.直接上JS代码:


核心算法:

function imgLocation(parent,content){
//将parent下所有的content全部取出
var cparent = document.getElementById(parent);//获取父元素id
var ccontent = getChildElement(cparent,content);//获取所有子元素的数组集合
var imgWidth = ccontent[0].offsetWidth;//获取第一张图片宽度
var num = Math.floor(document.documentElement.clientWidth / imgWidth);//返回小于等于数字参数的最大整数,对数字进行下舍入    用浏览器宽度/图片宽度=每行图片个数
// console.log(imgWidth,num);
cparent.style.cssText = "width:"+imgWidth*num+"px;margin:0 auto";//设置html元素的style属性

var BoxHeightArr = [];//定义图片高度数组
for(var i = 0;i<ccontent.length;i++){
var minheight = 0;
var left = 0;
var minIndex;
if(i<num){
BoxHeightArr[i] = ccontent[i].offsetHeight;//每行图片的高度存到数组
left = i * imgWidth;
}else{
minheight = Math.min.apply(null,BoxHeightArr);//获取最小高度
minIndex = getminheightLocation(BoxHeightArr,minheight);//获得最小值指针
BoxHeightArr[minIndex] = BoxHeightArr[minIndex]+ccontent[i].offsetHeight;//修改这个用过的最小高度值
left = minIndex * imgWidth;
}
ccontent[i].style.position = "absolute";
ccontent[i].style.top = minheight+"px";
ccontent[i].style.left = left + "px";//将下一行图片定位到最小高度图下边
}
}

关于"i<num"这个运算,我一开始理解错了,写成了"i<=num",因此导致了图片排列重叠问题。。抓狂。。这里解释下,“ i ”是指针,值从”0“开始计算的,不是 ”1“哦。。生气 


监听浏览器滚动:

var re;
window.onresize = function() {
console.log(document.documentElement.clientWidth);
    clearTimeout(re);
    re = setTimeout(imgLocation('container','box'), 1000);
};//每隔一秒执行一次


function checkFlag(){
var cparent = document.getElementById('container');
var ccontent = getChildElement(cparent,'box');
var lastContentHeight = ccontent[ccontent.length-1].offsetTop;
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
var pageHeight = document.documentElement.clientHeight||document.body.clientHeigth;
//console.log(lastContentHeight+':'+scrollTop+':'+pageHeight);
if(lastContentHeight<scrollTop+pageHeight){
return true;
}
}


模拟无限加载效果:

var imgData={'data':[{'src':'2.gif'},{'src':'1.jpg'},{'src':'3.gif'},{'src':'4.jpg'},{'src':'5.gif'},{'src':'6.jpg'},]}
window.onscroll = function(){
if(checkFlag()){
var cparent = document.getElementById('container');
for(var i=0;i<imgData.data.length;i++){
var ccontent = document.createElement('div');
ccontent.className = 'box';
cparent.appendChild(ccontent);
var boximg = document.createElement('div');
boximg.className='box_img';
ccontent.appendChild(boximg);
var img = document.createElement('img');
img.src = 'img/'+imgData.data[i].src;
boximg.appendChild(img);
}
imgLocation('container','box');
}
}


好了,至此自适应改变宽度的瀑布流效果就完成了!安静

谢谢欣赏!欢迎大神指点!羡慕

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝2岁还说话晚怎么办 一岁宝宝不愿意学说话怎么办 2周岁宝宝不愿意学说话怎么办 三岁宝宝不爱说话应该怎么办 三岁宝宝不理人怎么办 两岁半宝宝不说话不连贯怎么办 宝宝三岁说话口齿不清怎么办 b超宝宝腿短怎么办 两岁宝宝学说话口吃怎么办 两岁宝宝说话少怎么办 三岁宝宝说话少怎么办 快4岁不会说话怎么办 宝宝2岁半不爱说话怎么办 两岁半宝宝注意力不集中怎么办 中国出生的外籍小孩怎么办签证 中国人入外籍后国内财产怎么办 中国人入外籍后国内资产怎么办 小孩去美国上小学怎么办 咳嗽震的胸口疼怎么办 高中孩子对手机着迷怎么办 小孩不肯读书沉迷游戏怎么办 小孩沉迷吃鸡游戏怎么办 高一数学成绩差怎么办 小孩子学数学用手指算怎么办 孩子d和b分不清怎么办 和家人走散后怎么办幼儿教案 小孩胃口不好不爱吃饭怎么办 幼儿园孩子学习记不住怎么办 幼儿园小孩数字记不住怎么办 大班教案走丢了怎么办 ppt加视频反了怎么办 拔罐之后背疼怎么办 拔完火罐后背疼怎么办 打印机红色的口堵了怎么办 打印机红色复印不出来怎么办 打印机加错颜色墨水怎么办 中班安全教案脚扭伤了怎么办 中班脚扭伤了怎么办教案 中班安全脚扭伤了怎么办 中班安全脚扭伤了怎么办反思 走丢了怎么办教案反思