原生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 相关文章推荐
如何简单地用YUI做JavaScript动画
Mar 10 Javascript
JS Array对象入门分析
Oct 30 Javascript
JS中自定义定时器让它在某一时刻执行
Sep 02 Javascript
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
基于Jquery实现万圣节快乐特效
Nov 01 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
解决layui富文本编辑器图片上传无法回显的问题
Sep 18 Javascript
javascript中call,apply,bind的区别详解
Dec 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
python3实现随机数
2018/06/25 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
python实现在线翻译
2020/06/18 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
十岁生日同学答谢词
2014/01/19 职场文书
工作散漫检讨书
2014/09/16 职场文书
介绍信范文
2015/01/31 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
师德师风培训感言
2015/08/03 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
正则表达式拆分url实例代码
2022/02/24 Java/Android
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers