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 相关文章推荐
js中将多个语句写成一个语句的两种方法小结
Dec 08 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
JavaScript模板入门介绍
Sep 26 Javascript
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
超赞的动手创建JavaScript框架的详细教程
Jun 30 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
JQuery学习总结【二】
Dec 01 Javascript
JS中微信小程序自定义底部弹出框
Dec 22 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
Oct 11 Javascript
vuex 的简单使用
Mar 22 Javascript
在vue中使用setInterval的方法示例
Apr 16 Javascript
JS一次前端面试经历记录
Mar 19 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
Python 错误和异常小结
2013/10/09 Python
Python全局变量用法实例分析
2016/07/19 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
python实现经纬度采样的示例代码
2020/12/10 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
公司领导推荐信
2013/11/12 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android