Search code examples
javascripthtmlcssgrid-layoutmasonry

Masonry is leaving several gaps


I have checked all the posts concerning this topic, but none of the solutions worked for me.

This is what my grid looks like:

enter image description here

Here is the jsfiddle and here is the code. HTML:

<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<!-- Masonry -->
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
<link rel="stylesheet" href="css/style.css">


<!-- imagesLoaded -->
<script 
src="https://unpkg.com/[email protected]/imagesloaded.pkgd.min.js">

// init Masonry
var $grid = $('.grid').masonry({
  itemSelector: '.grid-item',
  percentPosition: true,
  columnWidth: '.grid-sizer'
});
// layout Masonry after each image loads
$grid.imagesLoaded().progress( function() {
  $grid.masonry('layout');
});
</script>


<!-- Bootstrap -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


<body>

  <div class="container">

        <div class="grid">

          <div class="grid-item">
              <img src="http://hiphopgoldenage.com/wp-content/uploads/2015/10/MellowManAce.jpg" alt="Mellow Man Ace">
          </div>

          <div class="grid-item">
              <img src="https://pbs.twimg.com/media/C2O6p6ZWgAA67jA.jpg" alt="...">
          </div>

          <div class="grid-item">
              <img src="http://images1.mtv.com/uri/mgid:file:docroot:mtv.com:/shared/promoimages/bands/c/cypres_hill/photos/cr_rene_cervantes/flipbook/CH-0141.jpg?enlarge=false&matte=true&matteColor=black&quality=0.85" alt="...">
          </div>

          <div class="grid-item">
              <img src="https://cdn-images-1.medium.com/max/600/1*VfCrfkNhTVwAxftgfebcog.jpeg" alt="...">
          </div>

          <div class="grid-item">
              <img src="https://images.genius.com/ace91b03cd16b6f3678660cd184af26a.500x323x1.jpg" alt="...">
          </div>

          <div class="grid-item">
              <img src="https://images.pexels.com/photos/271560/pexels-photo-271560.jpeg" alt="...">
          </div>

          <div class="grid-item">
              <img src="https://images.pexels.com/photos/147504/pexels-photo-147504.jpeg" alt="...">
          </div>

          <div class="grid-item">
              <img src="https://images.pexels.com/photos/99551/hot-air-balloon-valley-sky-99551.jpeg" alt="...">
          </div>

        </div>

CSS:

* { box-sizing: border-box; }

/* force scrollbar */
html { overflow-y: scroll; }
/* body { font-family: sans-serif; } */

/* ---- grid ---- */
.grid {
  background: #DDD;
}

/* clear fix */
.grid:after {
  content: '';
  display: block;
  clear: both;
}

/* ---- .grid-item ---- */
.grid-sizer,
.grid-item {
  width: 33.333%;
  float: left;
}
.grid-item img {
  display: block;
  max-width: 100%;
}

What am I doing wring? Please help me. Many thanks in advance!


Solution

  • You need to put the javascript in it's own script tag (without a src) and you need to put the jquery you're using with imagesLoaded() in $(document).ready() (or $(function(){})) and no need to specify columnWidth with your layout as the column width is in your CSS.

    .grid {
      background: #DDD;
    }
    
    .grid:after {
      content: '';
      display: block;
      clear: both;
    }
    
    .grid-sizer,
    .grid-item {
      width: 33.333%;
      float: left;
    }
    
    .grid-item img {
      display: block;
      max-width: 100%;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
    <script src="https://unpkg.com/[email protected]/imagesloaded.pkgd.min.js"></script>
    <script>
      $(function() {
        var $grid = $('.grid').masonry({
          itemSelector: '.grid-item',
          percentPosition: true,
        });
        $grid.imagesLoaded().progress(function() {
          $grid.masonry('layout');
        });
      });
    </script>
    
    <div class="grid">
      <div class="grid-item">
        <img src="http://hiphopgoldenage.com/wp-content/uploads/2015/10/MellowManAce.jpg" alt="Mellow Man Ace">
      </div>
      <div class="grid-item">
        <img src="https://pbs.twimg.com/media/C2O6p6ZWgAA67jA.jpg" alt="...">
      </div>
      <div class="grid-item">
        <img src="http://images1.mtv.com/uri/mgid:file:docroot:mtv.com:/shared/promoimages/bands/c/cypres_hill/photos/cr_rene_cervantes/flipbook/CH-0141.jpg?enlarge=false&matte=true&matteColor=black&quality=0.85" alt="...">
      </div>
      <div class="grid-item">
        <img src="https://cdn-images-1.medium.com/max/600/1*VfCrfkNhTVwAxftgfebcog.jpeg" alt="...">
      </div>
      <div class="grid-item">
        <img src="https://images.genius.com/ace91b03cd16b6f3678660cd184af26a.500x323x1.jpg" alt="...">
      </div>
      <div class="grid-item">
        <img src="https://images.pexels.com/photos/271560/pexels-photo-271560.jpeg" alt="...">
      </div>
      <div class="grid-item">
        <img src="https://images.pexels.com/photos/147504/pexels-photo-147504.jpeg" alt="...">
      </div>
      <div class="grid-item">
        <img src="https://images.pexels.com/photos/99551/hot-air-balloon-valley-sky-99551.jpeg" alt="...">
      </div>
    </div>