У меня есть раздел сайта, который должен содержать три элемента рядом. Каждый элемент имеет минимальную ширину. Если ширина экрана недостаточна для размещения всех трех элементов, те, которые не умещаются, переходите к новой строке.
Для построения этого макета я использовал Flex. Код.
html:
<main id='main'>
<div id='firstRow' class='row'>
<div id='col1C' class='col'>col1C title
<div id='col1Ccon'>col1Ccon content</div>
</div>
<div id='col2C' class='col'>col2C title
<div id='col2Ccon'>col2Ccon content</div>
</div>
<div id='col3C' class='col'>col3C title
<div id='col3Ccon'>col3Ccon content</div>
</div>
</div>
</main>
css:
:root {
--w1Col: 478px;
--w2Col: 370px;
--w3Col: 350px;
--wSum3: calc(var(--w1Col) + var(--w2Col) + var(--w3Col));
}
html {
/*height: 100%;*/
}
body {
margin: 0;
font-size: 9pt;
font-family: 'Roboto', sans-serif;
font-weight: 300;
background-color: whitesmoke;
height: 100%;
display: flex;
flex-direction: column;
}
/***************************************************************
* Layout first row
*/
#main {
background-color: white;
/*border: 4px solid red;*/
color: black;
height: 100%;
flex-grow: 1; /* ability for a flex item to grow if necessary */
flex-shrink: 0; /* ability for a flex item to shrink if necessary */
flex-basis: auto; /* defines the default size of an element before the remaining space is distributed */
}
#firstRow {
background-color: white;
/*border: 1px solid black;*/
margin: 10px;
padding: 10px;
display: flex;
flex-direction: row; /* colums layout */
flex-wrap: wrap; /* wrap in multiple lines if it's necessary */
/*min-width: var(--wSum3);*/
/*justify-content: flex-end; defines the alignment along the main axis */
}
#firstRow .col {
/*border: 1px solid black;*/
flex: 1;
padding: 5px;
text-align: center;
}
#col1C {
background-color: green;
width: var(--w1Col);
min-width: var(--w1Col);
order: 1; /* column order */
flex-basis: 40%;/*var(--w1Col); column width */
justify-content: flex-end;
}
#col2C {
background-color: blue;
width: var(--w2Col);
min-width: var(--w2Col);
order: 2; /* column order */
flex-basis: 35%; /* var(--w2Col); column width */
justify-content: flex-end;
}
#col3C {
background-color: red;
width: var(--w3Col);
min-width: var(--w3Col);
order: 3; /* column order */
flex-basis: 25%; /*var(--w3Col); column width */
justify-content: flex-end;
}
#col1Ccon, #col2Ccon, #col3Ccon {
/*border: 1px solid black;*/
margin: 0 auto; /* center content */
}
#col1Ccon {
width: var(--w1Col);
background-color: lightgreen;
height: 200px;
}
#col2Ccon {
width: var(--w2Col);
background-color: lightblue;
height: 150px;
}
#col3Ccon {
width: var(--w3Col);
background-color: salmon;
height: 200px;
}
Код работает, но есть некоторые хитрости, которые я хотел бы исправить.
все 3 столбца имеют одинаковую ширину, и я хотел бы иметь возможность выбирать эту ширину. Это потому, что первый элемент имеет минимальную ширину больше, чем два других, поэтому край меньше и эстетически некрасиво. Смотрите тот же пример, менял только цвета
оставшееся пространство теперь увеличивается с обеих сторон контейнеров col*Ccon. Вместо этого я хотел бы расти только на левой стороне col1Ccon и на правой стороне col3Ccon. Поэтому я хотел бы, чтобы содержимое сайта (col1Ccon + col2Ccon + col3Ccon) всегда оставалось в центре страницы и какие изменения являются «границей», которые увеличиваются и уменьшаются.
Я застрял, и мы будем благодарны за любые предложения. Спасибо :)
Пожалуйста, публикуйте изображения желаемых результатов, потому что я тоже не понимаю, что вам нужно.
Вы пробовали медиа-запросы? Я нашел код, но он мог исчезнуть -> codepen.io/estelle/pen/brDpB






