javascript瀑布流布局实现方法详解


Posted in Javascript onFebruary 17, 2016

本文实例讲述了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": "5.jpg"
    },
    {
      "src": "6.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;
    }
  }
}

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
Aug 02 Javascript
使用JavaScript 实现的人脸检测
Mar 24 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
JS实现简单抖动效果
Jun 01 Javascript
详解jQuery中的easyui
Sep 02 jQuery
angular4笔记系列之内置指令小结
Nov 09 Javascript
基于vue的验证码组件的示例代码
Jan 22 Javascript
vue路由拦截器和请求拦截器知识点总结
Nov 08 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
基于JQuery实现页面定时弹出广告
May 08 jQuery
给angular加上动画效遇到的问题总结
Feb 17 #Javascript
基于jQuery实现的无刷新表格分页实例
Feb 17 #Javascript
jQuery实现伪分页的方法分享
Feb 17 #Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 #Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 #Javascript
纯JavaScript代码实现文本比较工具
Feb 17 #Javascript
JavaScript实现身份证验证代码
Feb 17 #Javascript
You might like
apache rewrite_module模块使用教程
2008/01/10 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php目录操作实例代码
2014/02/21 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
PDO::errorInfo讲解
2019/01/28 PHP
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
js实现无缝滚动图
2017/02/22 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
jupyter安装小结
2016/03/13 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
什么是Python中的顺序表
2020/06/02 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
奥林匹克的口号
2014/06/13 职场文书
禁毒宣传标语
2014/06/19 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
先进典型发言材料
2014/12/30 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL