原生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 相关文章推荐
Jquery Autocomplete 结合asp.net使用要点
Oct 29 Javascript
jQuery 常见操作实现方式和常用函数方法总结
May 06 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
Jul 18 Javascript
js阻止浏览器默认行为的简单实例
May 15 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
Sep 20 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 Javascript
JS实现图片点击后出现模态框效果
May 03 Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
node解析修改nginx配置文件操作实例分析
Nov 06 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导出oracle库的php代码
2009/04/20 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
php封装的验证码类分享
2017/02/26 PHP
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
js中的闭包学习心得
2018/02/06 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
python迭代器的使用方法实例
2013/11/21 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
关于读书的演讲稿1000字
2014/08/27 职场文书
网络妈妈观后感
2015/06/08 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
logback 实现给变量指定默认值
2021/08/30 Java/Android