原生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 Ajax之$.get()方法和$.post()方法
Oct 12 Javascript
基于jquery的一个浮动框(扩展性比较好 )
Aug 27 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
Jun 22 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
javascript 实现map集合
Apr 03 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
利用iscroll4实现轮播图效果实例代码
Jan 11 Javascript
Vue非父子组件通信详解
Jun 12 Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 jQuery
vue结合element-ui使用示例
Jan 24 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 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语法(1)
2006/10/09 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
Cookie 小记
2010/04/01 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
python实现dict版图遍历示例
2014/02/19 Python
Python yield 小结和实例
2014/04/25 Python
python解析xml文件实例分析
2015/05/27 Python
python处理按钮消息的实例详解
2017/07/11 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
介绍一下linux的文件系统
2015/10/06 面试题
2014年六五普法工作总结
2014/11/25 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书
房屋维修申请报告
2015/05/18 职场文书