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

 更新时间:2015年04月02日 10:15:10   投稿:hebedich  
本文给大家分享的是使用原生的javascript实现的响应式的瀑布流布局的方法和源码,非常的实用,有需要的小伙伴可以参考下。

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

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

演示图:

核心代码:

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有所帮助。

相关文章

  • JS获取多维数组中相同键的值实现方法示例

    JS获取多维数组中相同键的值实现方法示例

    这篇文章主要介绍了JS获取多维数组中相同键的值实现方法,结合实例形式分析了JS数组遍历、判断、键值获取等操作技巧,需要的朋友可以参考下
    2017-01-01
  • JavaScript实现职责链模式概述

    JavaScript实现职责链模式概述

    这篇文章主要介绍了JavaScript实现职责链模式概述,详细的介绍了什么是职责链模式和实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • namespace.js Javascript的命名空间库

    namespace.js Javascript的命名空间库

    命名空间的好处已经耳熟能详,但是JS中并没有原生态支持命名空间,这个库就是为js提供命名空间的功能。
    2011-10-10
  • 用javascript做一个小游戏平台 (二) 游戏选择器

    用javascript做一个小游戏平台 (二) 游戏选择器

    昨天晚上“设计”了n久,那些代码都还没有运行起来,有点心急、有点郁闷。
    2010-01-01
  • 关于微信小程序自定义tabbar问题详析

    关于微信小程序自定义tabbar问题详析

    微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验,下面这篇文章主要给大家介绍了关于微信小程序自定义tabbar问题的相关资料,需要的朋友可以参考下
    2022-04-04
  • 微信小程序动态设置导航栏标题的实现步骤

    微信小程序动态设置导航栏标题的实现步骤

    实际开发中很多时候我们需要通过上个页面传过来的值动态的更改标题栏文字,下面这篇文章主要给大家介绍了关于微信小程序动态设置导航栏标题的实现步骤,需要的朋友可以参考下
    2023-02-02
  • js创建数组的简单方法

    js创建数组的简单方法

    下面小编就为大家带来一篇JS创建数组的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 如何利用JavaScript 实现继承

    如何利用JavaScript 实现继承

    这篇文章主要介绍了如何利用JavaScript 实现继承,JavaScript 在编程语言界是个特殊种类,它和其他编程语言很不一样,JavaScript可以在运行的时候动态地改变某个变量的类型,下面小编将继续介绍JavaScript如何实现继承,需要的朋友可以参考下
    2022-02-02
  • Bootstrap CSS布局之表格

    Bootstrap CSS布局之表格

    这篇文章主要为大家详细介绍了Bootstrap CSS布局之表格的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JavaScript入门基础

    JavaScript入门基础

    在学习JavaScript之前,必须具备HTML和CSS知识,Javascript是一种解释性的,基于对象的脚本语言(aninterpreted,object-basedscriptinglanguage)。这篇文章主要讲解JavaScript入门基础,需要的朋友可以参考下
    2015-08-08

最新评论