【问题标题】:MasonryJS image gallery aligns left on page refreshMasonry JS 图像库在页面刷新时左对齐
【发布时间】:2021-03-07 18:46:00
【问题描述】:

所以我有这个图片库,我使用 MasonryJS 将其显示为 Pinterest 风格的 Masonry。一切正常,但问题是当我刷新页面时。也就是说,当我刷新页面时,所有图像首先都向左对齐,然后才到达实际位置。就像在几毫秒内它会回到那个位置并恢复活力。

这是一个显示实际问题的 gif:

如何在页面刷新时不让它左对齐?无论我刷新多少页面,我都希望它保持在中间。

代码如下:

jQuery(window).on('load', function(){ 
    $('.modal-grid').masonry({
        itemSelector: '.modal-grid-item',
        gutter: 10,
        isFitWidth: true
    });
});
.modal-grid{
    margin: 0 auto;
    margin-top: 30px;
}

.modal-grid-item { 
    width: 300px; margin-bottom: 10px; 
}

.modal-grid-item img { 
    width: 100%; height: auto; 
}
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>


<div class="modal-grid">

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/m7M9EPX.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/NzD7YF9.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/8zvUjul.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/WNmP9VL.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/0nwzhDV.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/ypdixv8.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/1oHOvK1.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/kpjtht1.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/QAQ0dk6.jpg" />
  </div>

    <div class="modal-grid-item">
    <img src="https://i.imgur.com/m7M9EPX.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/NzD7YF9.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/8zvUjul.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/WNmP9VL.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/0nwzhDV.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/ypdixv8.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/1oHOvK1.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/kpjtht1.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/QAQ0dk6.jpg" />
  </div>
  
    <div class="modal-grid-item">
    <img src="https://i.imgur.com/m7M9EPX.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/NzD7YF9.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/8zvUjul.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/WNmP9VL.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/0nwzhDV.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/ypdixv8.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/1oHOvK1.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/kpjtht1.jpg" />
  </div>

  <div class="modal-grid-item">
    <img src="https://i.imgur.com/QAQ0dk6.jpg" />
  </div>

</div>

【问题讨论】:

    标签: javascript jquery css jquery-masonry


    【解决方案1】:

    Masonry 有 events 我们可以利用,例如 layoutComplete。我用它来让砌体在隐藏时加载图像。一旦ready 事件触发,我们就会触发 Masonry 自己的layoutComplete 事件来重新计算元素。然后我们运行一次回调以显示 Masonry。

    .modal-grid {
        opacity: 0; /* jQuery will remove this later */
        transition: opacity; /* optional */
    }
    
    jQuery(window).on('load', function() { 
        /* Init your grid like normal but save it to a variable */
        const $grid = $('.modal-grid').masonry({
                itemSelector: '.modal-grid-item',
                gutter: 10,
                isFitWidth: true
            });
        /*
          Add a one time eventListener to just run on our hand-made "onLoad" event
        */
        $grid.one('layoutComplete', function() {
            /* and fade it in */
            $grid.css('opacity', '1');
    
            /*
            If it is still happening, you can
            add a setTimeout to delay the fade effect
            */
            /**
            let timeoutHandle;
            timeoutHandle = setTimeout(function() {
                $grid.css('opacity', '1')
                // clear the timeout to make explicitly
                // sure no extra timers are running
                clearTimeout(timeoutHandle); 
            }, 1000);
            */
        });
        
        $(document).ready(function() {
            // trigger the event when the document elements
            // are ready
            $grid.trigger('layoutComplete');
        });
    });
    

    如果你想玩它,可以查看 CodePen here

    【讨论】:

    • 它工作正常。但是现在抖动在中间。你的回答很好。但是你能告诉我如何在布局加载时使用微调器/加载器吗?
    • 您可以尝试使用https://loading.io/css/ 之类的东西,并使用jQuery 显示/隐藏它。你会做和$grid.css('opacity', '1')一样的事情。只需更改选择器并添加额外规则即可更改可见性,请参阅docs。您需要找出将其定位在砌体容器内的 CSS。
    • 我试过这个解决方案,它适用于静态数据。但是如果我使用动态数据并使用 AJAX 获取,那么布局是左对齐的。检查我创建的这个新问题。如果您有解决方案,请给出您的想法。 stackoverflow.com/questions/66527023/…
    猜你喜欢
    • 2013-06-03
    • 2017-08-14
    • 1970-01-01
    • 2011-09-04
    • 2021-05-30
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多