Я перепробовал все, что знаю в css, чтобы заставить этот макет работать, мне не удалось. Возможно ли вообще сделать эти макеты (разные разрешения) с помощью 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>Flexbox работает с так называемыми «гибкими линиями», которые ведут себя аналогично строкам текста, содержащим строчные блоки. Каждый элемент относится только к одной строке, его можно растянуть до своей высоты, но он не может занимать несколько строк. Итак, краткий ответ на ваш вопрос: «Нет, это невозможно». Но вы можете сымитировать это, переключая flex-direction из строки в столбец и настраивая order элементов с помощью Media Query.






Я бы использовал собственный макет сетки w3c css, который сейчас поддерживается большинством навигаторов. Сетка CSS позволяет устанавливать выравнивание по горизонтали и вертикали.
«Как и таблицы, макет сетки позволяет автору выровнять элементы по столбцам и строкам. Однако с сеткой CSS можно или проще сделать гораздо больше макетов, чем с таблицами. Например, дочерние элементы контейнера сетки могут позиционироваться так, чтобы они на самом деле перекрытие и слой, аналогично позиционированным элементам CSS. "
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout Вы найдете много видео в CSS-сетке
Да, с сеткой это легко сделать, как и с float, цель - сделать это с помощью гибкости, или, скорее, цель - посмотреть, возможно ли это сделать с помощью гибкости.
Посмотрим, поможет ли это
* {
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 Второй макет без него не обойтись, сначала я подумал, что можно, но нет. Другой способ - повернуть контейнер, а затем настроить его дочерние элементы.
@VXp, тогда я думаю, ответ - "это невозможно сделать с помощью flexbox"
@Dellirium Боюсь, что нет.
Вы можете сделать что-то вроде этого и продолжить, второй макет требует некоторой помощи позиционирование:
* {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>контейнер вращается, я никогда бы не подумал об этом, лол, хотя я думаю, что это еще более взломано, чем добавление абсолютной позиции. В любом случае, я сделаю вывод, что без него этого не обойтись, и оставлю все как есть и проголосую за усилия. Ваше здоровье
Да, это возможно с гибкой коробкой. То, что вы хотите сделать, похоже:
Макет 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 Вы имеете в виду другую раскладку с двумя рядами? Здесь - ссылка на второй макет :)
Элементы 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 предложил подобное решение, хотя, в конечном итоге, фиксированная высота столбца не является вариантом, вся цель этого макета состоит в том, чтобы позволить как красным, так и желтым контейнерам расти бесконечно, при этом оба они сохраняются «около начала» контейнера для легкий доступ. Подумайте о сообщениях в блогах и новостях или о двух любых других информационных списках с примерно равными значениями. Однако голосование за усилия. Кажется, это просто невозможно сделать с гибкостью, и мы, вероятно, должны оставить все как есть.
"белый" фрейм div - это гибкий контейнер, который я пытаюсь заставить сделать это поведение, в то время как мне нужно, чтобы у него была динамическая высота, потому что "желтый" и "красный" div являются динамическим содержимым, которое растет "вниз". Мне все еще было бы очень интересно узнать, как бы вы это сделали, если бы была определена (белая) высота контейнера?