详解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 相关文章推荐
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
jquery+ajax实现注册实时验证实例详解
Dec 08 Javascript
AngularJS 使用$sce控制代码安全检查
Jan 05 Javascript
AngularJs  Creating Services详解及示例代码
Sep 02 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
微信小程序访问豆瓣电影api的实现方法
Mar 31 Javascript
浅谈JS的原型和继承
May 08 Javascript
如何实现echarts markline标签名显示自己想要的
Jul 20 Javascript
小程序实现左滑删除的效果的实例代码
Oct 19 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
德生PL330的评价与改造
2021/03/02 无线电
用PHP实现文件上传二法
2006/10/09 PHP
第十四节 命名空间 [14]
2006/10/09 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php实现socket推送技术的示例
2017/12/20 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
js中opener与parent的区别详细解析
2014/01/14 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
Django 大文件下载实现过程解析
2019/08/01 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
2015年大学生村官工作总结
2015/04/21 职场文书
2015年小学财务工作总结
2015/07/20 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python