原生JS实现响应式瀑布流布局


Posted in Javascript onApril 02, 2015

原生JS实现的瀑布流布局,代码及demo代码地址:https://github.com/leozdgao/responsive_waterfall

Demo:http://leozdgao.github.io/demo/responsive_waterfall/

演示图:

原生JS实现响应式瀑布流布局

核心代码:

responsive_waterfall.js

(function() {
  var Waterfall = function(opts) {
    var minBoxWidth;
    Object.defineProperty(this, 'minBoxWidth', {
      get: function() { return minBoxWidth; },
      set: function(value) {
        if(value < 100) value = 100;
        if(value > 1000) value = 1000;
         
        minBoxWidth = value;
      }
    });
 
    opts = opts || {};
    var containerSelector = opts.containerSelector || '.wf-container';
    var boxSelector = opts.boxSelector || '.wf-box';
 
    // init properties
    this.minBoxWidth = opts.minBoxWidth || 250;
    this.columns = [];
    this.container = document.querySelector(containerSelector);
    this.boxes = this.container ? 
      Array.prototype.slice.call(this.container.querySelectorAll(boxSelector)) : [];
 
    // compose once in constructor
    this.compose();
 
    // handle the image or something which might change size after loaded
    var images = this.container.querySelectorAll('img'), that = this;
    var clr;
    for (var i = 0; i < images.length; i++) {
      var img = images[i];
      img.onload = function() {
        if(clr) clearTimeout(clr);
 
        clr = setTimeout(function() {
          that.compose(true);
        }, 500);
      }
    }
 
    window.addEventListener('resize', function() {
      that.compose();
    });
  }
 
  // compute the number of columns under current setting
  Waterfall.prototype.computeNumberOfColumns = function() {
    var num = Math.floor(this.container.clientWidth / this.minBoxWidth);
    num = num || 1; // at least one column
 
    return num;
  }
 
  // init enough columns and set the width
  Waterfall.prototype.initColumns = function(num) {
    if(num > 0) {
      // create column div
      this.columns = [];
      var width = (100 / num) + '%';
      while(num--) {
        var column = document.createElement('div');
        column.className = 'wf-column';
        column.style.width = width;
        this.columns.push(column);
        this.container.appendChild(column);
      }
    }
  }
 
  // get the index of shortest column
  Waterfall.prototype.getMinHeightIndex = function() {
    if(this.columns && this.columns.length > 0) {
      var min = this.columns[0].clientHeight, index = 0;
      for (var i = 1; i < this.columns.length; i++) {
        var columnElem = this.columns[i];
        if(columnElem.clientHeight < min) {
          min = columnElem.clientHeight;
          index = i;
        }
      }
      return index;
    }
    else return -1;
  }
 
  // compose core
  Waterfall.prototype.compose = function(force) {
    var num = this.computeNumberOfColumns();
    var cols = this.columns.length;
     
    if(force || num != cols) {
      // remove old column
      for (var i = 0; i < this.columns.length; i++) {
        var columnElem = this.columns[i];
        columnElem.remove();
      }
 
      // init new column
      this.initColumns(num);
 
      // compose
      for (var i = 0, l = this.boxes.length; i < l; i++) {
        var box = this.boxes[i];
        this.addBox(box);
      }
    }
  }
 
  // add a new box to grid
  Waterfall.prototype.addBox = function(elem) {
    // push if new box
    if(this.boxes.indexOf(elem) < 0) this.boxes.push(elem);
 
    var columnIndex = this.getMinHeightIndex();
    if(columnIndex > -1) {
      var column = this.columns[columnIndex];
      column.appendChild(elem);
    }
  }
 
  window.Waterfall = Waterfall;
})()

以上所述就是本文给大家分享的全部内容了,希望能够对大家熟练使用javascript有所帮助。

Javascript 相关文章推荐
JavaScript 判断指定字符串是否为有效数字
May 11 Javascript
基于Jquery的简单图片切换效果
Jan 06 Javascript
javascript学习笔记(十一) 正则表达式介绍
Jun 20 Javascript
checkbox全选所涉及到的知识点介绍
Dec 31 Javascript
基于jQuery实现网页进度显示插件
Mar 04 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
jQuery实现点击查看大图并以弹框的形式居中
Aug 08 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
Nov 01 Javascript
javascript 内存模型实例详解
Apr 18 Javascript
node运行js获得输出的三种方式示例详解
Jul 02 Javascript
JavaScript Html实现移动端红包雨功能页面
Jan 10 Javascript
详解实现vue的数据响应式原理
Jan 20 Vue.js
Javascript变量的作用域和作用域链详解
Apr 02 #Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 #Javascript
JavaScript中操作Mysql数据库实例
Apr 02 #Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 #Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 #Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 #Javascript
jquery实现的省市区三级联动
Apr 02 #Javascript
You might like
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
php array_values 返回数组的所有值详解及实例
2016/11/12 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
原生JS实现的双色球功能示例
2018/02/02 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python中函数参数匹配模型详解
2019/06/09 Python
通过实例解析python描述符原理作用
2020/01/22 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
后勤部长岗位职责
2013/12/14 职场文书
小学教师听课制度
2014/02/01 职场文书
老师对学生的评语
2014/04/18 职场文书
租赁协议书范本
2014/04/22 职场文书
难忘的一课教学反思
2014/04/30 职场文书
小区推广策划方案
2014/06/06 职场文书
代领毕业证委托书
2014/08/02 职场文书
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android