详解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 加上最后自己的验证
Nov 04 Javascript
JQuery中$之选择器用法介绍
Apr 05 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
jQuery+AJAX实现网页无刷新上传
Feb 22 Javascript
JavaScript中的方法重载实例
Mar 16 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
May 02 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
Jul 19 Javascript
JavaScrip关于创建常量的知识点
Dec 07 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
May 15 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 Javascript
javascript前端实现多视频上传
Dec 13 Javascript
JS中循环遍历数组的四种方式总结
Jan 23 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数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
php-msf源码详解
2017/12/25 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python安装以及IDE的配置教程
2015/04/29 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
PageFactory设计模式基于python实现
2020/04/14 Python
python ssh 执行shell命令的示例
2020/09/29 Python
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
体育教育专业自荐信范文
2013/12/20 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
社区禁毒工作方案
2014/06/02 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
简单租房协议书
2014/10/21 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
无线电知识基础入门篇
2022/02/18 无线电