Native JS implements responsive waterfall stream layout _ javascript skills

Source: Internet
Author: User
This article will share with you the method and source code for implementing a responsive waterfall stream layout using native javascript. It is very practical and can be referenced by partners who need it. Native JS Implementation of waterfall flow layout, code and demo Code address: https://github.com/leozdgao/responsive_waterfall

Demo: http://leozdgao.github.io/demo/responsive_waterfall/

Demo diagram:

Core code:

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 p      this.columns = [];      var width = (100 / num) + '%';      while(num--) {        var column = document.createElement('p');        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;})()

The above is all the content shared in this article. I hope it will be helpful for you to use javascript skillfully.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.