原生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跨域代码片段
Aug 30 Javascript
jQuery is()函数用法3例
May 06 Javascript
jQuery简单实现两级下拉菜单效果代码
Sep 15 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 Javascript
浅谈KOA2 Restful方式路由初探
Mar 14 Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 Javascript
小程序登录/注册页面设计的实现代码
May 24 Javascript
原生JS实现拖拽功能
Dec 16 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
Cpy和Python的效率对比
2015/03/20 Python
利用python代码写的12306订票代码
2015/12/20 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
Python中捕获键盘的方式详解
2019/03/28 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
python 函数中的参数类型
2020/02/11 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
致400米运动员广播稿
2014/02/07 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
协议书与合同的区别
2014/04/18 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
个人委托书如何写
2014/09/25 职场文书
后备干部推荐材料
2014/12/24 职场文书
nginx 添加http_stub_status_module模块
2022/05/25 Servers