Masonry различная ширина колонок

144
25 декабря 2019, 03:50

Необходимо получить структуру плиток как на изображении, используя библиотеку masonry.

Так же необходимо чтобы порядок плиток не нарушался.

Проблема в том, что не получается сделать такую структуру, как на изображении. Если я указываю размеры плиток 30% 40% 30%, они перестраиваются в неверном порядке. Но если указать 25% 50% 25%, то плитки становятся нужным образом.

css

* { box-sizing: border-box; }
        body { font-family: sans-serif; }
        /* ---- grid ---- */
        .grid {
            margin: 0 !important;
            background: #EEE;
        }
        /* clearfix */
        .grid:after {
            content: '';
            display: block;
            clear: both;
        }
        /* ---- grid-item ---- */
        .grid-sizer,
        .grid-item {
            width: 30%;
        }
        .grid-item {
            height: 120px;
            float: left;
            background: #D26;
            border: 2px solid #333;
            border-color: hsla(0, 0%, 0%, 0.5);
            border-radius: 5px;
        }
        .grid-item--width2 { 
            width:  40%; 
            height: 240px; 
        }

html

<div class="grid">
          <div class="grid-sizer"></div>
          <div class="grid-item"></div>
          <div class="grid-item grid-item--width2"></div>
          <div class="grid-item"></div>
          <div class="grid-item"></div>
          <div class="grid-item grid-item--width2"></div>
          <div class="grid-item"></div>
          <div class="grid-item"></div>
          <div class="grid-item grid-item--width2"></div>
          <div class="grid-item"></div>
        </div>

js

 $('.grid').masonry({
    itemSelector: '.grid-item',
    columnWidth: '.grid-sizer',
    gutter: 0, //Отключить отступы
    percentPosition: true, //Позиционирование в процентах
    horizontalOrder: true // горизонтальный порядок плиток (по порядку)
    });
Answer 1

На скорую руку. А почему бы не так?

* { box-sizing: border-box; } 
 
        body { font-family: sans-serif; } 
 
        /* ---- grid ---- */ 
 
        .grid { 
            margin: 0 !important; 
            background: #EEE; 
        } 
 
        /* clearfix */ 
        .grid:after { 
            content: ''; 
            display: block; 
            clear: both; 
        } 
 
        /* ---- grid-item ---- */ 
 
.grid-sizer{ 
 
} 
 
.grid-item { 
  float:left;  
  width:  30%;  
  height: 120px; 
  background: #D26; 
  border: 2px solid #333; 
  border-color: hsla(0, 0%, 0%, 0.5); 
  border-radius: 5px; 
} 
 
.grid-item--width2 {  
  float: left; 
  width:  40%;  
  float: center; 
  height: 240px;  
  background: #D26; 
  border: 2px solid #333; 
  border-color: hsla(0, 0%, 0%, 0.5); 
  border-radius: 5px; 
} 
.item{ 
  height: 33%; 
 
}
<div class="grid"> 
  <div class="grid-item"> 
    <div class="item">1.1</div> 
    <div class="item">1.2</div> 
    <div class="item">1.3</div> 
  </div> 
 
  <div class="grid-item--width2"> 
    <div class="item">21</div> 
    <div class="item">22</div> 
    <div class="item">23</div> 
  </div> 
 
  <div class="grid-item"> 
    <div class="item">31</div> 
    <div class="item">32</div> 
    <div class="item">33</div> 
  </div> 
</div>

READ ALSO
Кастомизация компонента vue-select

Кастомизация компонента vue-select

Я использую компонент https://sagalbotgithub

131
select и hls.js

select и hls.js

Есть select и вывод трансляции при помощи html5 плеера и hlsjs

104
[].slice.call(arguments) не копирует значение в массив

[].slice.call(arguments) не копирует значение в массив

Имеется простой пример работы функции логирования:

119