原生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 相关文章推荐
js从10种颜色中随机取色实现每次取出不同的颜色
Oct 23 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
Oct 29 Javascript
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
Position属性之relative用法
Dec 14 Javascript
javascript中apply、call和bind的使用区别
Apr 05 Javascript
Webpack中css-loader和less-loader的使用教程
Apr 27 Javascript
w3c编程挑战_初级脚本算法实战篇
Jun 23 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
Sep 30 Javascript
vue生命周期实例小结
Aug 15 Javascript
解决vue单页路由跳转后scrollTop的问题
Sep 03 Javascript
Vue.js中的组件系统
May 30 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
php adodb分页实现代码
2009/03/19 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
python实现批量监控网站
2016/09/09 Python
python中执行shell的两种方法总结
2017/01/10 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
2018/02/26 Python
我就是这样学习Python中的列表
2019/06/02 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
解决python运行效率不高的问题
2020/07/20 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
个人违纪检讨书
2014/09/15 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