Flex-контейнер с четырьмя делителями, нужно три столбца, второй столбец с двумя строками - PullRequest
0 голосов
/ 26 октября 2018

Для раздела на странице я пытаюсь отобразить два прямоугольных элемента div, сложенных между двумя квадратными элементами div с обеих сторон размером с высоту двух составных элементов div, внутри этих элементов div есть теги img.

Я использую эту разметку, потому что на мобильном устройстве я хочу иметь возможность размещать их в неупакованном гибком ряду с родительским элементом overflow: hidden, чтобы использовать код смахивания для преобразования оси X.У меня проблемы с созданием этого макета для рабочего стола с этой разметкой с помощью flexbox (без сетки, нужно поддерживать IE11).Кто-нибудь делал этот макет с этой разметкой?Спасибо.

 <div class="flex_container">
   <div class='flex_child square'>
     <img...>
   </div>
   <div class='flex-child rect'>
     <img...>
   </div>
   <div class='flex-child rect'>
     <img...>
   </div>
   <div class='flex-child square'>
     <img...>
   </div>
 </div>

Example by image

Ответы [ 5 ]

0 голосов
/ 26 октября 2018

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

.flex_container {
  height: 100vh; /*adjust this value like you want*/
  display: flex;
  flex-direction: column;
  flex-wrap:wrap;
}
.flex_child {
  background:purple;
  border:2px solid #fff;
  box-sizing:border-box;
  width:calc(100% / 3);
}
.square {
  flex:1 1 100%;
}
.rect {
  flex:1 1 47%;
}

body {
  margin: 0;
}
<div class="flex_container">
  <div class='flex_child square'></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child square'></div>
</div>

А если вам нужна лучшая поддержка браузера, вы можете использовать float / inline-block, немного подкорректировав классы, создавая 2 квадрата в начале:

.flex_container {
  height: 100vh; /*adjust this value like you want*/
}
.flex_child {
  background:purple;
  border:2px solid #fff;
  box-sizing:border-box;
  width:calc(100% / 3);
  height:100%;
}
.square:nth-child(1) {
  float:left;
}
.square:nth-child(2) {
  float:right;
}
.rect {
  display:inline-block;
  height:50%;
  vertical-align:top;
}

body {
  margin: 0;
}
<div class="flex_container">
  <div class='flex_child square'></div>
  <div class='flex_child square'></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child rect  '></div>
</div>

Если вы также не можете изменить классы, используйте отрицательный запас для исправления позиции последнего элемента:

.flex_container {
  height: 100vh; /*adjust this value like you want*/
}
.flex_child {
  background:purple;
  border:2px solid #fff;
  box-sizing:border-box;
  width:calc(100% / 3);
  height:100%;
}
.square:first-child {
  float:left;
}
.square:last-child {
  float:right;
  margin-top:-50vh;
}
.rect {
  display:inline-block;
  height:50%;
  vertical-align:top;
}

body {
  margin: 0;
}
<div class="flex_container">
  <div class='flex_child square'></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child square'></div>
</div>
0 голосов
/ 26 октября 2018

Если вы добавите второй контейнер для управления двумя rect, это станет проще.Вы можете управлять height and width из square, чтобы сделать их квадратными, вместо динамической ширины.

.flex-container {
  	display: flex;
  	height: 150px;
}
.container>*, .square {
  background-color: purple;
}

.flex-child {
    flex:1;
    display: inline-flex;
    margin: 2px
}

.square { flex-basis: 25%; }
.container {
    flex-direction: row;
    flex-basis: 50%
}
.container > * { 
  flex-basis: 50%; 
}
.container div:first-child {
	margin-right: 4px 
}

@media (max-width: 767px) {
  .container {
      flex-direction: column;
      flex-basis: 33.333%
  }
  .container div:first-child{
      margin: 0 0 4px 0
   }	
}
<div class="flex-container">
   <div class='flex-child square'></div>
   <div class='flex-child container'>
   		<div class='rect'></div>
   		<div class='rect'></div>
   </div>
   <div class='flex-child square'></div>
 </div>

Или: (нажмите full page, чтобы увидеть изменения)

