【问题标题】:When first masonry 'item' is hidden all remaining items form into a single column当第一个砌体“项目”被隐藏时,所有剩余的项目形成一个列
【发布时间】:2025-11-21 19:25:01
【问题描述】:

我正在尝试将 Masonry 用于一个项目,但我对 JS 缺乏经验。我遇到了一个问题,即隐藏 Masonry 网格中的第一项导致其余网格项形成一个列。

我可以隐藏和显示尽可能多的其他项目,而不是看起来的第一个项目。

下面的代码笔重现了这个问题,按“创建”以形成砌体布局,然后按“隐藏”以隐藏具有“特殊”类的 div...

http://codepen.io/anon/pen/ByxmMv

从第一个 div 中删除“special”类将展示所需的布局行为。

我希望我只是做错了什么,但如果我不是,有人可以演示解决方法吗?

感谢任何帮助。

 <!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Masonry</title>
  <link rel="stylesheet" href="css/style.css" media="screen" type="text/css" />
  <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script src="http://masonry.desandro.com/masonry.pkgd.js"></script>
  <script type="text/javascript">

    function hide() {
      $(".special").hide();
      msnry.layout();
    }
    function show() {
      $(".special").show();
      msnry.layout();
    }
    function create() {
      container = document.querySelector('#container');
      msnry = new Masonry( container, {
        itemSelector: ".item",
        isAnimated: true
      });
    }
    function destroy() {
      msnry.destroy();
    }
  </script>


  <style type="text/css">
    #container {
      background: #EEE;
      max-width: 80%;
      margin: 10px;
    }
    .item {
      width:  150px;
      height: 150px;
      float: left;
      background: green;
      border: 2px solid #333;
      margin: 10px;
    }
    .item:nth-child(3n){
      height: 100px;
    }
    .special {
      background:orange;
    }
  </style>
</head>
<body>

  <button onclick="create()">Create</button>
  <button onclick="destroy()">Destroy</button>
  <button onclick="hide()">Hide</button>
  <button onclick="show()">Show</button>
  <div id="container">
    <div class="item special"></div>
    <div class="item special"></div>
    <div class="item special"></div>
    <div class="item"></div>
    <div class="item special"></div>
    <div class="item special"></div>
    <div class="item"></div>
    <div class="item special"></div>
    <div class="item delete"></div>
    <div class="item"></div>
    <div class="item special"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
  </div>

</body>
</html>

【问题讨论】:

    标签: javascript jquery css masonry


    【解决方案1】:

    你可以添加一个 'sizer' 元素来获得合适的宽度:

            msnry = new Masonry( container, {
                itemSelector: ".item",
                columnWidth: '.sizer',
                isAnimated: true
            });
    

    http://codepen.io/herihehe/full/ravYEL/

    【讨论】:

      【解决方案2】:

      尝试从您隐藏的元素中删除类“项目”,然后通过调用 destroy() 和 create() 函数重新实例化。再次显示时只需添加回类即可。

      function hide() {
        $(".special").removeClass('item').hide();
        destroy();
        create();
      }
      
      function show() {
        $(".special").addClass('item').show();
        destroy();
        create();
      }

      http://codepen.io/anon/pen/ByxmMv

      【讨论】:

      • 一个干净的解决方法,但你失去了过渡效果。