原生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 相关文章推荐
JObj预览一个JS的框架
Mar 13 Javascript
js活用事件触发对象动作
Aug 10 Javascript
Jquery getJSON方法详细分析
Dec 26 Javascript
JQuery获取表格数据示例代码
May 26 Javascript
javascript原始值和对象引用实例分析
Apr 25 Javascript
ajax+jQuery实现级联显示地址的方法
May 06 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
作为老司机使用 React 总结的 11 个经验教训
Apr 08 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
浅析JS中什么是自定义react数据验证组件
Oct 19 Javascript
使用vue for时为什么要key【推荐】
Jul 11 Javascript
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
写一个用户在线显示的程序
2006/10/09 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
python异常触发及自定义异常类解析
2019/08/06 Python
使用Python实现画一个中国地图
2019/11/23 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
Django ORM filter() 的运用详解
2020/05/14 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
银行出纳岗位职责
2013/11/25 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
商务考察邀请函范文
2014/01/21 职场文书
《掌声》教学反思
2014/02/23 职场文书
2014年教研组工作总结
2014/11/26 职场文书
新闻稿件写作技巧
2015/07/18 职场文书