.flex-container {
  	display: flex;
  	height: 150px;
}
.container>*, .square {
  background-color: purple;
}

.flex-child {
    flex:1;
    display: inline-flex;
    margin: 2px
}

.square { flex-basis: 25%; }
.container {
    flex-direction: column;
    flex-basis: 33.333%
}
.container > * { 
  flex-basis: 50%; 
}
.container div:first-child {
	margin: 0 0 4px 0
}

@media (max-width: 767px) {
	.square, .container>* {
    	height: 100px;
    }
	.flex-container {
    	height: auto;
    	flex-direction: column;	
    }
  	.rect {
      flex-direction: column;
      flex-basis: 50%
  	}
  	
}
    
<div class="flex-container">
   <div class='flex-child square'></div>
   <div class='flex-child container'>
      <div class='rect'></div>
      <div class='rect'></div>
   </div>
   <div class='flex-child square'></div>
 </div>
0 голосов
/ 26 октября 2018

Делая некоторые основные предположения о вашем контенте, но вы можете использовать абсолютное позиционирование для выравнивания вещей.По сути, вы можете вытащить средние два элемента из потока документов и имитировать укладку посредством позиционирования.

В этом случае, если значение выше 767px, вся строка находится в потоке документа.Когда ниже 767px, мы переставляем внутренние два элемента и устанавливаем контейнер на justify-content: space-between, чтобы обеспечить визуальное пространство.

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

.flex_container {
  position: relative;
  display: flex;
}

.flex_item {
  flex: 1;
  height: 120px;
  border: 1px solid orange;
  padding: 40px;
  background-color: red;
  text-align: center;
}

@media (max-width: 767px) {
  .flex_container {
    justify-content: space-between;
  }  

  .flex_item {
    padding: 20px;
  }
  
  .square {
    flex: 0 1 33%;
  }
  
  .rect {
    position: absolute;
    left: calc(100% / 3);
    width: calc(100% / 3);
    height: 50%;
  }
  .rect.three {
    top: 50%;
  }
}
<div class="flex_container">
  <div class="one flex_item square">
    One
  </div>
  <div class="two flex_item rect">
    Two
  </div>
  <div class="three flex_item rect">
    Three
  </div>
  <div class="four flex_item square">
    Four
  </div>
</div>

Опять же, будьте осторожны - это предполагает, что вы можете контролировать высоту контейнера и размеры содержимого внутри.Если нет, то этот тип макета довольно легко распадается.Как указано в других комментариях, если вы хотите больше структуры и стабильности, было бы лучше обернуть внутренние элементы другим flex-элементом с flex-direction: column.Просто знайте риски!

0 голосов
/ 26 октября 2018

Попробуйте

   .flex_container{
      display:flex;
      flex-direction: row;
      border: 1px solid red;

    }
    .flex_container2{
      display:flex;
      flex-direction:column;
      border: 1px solid green;
    }  
    .flex-child{
      border: 1px solid blue;
     } 
 <div class="flex_container">
   <div class='flex_child square'>A</div>
   <div class="flex_container2">
       <div class='flex-child rect'>B</div>
       <div class='flex-child rect'>C</div>
   </div>
   <div class='flex-child square'>D</div>
 </div>

Я думаю, вам нужен второй flex-контейнер.

0 голосов
/ 26 октября 2018

ОБНОВЛЕНИЕ:

Я обновляю свой ответ для лучшего решения на основе flex, а не float.Вы должны рассматривать свою обертку как направление столбца, см. код ниже:

* {
  box-sizing: border-box; /*reset box sizing for all elements*/
}

.flex_container {
  height: 150px; /*this is for example, you can set your height like 100vh or 100%*/
  display: flex;
  flex-flow: column wrap;
}
.flex_child {
  height: 100%;
  border: 1px solid #012;
}
.mid {
  height: 50%;
}
<div class="flex_container">
  <div class='flex_child'>_1_</div>
  <div class='flex_child mid'>_2_</div>
  <div class='flex_child mid'>_3_</div>
  <div class='flex_child'>_4_</div>
</div>

Из-за высоты 50% .mid класса _2_ и _3_ не обернуты, так что можете использовать их по своему желанию с простым и менеекод.

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