详解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 相关文章推荐
Javascript 作用域使用说明
Aug 13 Javascript
javascript 闭包
Sep 15 Javascript
js对象关系图 方便dom操作
Mar 18 Javascript
JQuery获取各种宽度、高度(format函数)实例
Mar 04 Javascript
Jquery实现动态切换图片的方法
May 18 Javascript
JavaScript检测并限制复选框选中个数的方法
Aug 12 Javascript
JavaScript入门教程之引用类型
May 04 Javascript
jQuery插件pagination实现无刷新分页
May 21 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
使用Dropzone.js上传的示例代码
Oct 10 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
JS如何寻找数组中心索引过程解析
Jun 01 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
PHP初学者头疼问题总结
2006/10/09 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
基于jquery的tab切换 js原理
2010/04/01 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
python实现读Excel写入.txt的方法
2018/04/29 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
利用python绘制正态分布曲线
2021/01/04 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
捷科时代的软件测试笔试题
2015/11/09 面试题
电子商务专业个人的自我评价分享
2013/10/29 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
先进事迹材料范文
2014/12/29 职场文书
入党申请书怎么写?
2019/06/21 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
Python实现简单得递归下降Parser
2022/05/02 Python