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 相关文章推荐
JavaScript 异步调用框架 (Part 5 - 链式实现)
Aug 04 Javascript
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
Dec 28 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
JavaScript类的写法
Sep 17 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
Node.js  事件循环详解及实例
Aug 06 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
详解React项目中碰到的IE问题
Mar 14 Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 Javascript
js实现聊天对话框
Feb 08 Javascript
给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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
让你成为更出色的PHP开发者的10个技巧
2011/02/25 PHP
php生成随机颜色的方法
2014/11/13 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python决策树分类算法学习
2017/12/22 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
python多进程读图提取特征存npy
2019/05/21 Python
ipad上运行python的方法步骤
2019/10/12 Python
Python3运算符常见用法分析
2020/02/14 Python
简单了解Django项目应用创建过程
2020/07/06 Python
超级实用的8个Python列表技巧
2020/08/24 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
台湾旅游网站:灿星旅游
2018/10/11 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
小摄影师教学反思
2014/04/27 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python