Возможно ли это с помощью flexbox

Я перепробовал все, что знаю в css, чтобы заставить этот макет работать, мне не удалось. Возможно ли вообще сделать эти макеты (разные разрешения) с помощью flexbox.

Это легко с поплавком, но я не могу этого сделать с флексом. Предложения?

Возможно ли это с помощью flexbox

Фрагмент:

*{box-sizing:border-box;}
#container {
display: flex;
width: 500px;
flex-wrap: wrap;
}
#green{background: green; width: 70%; height: 100px}
#yellow{background: yellow; width: 30%; height: 200px;}
#red{background: red; width: 70%; height: 70px;}

@media screen and (max-width: 600px){
#green{width: 100%;}
#yellow{width: 50%; order: 3}
#red{width: 50%}
}
<div id = "container">
  <div id = "green"></div>
  <div id = "yellow"></div>

  <div id = "red">^^^^ this space is the issue</div>
</div>

"белый" фрейм div - это гибкий контейнер, который я пытаюсь заставить сделать это поведение, в то время как мне нужно, чтобы у него была динамическая высота, потому что "желтый" и "красный" div являются динамическим содержимым, которое растет "вниз". Мне все еще было бы очень интересно узнать, как бы вы это сделали, если бы была определена (белая) высота контейнера?

Dellirium 11.06.2018 10:40

Flexbox работает с так называемыми «гибкими линиями», которые ведут себя аналогично строкам текста, содержащим строчные блоки. Каждый элемент относится только к одной строке, его можно растянуть до своей высоты, но он не может занимать несколько строк. Итак, краткий ответ на ваш вопрос: «Нет, это невозможно». Но вы можете сымитировать это, переключая flex-direction из строки в столбец и настраивая order элементов с помощью Media Query.

Ilya Streltsyn 11.06.2018 11:53
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
2
145
5

Ответы 5

Я бы использовал собственный макет сетки w3c css, который сейчас поддерживается большинством навигаторов. Сетка CSS позволяет устанавливать выравнивание по горизонтали и вертикали.

«Как и таблицы, макет сетки позволяет автору выровнять элементы по столбцам и строкам. Однако с сеткой CSS можно или проще сделать гораздо больше макетов, чем с таблицами. Например, дочерние элементы контейнера сетки могут позиционироваться так, чтобы они на самом деле перекрытие и слой, аналогично позиционированным элементам CSS. "

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout Вы найдете много видео в CSS-сетке

Да, с сеткой это легко сделать, как и с float, цель - сделать это с помощью гибкости, или, скорее, цель - посмотреть, возможно ли это сделать с помощью гибкости.

Dellirium 11.06.2018 11:21

Посмотрим, поможет ли это

* {
  margin: 0
}

.topBox,
.leftBox,
.rightBox {
  padding: 5px;
}

.topBox {
  background: green
}

.leftBox {
  background: red
}

.rightBox {
  background: yellow
}

.row {
  display: flex
}

.leftBox,
.rightBox {
  width: 50%;
  box-sizing: border-box;
}

@media (min-width: 768px) {
  .wrapper {
    position: relative;
    padding-right: 30%;
    min-height: 100vh;
  }
  .rightBox {
    position: absolute;
    right: 0;
    top: 0;
    bottom: 0;
    overflow: auto;
    width: 30%;
  }
  .leftBox {
    width: 100%
  }
}
<div class = "wrapper">
  <div class = "topBox">
    It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here,
    content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various
    versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
  </div>
  <div class = "row">
    <div class = "leftBox">
      It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here,
      content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various
      versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
    </div>
    <div class = "rightBox">
      It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here,
      content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various
      versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
    </div>
  </div>
</div>

Я не могу принять это как решение, хотя должен сказать «А» за усилия. Мне не нужно, чтобы это «решало», это вопрос «можно ли это сделать с помощью гибкости». Мошенничество с абсолютным, я полагаю, пока не сделаю это с помощью flex, чтобы вы получили положительный голос, но не могу пометить его как решение: P Его легко решить с помощью простого числа с плавающей запятой, или, как вы сами, я пытаюсь решить это "чисто "при этом придерживаясь гибкости, потому что мы используем гибкость в нашем проекте для управления потоком, а не сеткой, таблицами или плавающей точкой.

Dellirium 11.06.2018 11:41

