原生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正则表达exec与match的区别说明
Jan 29 Javascript
jquery 判断滚动条到达了底部和顶端的方法
Apr 02 Javascript
Angular 4.x 路由快速入门学习
May 03 Javascript
JavaScript 保护变量不被随意修改的实现代码
Sep 27 Javascript
bootstrap 通过加减按钮实现输入框组功能
Nov 15 Javascript
Vue cli+mui 区域滚动的实例代码
Jan 25 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
Apr 24 Javascript
vue路由中前进后退的一些事儿
May 18 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
Sep 12 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 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获取文章上一页与下一页的方法
2014/12/01 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
Javascript浅谈之this
2013/12/17 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
Python中自定义函数的教程
2015/04/27 Python
详解Python中的日志模块logging
2015/06/19 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python随机取list中的元素方法
2018/04/08 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
python通过实例讲解反射机制
2019/10/17 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
英国在线花园中心:You Garden
2018/06/03 全球购物
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
一夜的工作教学反思
2014/02/08 职场文书
后勤主管岗位职责
2014/03/01 职场文书
目标责任书范本
2014/04/16 职场文书
投标邀请书范本
2015/02/02 职场文书
小学信息技术教学反思
2016/02/16 职场文书
python 离散点图画法的实现
2022/04/01 Python