Причина, по которой все ваши столбцы имеют одинаковую ширину, заключается в том, что вы дали flex: 1 классу col. В данном случае это означает, что в каждом столбце (а это все они) есть одна треть экрана, доступная для них. Что вы можете сделать, так это удалить свойство flex из класса col и вместо этого использовать его в области селекторов id столбцов. Итак, в приведенном ниже коде я помещаю свойство flex в селекторы id с небольшой разницей в том, что второй столбец получает свойство flex-grow, равное 0 (первое значение в свойстве flex). Первый столбец, как вы сказали, немного больше, поэтому он занимает немного больше места.
Затем, чтобы содержание было центрировано: первая часть - присвоить этому второму столбцу значение flex-grow, равное 0, чтобы он оставался посередине. Два других столбца действительно увеличиваются, и с автоматическим margin на одной стороне столбцов содержимого он будет расти с одной стороны, а столбец содержимого будет выровнен либо по левому, либо по правому краю, чтобы дать представление о центрированном содержимом. Это только для экрана большего размера, для экранов меньшего размера вы можете использовать медиа-запросы для правильного выравнивания контента.
В итоге ваш код может выглядеть так. Я не знаю, было ли это именно то, что вы имели в виду, но вы можете поиграть с этим и посмотреть, работает ли это.
:root {
--w1Col: 478px;
--w2Col: 370px;
--w3Col: 350px;
--wSum3: calc(var(--w1Col) + var(--w2Col) + var(--w3Col));
}
body {
margin: 0;
font-size: 9pt;
font-family: 'Roboto', sans-serif;
font-weight: 300;
background-color: whitesmoke;
height: 100%;
display: flex;
flex-direction: column;
}
/***************************************************************
* Layout first row
*/
#main {
background-color: white;
color: black;
height: 100%;
flex: 1 0 auto;
width: 100%;
}
#firstRow {
background-color: white;
margin: 10px;
padding: 10px;
display: flex;
flex-direction: row; /* colums layout */
flex-wrap: wrap; /* wrap in multiple lines if it's necessary */
}
#firstRow .col {
padding: 5px;
text-align: center;
}
#col1C {
background-color: green;
order: 1; /* column order */
flex: 1 1 var(--w1Col);
}
#col2C {
background-color: blue;
order: 2; /* column order */
flex: 0 1 var(--w2Col);
}
#col3C {
background-color: red;
order: 3; /* column order */
flex: 1 1 var(--w3Col);
}
#col1Ccon {
max-width: var(--w1Col);
background-color: lightgreen;
height: 200px;
margin: 0 0 0 auto;
}
#col2Ccon {
max-width: var(--w2Col);
background-color: lightblue;
height: 150px;
margin: 0 auto;
}
#col3Ccon {
max-width: var(--w3Col);
background-color: salmon;
height: 200px;
margin: 0 auto 0 0;
}
@media only screen and (max-width: 1268px) {
#col2C {
flex-grow: 1;
}
#col2Ccon {
margin: 0 auto 0 0;
}
#col3Ccon {
margin: 0 auto;
}
}
@media only screen and (max-width: 908px) {
#col1Ccon {
margin: 0 auto;
}
#col2Ccon {
margin: 0 0 0 auto;
}
#col3Ccon {
margin: 0 auto 0 0;
}
}
@media only screen and (max-width: 780px) {
#col2Ccon, #col3Ccon {
margin: 0 auto;
}
}
Что касается второго вопроса
Замените свою таблицу стилей, я могу решить вашу проблему
body {
margin: 0;
font-size: 9pt;
font-family: 'Roboto', sans-serif;
font-weight: 300;
background-color: whitesmoke;
}
#firstRow {
background-color: white;
margin: 10px;
padding: 10px;
display: flex;
flex-wrap: wrap;
}
#firstRow .col {
flex: 1;
padding: 5px;
text-align: center;
}
#col1C {
background-color: green;
}
#col2C {
background-color: blue;
}
#col3C {
background-color: red;
}
#col1Ccon, #col2Ccon, #col3Ccon {
margin: 0 auto;
}
#col1Ccon {
background-color: lightgreen;
height: 200px;
}
#col2Ccon {
background-color: lightblue;
height: 200px;
}
#col3Ccon {
background-color: salmon;
height: 200px;
}
Я не уверен, что понимаю, чего вы пытаетесь достичь, но я привел здесь упрощенный пример: codepen.io/wiiiiilllllll/pen/vrQzWX Это помогает?