@Dellirium Второй макет без него не обойтись, сначала я подумал, что можно, но нет. Другой способ - повернуть контейнер, а затем настроить его дочерние элементы.

VXp 11.06.2018 11:50

@VXp, тогда я думаю, ответ - "это невозможно сделать с помощью flexbox"

Dellirium 11.06.2018 12:28

@Dellirium Боюсь, что нет.

VXp 11.06.2018 12:32

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

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

#container {
  display: flex;
  flex-flow: column wrap;
  position: relative;
  width: 500px;
  height: 500px;
  padding: 5px;
  border: 2px solid;
}

#container > div {
  margin: 5px;
  border: 2px solid;
}

#green {background: green; flex: 0 1 calc(50% - 10px); position: relative}
#red {background: red; flex: 0 1 calc(50% - 10px)}
#yellow {background: yellow; flex: 1}

@media (max-width: 600px) {
  #green {flex: 1}
  #red {width: calc(50% - 15px); height: calc(50% - 5px); position: absolute; left: calc(50%); bottom: 5px}
  #yellow {flex: initial; width: calc(50% - 10px); height: 50%}
}
<div id = "container">
  <div id = "green">Green</div>
  <div id = "red">Red ^^^^ this space is the issue</div>
  <div id = "yellow">Yellow</div>
</div>

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

Dellirium 11.06.2018 12:33

Да, это возможно с гибкой коробкой. То, что вы хотите сделать, похоже:

Макет 1:

Разделите Макет на два наименования - левый контейнер и правый контейнер, где зеленая коробка и красная коробка будут в левый контейнер, и поместите желтая коробка в правый контейнер. И примените display: flex to layout, чтобы добиться этого идеально.

.container {
  display: flex;
  padding: 10px;
  flex-wrap: wrap;
  justify-content: space-between;
}
.left-container {
  width: 60%;
  min-height: 400px;
}
.green-box, .red-box, .yellow-box {
  width: 100%;
  margin-bottom: 1%;
}
.green-box {
  background: green;
  height: 50%;
}
.red-box {
  background: red;
  height: 49%;
}
.right-container {
  width: 39%;
  min-height: 400px;
}
.yellow-box {
  background: yellow;
  height: 100%;
}
<div class = "container">
  <div class = "left-container">
    <div class = "green-box"></div>
    <div class = "red-box"></div>
  </div>
  <div class = "right-container">
    <div class = "yellow-box"></div>
  </div>
</div>

Однако не поддерживает другой макет

Dellirium 11.06.2018 12:31

@Dellirium Вы имеете в виду другую раскладку с двумя рядами? Здесь - ссылка на второй макет :)

prasanth kumar lalapeta 11.06.2018 13:32

Элементы Flexbox, такие как inline-блоки и в отличие от элементов Grid и float, не могут охватывать несколько строк элементов. Вот почему единственный способ получить нужный макет с помощью Flexbox - это использовать разные направления гибкости - столбец для широких экранов и ряд для узкого экрана. Направление изгиба столбца, в свою очередь, требует, чтобы высота контейнера была известна для правильного распределения элементов между столбцами.

*{box-sizing:border-box;}
#container {
display: flex;
width: 500px;
flex-wrap: wrap;
flex-direction: column;
height: 300px;
}
#green{background: green; width: 70%; height: 100px; }
#yellow{background: yellow; width: 30%; height: 200px; }
#red{background: red; width: 70%; height: 70px; }

@media screen and (max-width: 600px){
#container { flex-direction: row; max-width: 100%; height: auto; }
#green{width: 100%; }
#yellow{width: 50%; }
#red{width: 50%; height: auto; }
}
<div id = "container">
  <div id = "green"></div>
  <div id = "red"></div>
  <div id = "yellow"></div>
</div>

VXp предложил подобное решение, хотя, в конечном итоге, фиксированная высота столбца не является вариантом, вся цель этого макета состоит в том, чтобы позволить как красным, так и желтым контейнерам расти бесконечно, при этом оба они сохраняются «около начала» контейнера для легкий доступ. Подумайте о сообщениях в блогах и новостях или о двух любых других информационных списках с примерно равными значениями. Однако голосование за усилия. Кажется, это просто невозможно сделать с гибкостью, и мы, вероятно, должны оставить все как есть.

Dellirium 11.06.2018 16:52

Другие вопросы по теме