当网格旋转时,小包/砌体不尊重标记项目

时间:2016-12-15 03:15:00

标签: jquery css jquery-masonry masonry packery

使用Packery时,如果我将网格旋转45度,则标记的项目不再影响布局。为什么会这样?

通常,Packery将在标记元素周围布置项目。我的项目正在使用Packery,但在调查时我发现砌砖也发生了同样的问题。

我使用css旋转网格:

.grid {
  transform:rotate(-45deg);
}

您可以在this codepen上看到问题的示例。 正如文档所解释的那样,Packery应该在标记元素周围布置项目元素(解释herehere)。

任何解决方法的建议也会有所帮助。

(Bounty说90度。应该说45度(加或减))。

1 个答案:

答案 0 :(得分:1)

似乎在初始化期间对.layout()的隐式调用在CSS中定义旋转时错误地呈现旋转的标记对象。

这是一个解决方法:

  1. .grid
  2. 删除您的轮换CSS规则
  3. 在网格初始化后添加以下代码:

    $('.grid').css({
      '-webkit-transform': 'rotate(-45deg)',
      'transform': 'rotate(-45deg)'
    });
    
  4. Updated CodePen

    // external js: packery.pkgd.js
    
    $('.grid').packery({
      itemSelector: '.grid-item',
      stamp: '.stamp'
    });
    
    $('.grid').css({
      '-webkit-transform': 'rotate(-45deg)',
      'transform': 'rotate(-45deg)'
    });
    * { box-sizing: border-box; }
    
    body { font-family: sans-serif; }
    
    /*--- grid ---*/
    
    .grid {
      background: #DDD;
      max-width: 1200px;
      position: relative;
    }
    
    /* clear fix */
    .grid:after {
      content: '';
      display: block;
      clear: both;
    }
    
    /* ---- .grid-item ---- */
    
    .grid-item {
      float: left;
      width: 100px;
      height: 100px;
      background: #C09;
      border: 2px solid hsla(0, 0%, 0%, 0.5);
    }
    
    .grid-item--width2 { width: 200px; }
    .grid-item--height2 { height: 200px; }
    
    .stamp {
      position: absolute;
      width: 30%;
      height: 120px;
      background: #C90;
      border: 4px dotted hsla(0, 0%, 0%, 0.5);
    }
    
    .stamp1 {
      left: 20%;
      top: 0px;
    }
    
    .stamp2 {
      right: 10%;
      top: 110px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://mfzy.co/packery.pkgd.js"></script>
    
    <h3>Packery - stamp option with rotated grid</h3>
    
    <div class="grid">
      <div class="stamp stamp1"></div>
      <div class="stamp stamp2"></div>
      <div class="grid-item grid-item--width2"></div>
      <div class="grid-item grid-item--height2"></div>
      <div class="grid-item"></div>
      <div class="grid-item"></div>
      <div class="grid-item grid-item--width2 grid-item--height2"></div>
      <div class="grid-item grid-item--width2"></div>
      <div class="grid-item grid-item--width2"></div>
      <div class="grid-item grid-item--height2"></div>
      <div class="grid-item"></div>
      <div class="grid-item grid-item--width2"></div>
      <div class="grid-item grid-item--height2"></div>
      <div class="grid-item"></div>
      <div class="grid-item"></div>
      <div class="grid-item grid-item--width2 grid-item--height2"></div>
      <div class="grid-item"></div>
      <div class="grid-item grid-item--width2"></div>
      <div class="grid-item grid-item--height2"></div>
      <div class="grid-item"></div>
    </div>

    修改 - 解决方法#2

    要处理响应,您可以将JavaScript更改为以下内容:

    // external js: packery.pkgd.js
    
    var $grid = $('.grid').packery({
      itemSelector: '.grid-item',
      stamp: '.stamp'
    });
    
    function updateCSS(deg) {
      $('.grid').css({
        '-webkit-transform': 'rotate(' + deg + 'deg)',
        'transform': 'rotate(' + deg + 'deg)'
      });
    }
    
    updateCSS(-45);
    
    $(window).resize(function() {
      updateCSS(0);
      $grid.packery('destroy');
      $grid = $('.grid').packery({
        itemSelector: '.grid-item',
        stamp: '.stamp'
      });
      updateCSS(-45);
    });
    

    Updated CodePen #2

    看起来初始化后对$grid.packery('layout')的任何调用都会导致网格旋转时出现问题。调整窗口大小后,Packery似乎也会回忆起layout。因此,需要销毁并重新创建Packery实例,以便旋转的网格在窗口大小调整时正确显示(基本上,覆盖Packery的响应功能)。

    显然,这也不是最理想的解决方案 - 只是另一种解决方法。

    您可能需要在其GitHub页面上打开问题报告以获得进一步的帮助:https://github.com/metafizzy/packery/issues