You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目中Masonry.js布局偶发异常仅刷新可修复,如何解决?

问题根因

你遇到的偶发布局错乱是Masonry布局的典型问题:你使用了HTML属性自动初始化Masonry,初始化执行时网格内的图片还未加载完成,Masonry无法获取图片的实际高度,计算出的网格项位置错误。刷新页面时图片已经被浏览器缓存,加载速度远快于首次加载,Masonry初始化时能拿到正确的元素高度,所以布局恢复正常。

解决方案

你可以根据项目情况选择以下任意一种方案,也可以组合使用获得更稳定的效果:

  • 方案1:手动初始化Masonry,等待所有图片加载完成后再执行初始化
    不要使用data-masonry属性自动初始化,改成手动调用初始化逻辑,配合imagesLoaded工具监听所有图片加载状态,全部加载完成后再初始化Masonry:
    <script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
    <!-- 引入imagesLoaded工具 -->
    <script src="https://unpkg.com/imagesloaded@5/imagesloaded.pkgd.min.js"></script>
    <div class="grid products-by-room" style="margin-top: 8rem">
        @foreach ($rooms as $room)
           <div class="grid-item" data-category="{{ $room->data_category}}" style="border: 7px solid #fff">
               <a href="#zoomImg{{ $room->id }}" data-bs-toggle="modal" data-bs-target="#zoomImg{{ $room->id }}">
                   <div class="img-wrapper">
                       <img src="{{ $room->img }}" alt="" class="img-fluid shade">
                           <div class="overlay">
                           <i class="fa fa-search-plus icon"></i>
                       </div>
                   </div>
               </a>
               <div class="text-left mt-3 mb-5">
                   <p class="product-subtitle">{{ $room->name }}</p>
                   <h4 class="product-title">Shop the Look</h4>
                   <a class="product-price-link" href="#getPriceByRoom{{ $room->id }}" data-bs-toggle="modal" data-bs-target="#getPriceByRoom{{ $room->id }}">get price</a>
               </div>
           </div>
       @endforeach
    </div>
    <script>
    // 等待网格内所有图片加载完成后初始化Masonry
    const grid = document.querySelector('.grid');
    imagesLoaded(grid, function() {
      new Masonry(grid, {
        itemSelector: '.grid-item'
      });
    });
    </script>
    
  • 方案2:给图片预设占位高度,避免加载后高度变化
    提前给每张图片设置固定的宽高比,使用CSS的aspect-ratio属性或者padding-top占位法,让图片在加载完成前就占据对应高度,Masonry初始化时就能拿到正确的尺寸:
    .img-wrapper {
      aspect-ratio: 替换为你的图片实际宽高比,例如3/4;
      width: 100%;
    }
    .img-wrapper img {
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
    
  • 方案3:每张图片加载完成后触发Masonry重新布局
    如果不想引入额外工具,可以监听每张图片的load事件,每次加载完成后调用Masonry的layout()方法重新计算布局:
    const msnry = new Masonry(grid, { itemSelector: '.grid-item' });
    // 监听所有图片加载事件
    document.querySelectorAll('.grid-item img').forEach(img => {
      img.addEventListener('load', () => {
        msnry.layout();
      });
    });
    

内容的提问来源于stack exchange,提问作者mlila_p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:39:00