enmi12/glossaire/_posts/custom-layout-modes/2011-05-18-centered-masonry.html
author ymh <ymh.work@gmail.com>
Mon, 14 Oct 2019 17:39:30 +0200
changeset 7 cf61fcea0001
parent 0 d970ebf37754
permissions -rwxr-xr-x
resynchronize code repo with production
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
---
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
title: Centered Masonry
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
layout: default
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
category: custom-layout-modes
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
---
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
<style>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
  #container {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    margin: 0 auto 20px;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
  }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
</style>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
<section id="copy">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  <p><a href="../docs/layout-modes.html#modified_layout_modes">Modified masonry layout mode</a> for centered container.</p>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
</section>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
<section id="options" class="clearfix">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
  {% include filter-buttons.html %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
  {% include sort-buttons.html %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
  <h3>Etc</h3>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  <ul id="etc" class="clearfix">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    <li id="toggle-sizes"><a href="#toggle-sizes">Toggle variable sizes</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    <li id="insert"><a href="#insert">Insert new elements</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    <li id="append"><a href='#append'>Append new elements</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    <li id="shuffle"><a href='#shuffle'>Shuffle</a></li>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  </ul>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
</section> <!-- #options -->
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
<div id="container" class="clickable clearfix">
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
  {% for elem_number in site.best_of_order %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    {% assign element = site.elements[elem_number] %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    {% include element-partial.html %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
  {% endfor %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
</div> <!-- #container -->
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
<script src="../{{ site.jquery_js }}"></script>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
<script src="../{{ site.isotope_js }}"></script>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
<script src="../js/fake-element.js"></script>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
<script>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
  $.Isotope.prototype._getCenteredMasonryColumns = function() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    this.width = this.element.width();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    var parentWidth = this.element.parent().width();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
                  // i.e. options.masonry && options.masonry.columnWidth
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    var colW = this.options.masonry && this.options.masonry.columnWidth ||
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
                  // or use the size of the first item
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
                  this.$filteredAtoms.outerWidth(true) ||
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
                  // if there's no items, use size of container
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                  parentWidth;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    var cols = Math.floor( parentWidth / colW );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    cols = Math.max( cols, 1 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    // i.e. this.masonry.cols = ....
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    this.masonry.cols = cols;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    // i.e. this.masonry.columnWidth = ...
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    this.masonry.columnWidth = colW;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
  };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
  
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
  $.Isotope.prototype._masonryReset = function() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    // layout-specific props
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    this.masonry = {};
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    // FIXME shouldn't have to call this again
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    this._getCenteredMasonryColumns();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    var i = this.masonry.cols;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    this.masonry.colYs = [];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    while (i--) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
      this.masonry.colYs.push( 0 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
  $.Isotope.prototype._masonryResizeChanged = function() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    var prevColCount = this.masonry.cols;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    // get updated colCount
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    this._getCenteredMasonryColumns();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    return ( this.masonry.cols !== prevColCount );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
  };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
  
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
  $.Isotope.prototype._masonryGetContainerSize = function() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    var unusedCols = 0,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        i = this.masonry.cols;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    // count unused columns
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    while ( --i ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
      if ( this.masonry.colYs[i] !== 0 ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        break;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
      }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
      unusedCols++;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    return {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
          height : Math.max.apply( Math, this.masonry.colYs ),
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
          // fit container to columns that have been used;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
          width : (this.masonry.cols - unusedCols) * this.masonry.columnWidth
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
  };
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
  $(function(){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    var $container = $('#container');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    {% include random-sizes.js %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    $container.isotope({
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
      itemSelector : '.element',
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
      masonry : {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        columnWidth : 120
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
      },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
      getSortData : {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        symbol : function( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
          return $elem.attr('data-symbol');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        category : function( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
          return $elem.attr('data-category');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        number : function( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
          return parseInt( $elem.find('.number').text(), 10 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        weight : function( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
          return parseFloat( $elem.find('.weight').text().replace( /[\(\)]/g, '') );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        },
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        name : function ( $elem ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
          return $elem.find('.name').text();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
        }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
      }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
      
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    {% include option-set-buttons.js %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    {% include add-buttons.js %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    {% include change-sizes.js %}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    var $sortBy = $('#sort-by');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
    $('#shuffle a').click(function(){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
      $container.isotope('shuffle');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
      $sortBy.find('.selected').removeClass('selected');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
      $sortBy.find('[data-option-value="random"]').addClass('selected');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
      return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
  });
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
</script>