详解javascript实现瀑布流列式布局


Posted in Javascript onJanuary 29, 2016

本文介绍了javascript瀑布流列式布局的相关内容,分享给大家供大家参考,具体内容如下

详解javascript实现瀑布流列式布局

JS原理

上面说了,列式布局简直算是完虐绝对式布局. 绝对式布局,简直就像10元/天 的搬砖工。而列式布局就是站在那看他搬砖的监工。 同样都是搬砖的,一个卖苦力,一个秀智商。简直了!!!
听了逼逼,我们来直面一下惨淡的人生。
列式布局的原理其实和绝对式布局没有太大的却别。
同样也有3个部分, 一是页面加载自适应,二是滑动加载,三是响应式布局。
分别讲解:

1、加载自适应

我们先看一下代码吧:

var $ = function() { //一个hacks
  return document.querySelectorAll.apply(document, arguments);
}
var waterFall = (function(){
  //初始化布局
  var arrHeight = []; //列的高度
  var columns = function() { //计算页面最多可以放多少列
      var bodyW = $('#container')[0].clientWidth,
        pinW = $(".column")[0].offsetWidth;
      return Math.floor(bodyW / pinW);
    }
    //设置瀑布流居中
  var getHtml = function() {
      var cols = $('.column'), //获得已有的列数
        arrHtml = [];
      for (var i = 0, col; col = cols[i++];) {
        var htmls = col.innerHTML.match(/<img(?:.|\n|\r|\s)*?p>/gi); //获取一个columns的
        arrHtml = arrHtml.concat(htmls);
      }
      return arrHtml;
    }
    //获得数组中最低的高度
  var getMinIndex = function() { //获得最小高度的index
    var minHeight = Math.min.apply(null, arrHeight); //获得最小高度
    for (var i in arrHeight) {
      if (arrHeight[i] === minHeight) {
        return i;
      }
    }
  }
  var createCol = function() {
      var cols = columns(), //获得列数
        contain = $("#container")[0];
      contain.innerHTML = ''; //清空数据
      for (var i = 0; i < cols; i++) {
        var span = document.createElement("span");
        span.className = "column";
        contain.appendChild(span);
      }
    }
    //初始化列的高度
  var initHeight = function() {
      var cols = columns(),
        arr = [];
      for (var i = 0; i < cols; i++) {
        arr.push(0);
      }
      arrHeight = arr;
    }
   //创建一个ele并且添加到最小位置
  var createArticle = function(html){
    var cols = $('.column'),
      index = getMinIndex(),
      ele = document.createElement('article');
    ele.className = "panel";;
    ele.innerHTML = html;
    cols[index].appendChild(ele);
    arrHeight[index] += ele.clientHeight;
  }
  //遍历获得的html然后添加到页面中
  var reloadImg = function(htmls) {
    for (var i = 0, html, index; html = htmls[i++];) {
      createArticle(html);
    }

  }
  var onload = function() {
      var contain = $("#container")[0], //获得容器
        arrHtml = getHtml(); //获得现有的所有瀑布流块
      //创建列,然后进行加载
      createCol();
      //初始化arrHeight
      initHeight();
      //进行页面的重绘
      reloadImg(arrHtml);
      return this;
    }
})();

看见一个程序,先找他的入口函数,显然,一开始应该是onload,那么,观察onload函数. 可以发现,里面一共有4个函数.
由于用户的宽度不确定,所以我们的列数也不是一定的。这时候,就需要获取实际尺寸然后进行一个计算才行。然后需要对原有的数据,进行重排。
所以,getHtml就是来获取一开始的原有数据(innerHTML);
然后就可以更具宽度来添加列了。
createCol函数就是更具宽度来添加列的。
这时候,我们需要一个数组(arrHeight)来保存每列的高(默认都为0).
然后就可以进行页面重排=>reloadImg(arrHtml), arrHtml就是原始数据。
好,我们这里初级搬砖完成。
接下来,是要开始加固了。

2、滑动加载

这个应该算是我直接copy过来的,所以说,函数写的好,重用性也是棒棒哒。

show u code

var isLoad=function() { //是否可以进行加载
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
      wholeHeight = document.documentElement.clientHeight || document.body.clientHeight,
      point = scrollTop + wholeHeight; //页面底部距离header的距离
    var lastHei = Math.min.apply(null,arrHeight);
    return (lastHei < point) ? true : false;
  }

  var dealScroll = (function(){
    window.onscroll = ()=>{dealScroll();}
    var container = $('#container')[0];
    return function(){
      if(isLoad()){
        for(var i = 0,html,data;data = dataInt[i++]; ){
          html = tpl.temp(data.src); //获得数据然后添加模板
          createArticle(html);
        }
      }
      return this;
    }
  })();

同样的isload,同样的dealScroll的逻辑。 这里需要说明的就是,createArticle就是给最低高度列添加砖块的函数。
然后,就没有然后啦.

3、响应式布局

这个我也是直接copy过来的。

var resize = (function(){
    window.onresize = ()=>{resize();};
    var flag;
    return function(){
      clearTimeout(flag);
      flag = setTimeout(()=>{onload();},500);
      return this;
    }

需要说明的是,onload,dealScroll,resize这3个函数,后面我都加上"return this". 目的是可以进行链式调用,以备后面重用性的需要。

以上就是本文的全部内容,希望对大家学习javascript瀑布流有所帮助。

Javascript 相关文章推荐
将jQuery应用于login页面的问题及解决
Oct 17 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
Jul 31 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
Js判断CSS文件加载完毕的具体实现
Jan 17 Javascript
详解Javascript 装载和执行
Nov 17 Javascript
jquery Banner轮播选项卡
Dec 26 Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
Sep 12 Javascript
微信 jssdk 签名错误invalid signature的解决方法
Jan 14 Javascript
基于JS开发微信网页录音功能的实例代码
Apr 30 Javascript
node.js文件操作系统实例详解
Nov 05 Javascript
element-ui如何防止重复提交的方法步骤
Dec 09 Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 #Javascript
理解Javascript文件动态加载
Jan 29 #Javascript
JavaScript操作select元素和option的实例代码
Jan 29 #Javascript
JavaScript学习总结之JS、AJAX应用
Jan 29 #Javascript
Angularjs中UI Router全攻略
Jan 29 #Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 #Javascript
AngularJS 使用 UI Router 实现表单向导
Jan 29 #Javascript
You might like
PHP安全上传图片的方法
2015/03/21 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
python3实现名片管理系统
2020/11/29 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
python实现连连看游戏
2020/02/14 Python
python爬虫实现获取下一页代码
2020/03/13 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
家长对孩子评语
2014/01/30 职场文书
趣味活动策划方案
2014/02/08 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
考试保密承诺书
2014/08/30 职场文书
授权委托书样本
2014/09/25 职场文书
民事起诉书范本
2015/05/19 职场文书
2015教师节通讯稿
2015/07/20 职场文书
计算机教师工作总结
2015/08/13 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python