详解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 相关文章推荐
js加解密 脚本解密
Feb 22 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
JavaScript回调(callback)函数概念自我理解及示例
Jul 04 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
Oct 27 Javascript
利用jquery实现下拉框的禁用与启用
Dec 07 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
Aug 25 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
Sep 26 Javascript
浅谈TypeScript的类型保护机制
Feb 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
B2K与车机的中波PK
2021/03/02 无线电
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
js验证是否为数字的总结
2013/04/14 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python制作爬虫采集小说
2015/10/25 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
Django REST framework 视图和路由详解
2019/07/19 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
Python爬虫教程知识点总结
2020/10/19 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
研究生考核个人自我鉴定
2014/03/27 职场文书
法律专业求职信
2014/05/24 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
物业保安辞职信
2015/05/12 职场文书
父亲去世追悼词
2015/06/23 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
Python中super().__init__()测试以及理解
2021/12/06 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python