Распределите элементы неравной высоты в два столбца - PullRequest
0 голосов
/ 22 декабря 2018

Это развитие этого вопроса с принципиальным отличием: элементы, которые должны быть распределены в два столбца, имеют неодинаковую высоту.Пожалуйста, не рассматривайте его как дубликат.

ЧТО Я ХОЧУ ДОСТИГАТЬ:

Учитывая неизвестное количество элементов примерно одинаковой, но не одинаковой высотыдолжно быть достигнуто следующее:

В макете рабочего стола:

  • элементы должны быть распределены в два столбца следующим образом:

    1 2

    3 4

    5 6

    и т. Д.

  • верхний элемент в правом столбце должен быть смещенот верхней границы контейнера на большем расстоянии, чем верхний элемент левого столбца, который должен выглядеть примерно так:

enter image description here

  • расстояния между элементами в одном столбце должны быть одинаковыми

На мобильном макете:

  • элементы должны оставатьсяв одном столбце, расположенном один под другим в их первоначальном порядке (1, 2, 3, 4 и т. д.)

ПРОБЛЕМА:

  • Если я попытаюсь решить эту проблему, назначив display: inline-block элементам, браузер попытается поместить каждую пару в отдельную строку;и каждая разница в их высоте приведет к неравному расстоянию между элементами одного столбца.Пример:

function fillGrid() {
  const container = document.querySelector('.container');
  const times = [...new Array(10)];
  times.forEach((garbage, index) => {
    const element = document.createElement('div');
    element.innerText = index + 1
    element.classList.add('grid-element');
    container.appendChild(element);
  });
}

fillGrid()
* {
  box-sizing: border-box;
}

.container {
  width: 60%;
  margin: auto;
  background: papayawhip;
  padding-bottom: 60px;
}

@media screen and (max-width: 600px) {
  .container {
    display: block;
  }
  
  .grid-element {
    width: 100%;
  }
  
}

.grid-element {
  display: inline-block;
  width: 48%;
  height: 100px;
  background: green;
  vertical-align: middle;
  margin-bottom: 20px;
}

.grid-element:nth-child(2) {
  margin-top: 60px;
}

.grid-element:nth-child(odd) {
  margin-right: 10px;
}
.grid-element:nth-child(even) {
  grid-column: 2/3;
}

/* Just to add some disorder to grid element heights */

.grid-element:nth-child(6) {
  height: 150px;
}

.grid-element:nth-child(7) {
  height: 200px;
}
<div class="container"></div>
  • Если я использую сетку CSS, браузер будет создавать неявные строки для каждой новой пары элементов, и результат будет визуально похожимк предыдущей попытке:

function fillGrid() {
  const container = document.querySelector('.container');
  const times = [...new Array(10)];
  times.forEach((garbage, index) => {
    const element = document.createElement('div');
    element.innerText = index + 1
    element.classList.add('grid-element');
    container.appendChild(element);
  });
}

fillGrid()
.container {
  display: grid;
  grid-template-column: 1fr 1fr;
  width: 60%;
  margin: auto;
  background: papayawhip;
  padding-bottom: 60px;
}

@media screen and (max-width: 600px) {
  .container {
    display: block;
  }
  
  .grid-element {
    width: 100%;
  }
  
  .grid-element:nth-child(2) {
    margin-top: 0;
  }
  
}

.grid-element {
  width: 90%;
  height: 100px;
  background: green;
  margin-bottom: 20px;
  font-size: 30px;
  font-weight: bold;
}

.grid-element:nth-child(2) {
  margin-top: 60px;
}

.grid-element:nth-child(odd) {
  grid-column: 1/2;
}
.grid-element:nth-child(even) {
  grid-column: 2/3;
}

/* Just to add some disorder to grid element heights */

.grid-element:nth-child(3) {
  height: 150px;
}

.grid-element:nth-child(6) {
  height: 150px;
}

.grid-element:nth-child(7) {
  height: 150px;
}
<div class="container"></div>
  • Когда я укажу, что все элементы должны находиться в одной строке сетки CSS, они располагаются друг над другом(как обсуждалось, без какого-либо решения, в этом вопросе SO )

Эта проблема, конечно, тривиально решается путем помещения элементов в два отдельных контейнера и последующего размещения этих двухконтейнеры относительно друг друга.Недостаток этого подхода заключается в том, что в мобильной компоновке эти контейнеры будут накладываться друг на друга, и порядок элементов будет меняться (вместо 1 2 3 4 5 6 это будет, скажем, 1 3 5 2 4 6.Конечно, нарисуйте два макета на одной странице и скройте один из них в зависимости от того, является ли это экраном рабочего стола или экрана мобильного устройства, но я бы предпочел не делать этого.

Есть ли чистое решение на основе CSS для этогопроблема?

1 Ответ

0 голосов
/ 23 декабря 2018

Я не думаю, что есть элегантное решение этой проблемы с использованием только CSS.Возможно, вам лучше использовать хорошо протестированную библиотеку JavaScript, такую ​​как Masonry , чтобы заставить это работать.Он хорошо справится с отзывчивым случаем, который вы упомянули, поскольку все элементы будут находиться в одном контейнере.

Вот демонстрация с макетом, аналогичным описанному вами: https://tympanus.net/Development/GridLoadingEffects/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...