javascript瀑布流布局

html结构

<div id="waterfall">
    <div class="mod-box">
        <div class="mod-img">...</div>
    </div>
    <div class="mod-box">
        <div class="mod-img">...</div>
    </div>
    <div class="mod-box">
        <div class="mod-img">...</div>
    </div>
</div>

css样式表

*{margin:0;padding: 0}
#waterfall{position: relative;}
.mod-box{
    padding: 15px 0 0 15px;
    float: left;
}
.mod-img{
    padding: 9px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-shadow: 0 0 5px #ccc;
    position: relative;
}
.mod-img img{
    width: 310px;
    height: auto;
}

javascript代码

window.onload = function(){
     waterFall("waterfall","mod-box");
}
window.onscroll = scroll;

window.onresize = function() {
    if(re)clearTimeout(re);
    var re = setTimeout(function() {
    waterFall("waterfall","mod-box");
     }, 200);
}
var dataInit = {"data":["src":"0.jpg","src":"1.jpg"};

/**
 * 滚动添加数据函数
 */
function scroll(){
 var flag =  checkScroll("waterfall","mod-box");
 if(flag ){
     var oparent = document.getElementById("waterfall");
     var htmlStr = "";
     var len = dataInit.data.length;
     for(var i=0;i<len;i++){
         htmlStr+="";  //需要插入的结构
     }
      oparent.innerHTML+=htmlStr;
      waterFall("waterfall","mod-box");  //重新调用一次
 }
}

/**
 * 瀑布流函数
 * @param parentID  容器id
 * @param clsName  数据块className
 */
function waterFall(parentID,clsName){
    var oParent = document.getElementById(parentID); // 父级对象
    //将content下所有class为mod-box的元素取出来
    var oBoxs = getObjsByClassName(oParent,clsName);// 获取存储块框clsName的数组oBoxs
    var oBoxWidth = oBoxs[0].offsetWidth;    //obox的宽 ==>310+9*2+2+15 = 345(包含边框和内边距) 一个块框的宽
    var pageWidth = document.documentElement.clientWidth;  //页面可视宽度
    //var pageWidth = document.documentElement.offsetWidth;  //页面可视宽度
    var cols = Math.floor(pageWidth/oBoxWidth);  //计算整个页面显示的列数(页面宽/obox的宽)每行中能容纳的mod-box个数

    var hAarr = [];  //用于存储 每列中的所有块框相加的高度。
    var minH;      
    var minHIndex;       //最小高度对应的索引值
    for(var i = 0;i<oBoxs.length;i++){//遍历数组aPin的每个块框元素
        oBoxs[i].style.position="absolute";
        if(i<cols){  //把第一行排放好,并将每一列的高度记入数据hAarr
            hAarr.push(oBoxs[i].offsetHeight);

            oBoxs[i].style.top=0+"px";
            oBoxs[i].style.left=oBoxWidth*i+"px";
        }else{
            minH = Math.min.apply(null,hAarr); //数组hAarr中的最小值minH
            minHIndex = getMinhIndex(hAarr,minH);

            oBoxs[i].style.top=minH+"px";
           // oBoxs[i].style.left=oBoxWidth*minHIndex+"px";
            oBoxs[i].style.left= oBoxs[minHIndex].offsetLeft+"px";
            //数组 最小高元素的高 + 添加上的aPin[i]块框高
           hAarr[minHIndex]+=oBoxs[i].offsetHeight; //更新添加了块框后的列高
        }
    }
    var maxH = Math.max.apply(null,hAarr);
    oParent.style.cssText = "width:"+oBoxWidth*cols+"px;margin:0 auto;height:"+maxH+"px;"; //设置父级居中样式:定宽+自动水平外边距
}

/**
 * 检查是否符合加载数据(滚动到最后一个oBox)
 * @param parentID  容器id
 * @param clsName  数据块className
 * @returns {boolean}
 */
function checkScroll(parentID,clsName){
    var  parentObj = typeof parentID=="object" ?parentID:document.getElementById(parentID);
    var oBoxs = getObjsByClassName(parentObj,clsName);
    var lastBoxH = oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
    //创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
    var scrolltop = document.body.scrollTop ||document.documentElement.scrollTop;
    //标准模式与混杂模式
    var height = document.documentElement.clientHeight; //页面高度
    return (lastBoxH<scrolltop+height)?true:false;
}

/**
 * 根据class获得元素
 * @param id
 * @param clsName
 * @returns {Array}
 */
function getObjsByClassName(parentID,clsName){
    var  parentObj = typeof parentID=="object" ?parentID:document.getElementById(parentID);
    if(!parentObj){
        return;
    }
    var childObjs = parentObj.getElementsByTagName("*"); //获取 父级的所有子集
    var calssObjs = []; //创建一个数组 用于收集子元素
    for(var i in childObjs){//遍历子元素、判断类别、压入数组
        if(childObjs[i].className==clsName){ 
            calssObjs.push(childObjs[i]);
        }
    }
    return calssObjs;
}
/**
 * 获取最小值的索引minIndex
 * @param arr
 * @param minH
 * @returns {string}
 */
function getMinhIndex(arr,minH){
    for(var i in arr){
        if(arr[i]===minH){
            return i;
        }
    }
}
时间: 2024-08-09 19:48:45

javascript瀑布流布局的相关文章

javascript瀑布流布局效果

JavaScript——基本的瀑布流布局及ajax动态新增数据

本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: <body> <div id="

页面瀑布流布局的实现 javascript+css

先看所谓的瀑布流布局 在不使用瀑布流布局的情况下,当页面要显示不同高度的图片时,会如下面显示 下面的元素总是和最靠近它的元素对齐. 为了使元素能够在我们想要的位置上显示,我们使用绝对定位. 说一下大体思路(也是看了别人的):一切的不对齐都是从第一行的图片排列开始的,也许不是很准确,那么换一个说法:要想使图片排列整齐,那么就得从第一行排列开始.假设第一行x个元素排列中有一个最矮的(假设不假设都一样,假设是为了便于理解),较高的元素比这个最矮的要多出一块区域来,那么第二行就要有人去把这个多出来的区域

JavaScript实现瀑布流布局以及页面的自动加载

瀑布式布局适合于小数据块,每个数据块内容相近且没有侧重.通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.所以,我们形象的称此类布局为瀑布流布局. 在此之前,我们用CSS实现此类布局,通常会有以下两种方式: 1.传统多列浮动 各列固定宽度,并且左浮动: 一列中的数据块为一组,列中的每个数据块依次排列即可: 更多数据加载时,需要分别插入不同列上: 虽然说这种布局方式很简单,也不需要明确的知道数据块的高度.但是如果浏览器窗口大小变化时,只能固定X列,很难调整数据块的排列. 2

JavaScript实现瀑布流布局

关于瀑布流布局,(http://ued.taobao.org/blog/2011/09/waterfall/)这个博客中提供了几种实现思路,讲得很明白了,最近在学习JavaScript,写了一个使用JavaScript实现的瀑布流,代码托管在Github上:https://github.com/FuYung/Html5Learn/blob/master/HtmlJs/waterfallflow.html 效果如下图:

微信小程序 瀑布流布局

今天做小程序的时候,碰到一个比较常见的需求,就是要瀑布流布局,两列,交错分布,大概如下图 最终要实现的结果就是如左图所示. 不过在微信小程序里面,不能通过JavaScript来直接操作dome,所以一些常用的方法在这里都没有办法用了.这让笔者非常着急,因为项目比较赶,不能因为这种低级的布局问题拖慢了进度. 百度了半天,发现了css3的column这个属性,但是最后实现出来的方法就如右图所示,这不符合需求,需求是两列,从左到右进行排列的,大概就像小红书APP那种瀑布流布局 最后笔者终于找到一种非常

网页瀑布流布局jQuery实现代码

网页瀑布流布局jQuery实现代码 这篇文章主要为大家详细介绍了网页瀑布流布局jQuery实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 什么是瀑布流网页布局? 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 下面来看代码,用纯CSS3来做看效果怎样! HTML 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2

用Masonry和jQuery.lazyload插件实现网页瀑布流布局

瀑布流布局 我们常能在网上看到很多瀑布流布局的页面,尤其是很多图片网站,例如百度图片.这种最典型的瀑布流布局,每个元素的宽度是固定的,但图片长度各不相同,于是通过下图这种样子竖着排列了下来,达到了最大的页面空间利用率. 因为对前端开发不了解,一开始为了找到这种布局叫什么名字也是花了我好久时间o(╯□╰)o 瀑布流布局不局限于等宽布局,例如下面这种形式也可以,来自Masonry官网截图. Masonry官网 http://masonry.desandro.com/ 瀑布流布局作为一种响应式布局,网

jQuery模拟瀑布流布局

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>瀑布流</title> <style type="text/css"> *{margin: 0; padding: 0; } body{text-align: center;} .content{margin: 0 auto ; text-align: center