Перестройка макета flexbox для мобильного просмотра - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть 4 деления, которые я использую flexbox для выравнивания.При размере рабочего стола есть 3 столбца одинаковой ширины, причем первый и последний элементы div занимают всю высоту контейнера.Второй и третий делители располагаются вертикально посередине, каждый из которых занимает 50% высоты.Это нормально работает.

В мобильном размере я хочу, чтобы последний div был сверху и растягивал всю ширину контейнера.Затем я хочу, чтобы первый div выравнивался слева под верхним div и занимал 50% ширины и оставшейся высоты контейнера.

Проблема, с которой я столкнулся, заключается в том, что я хочу, чтобы второй и третий divвыровнять прямо под верхним div и занять оставшиеся 50% ширины, но расположить вертикально, чтобы каждый занимал 50% оставшейся высоты.

Я пытался изменить flex-direction в медиа-запросеи все остальное, что я могу думать, но это не работает.

* {
  margin: 0;
  padding: 0;
}

.box-wrapper {
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  height: 70vh;
  align-items
}

.boxa {
  background: red;
  flex: 0 0 100%;
  width: 33%;
}

.boxb {
  background: orange;
}

.boxc {
  background: lightgreen;
}

.boxb,
.boxc {
  flex: 0 0 50%;
  width: 33%;
}

.boxd {
  background: grey;
  flex: 0 0 100%;
  width: 33%;
}

@media (max-width: 700px) {
  .boxa {
    order: 2;
    width: 50%;
    flex: 0 0 75%;
  }
  .boxb {
    order: 3;
    width: 50%;
    flex: 0 0 37.5%;
  }
  .boxc {
    order: 4;
    width: 50%;
    flex: 0 0 37.5%;
  }
  .boxd {
    order: 1;
    flex: 0 0 25%;
    width: 100%;
  }
}
<div class="box-wrapper">
  <div class="boxa"></div>
  <div class="boxb"></div>
  <div class="boxc"></div>
  <div class="boxd"></div>
</div>

1 Ответ

0 голосов
/ 08 февраля 2019

С помощью flexbox трудно добиться нужного макета, поскольку flexbox плохо подходит для двумерных сеток.Он выделяется в одномерных сетках (размещение гибких элементов в строках или столбцов), но имеет ограниченную емкость в двумерных сетках (размещение гибких элементов в строках и столбцов).

Поскольку желаемый макет включает элементы, которые должны пересекать строки и столбцы, flex - не лучший вариант.С помощью CSS Grid ваш макет прост и легок.

jsFiddle demo

.box-wrapper {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;  /* 3 equal width columns */
  grid-template-rows: 1fr 1fr;         /* 2 equal height rows */
  height: 70vh;
  grid-column-gap: 5px;
  grid-row-gap: 5px;
  padding: 5px;
  grid-template-areas: " first second last " 
                       " first  third last ";
}

.boxa { grid-area: first; background: red; }
.boxb { grid-area: second; background: orange; }
.boxc { grid-area: third; background: lightgreen; }
.boxd { grid-area: last; background: grey; }

@media ( max-width: 700px) {
  .box-wrapper {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 1fr 1fr 1fr;
    grid-template-areas: "  last   last  "
                         " first  second " 
                         " first   third ";
  }
}

* { margin: 0; padding: 0; }

/* for placing and styling numbers only */
.box-wrapper > div {
  font-size: 1.5em; display: flex; align-items: center; justify-content: center; }
<div class="box-wrapper">
  <div class="boxa">1</div>
  <div class="boxb">2</div>
  <div class="boxc">3</div>
  <div class="boxd">4</div>
</div>

Дополнительная информация:

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