原生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 相关文章推荐
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
jQuery Ajax 实例全解析
Apr 20 Javascript
JQuery对checkbox操作 (循环获取)
May 20 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
Jun 23 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
Nov 02 Javascript
详解React之父子组件传递和其它一些要点
Jun 25 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
Sep 20 Javascript
JavaScript Canvas编写炫彩的网页时钟
Oct 16 Javascript
Element Dropdown下拉菜单的使用方法
Jul 26 Javascript
Vue实现简易购物车页面
Dec 30 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
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和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
php权重计算方法代码分享
2014/01/09 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
王纯业的Python学习笔记 下载
2007/02/10 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python操作cfg配置文件方式
2019/12/22 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
婚前保证书
2014/04/29 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL