原生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格式化货币数据实现代码

    货币数据想要一某种形式在页面中显示的话,首先是必须要格式化的,下面为大家介绍下具体的格式化代码,感兴趣的朋友可以参考下
    2013-09-09
  • javascript转换字符串为dom对象(字符串动态创建dom)

    javascript转换字符串为dom对象(字符串动态创建dom)

    那么今天的目的就是教大家怎么去实现一个这样的方法用来把字符串直接转换为标准的dom对象
    2010-05-05
  • JavaScript中实现sprintf、printf函数

    JavaScript中实现sprintf、printf函数

    这篇文章主要介绍了JavaScript中实现sprintf、printf函数,这两个函数在大多数编程语言中都有,但JS中却没有,本文介绍在js中实现这两个函数功能,需要的朋友可以参考下
    2015-01-01
  • JavaScript类型系统之布尔Boolean类型详解

    JavaScript类型系统之布尔Boolean类型详解

    这篇文章主要介绍了JavaScript类型系统之布尔Boolean类型详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • JavaScript基础知识及常用方法总结

    JavaScript基础知识及常用方法总结

    JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的,通过本篇文章给大家介绍javascript基础知识及常用方法总结,对js基础知识及常用方法相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • 原生JS实现小小的音乐播放器

    原生JS实现小小的音乐播放器

    这篇文章主要为大家详细介绍了原生JS实现音乐播放器,支持循环、随机播放,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 当前流行的JavaScript代码风格指南

    当前流行的JavaScript代码风格指南

    这篇文章主要介绍了当前流行的JavaScript代码风格指南,同时推荐了一款风格检验工具jshint,可以配合大多数的编辑器统一团队代码风格,需要的朋友可以参考下
    2014-09-09
  • js实现搜索提示框效果

    js实现搜索提示框效果

    这篇文章主要为大家详细介绍了js实现搜索提示框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • echarts柱状图的点击事件代码示例

    echarts柱状图的点击事件代码示例

    这篇文章主要给大家介绍了关于echarts柱状图点击事件的相关资料,在实际的项目开发中我们通常会用到Echarts来对数据进行展示,有时候需要用到Echarts的点击事件,增加系统的交互,需要的朋友可以参考下
    2023-09-09
  • JS实现模糊查询带下拉匹配效果

    JS实现模糊查询带下拉匹配效果

    这篇文章主要介绍了JS实现模糊查询带下拉匹配效果,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06

最新评论