Макет с 3 колонками разных размеров, используя Flex - PullRequest
0 голосов
/ 25 июня 2018

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

Для построения этого макета я использовал 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;
}

Код работает, но есть некоторые хитростиЯ хотел бы исправить.

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

  2. остальное пространство теперь увеличивается по обе стороны от контейнеров col*Ccon.Вместо этого я хотел бы расти только на левой стороне col1Ccon и на правой стороне col3Ccon.Поэтому я бы хотел, чтобы содержимое сайта (col1Ccon + col2Ccon + col3Ccon) всегда оставалось в центре страницы, а какие изменения представляют собой «границы», которые растут и уменьшаются.

I 'Я застрял и любые предложения с благодарностью.Спасибо:)

1 Ответ

0 голосов
/ 08 июля 2018

Причина, по которой все ваши столбцы имеют одинаковую ширину, в том, что вы дали flex: 1 классу col.В этом случае это означает, что у каждого столбца (который является всеми из них) есть одна треть экрана, доступного для них.Что вы можете сделать, это удалить свойство flex из класса col и вместо этого использовать его в области действия селекторов id столбцов.Поэтому в приведенном ниже коде я поместил свойство flex в селекторы идентификатора, с небольшой разницей, что второй столбец получает свойство 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;
  }
}

Что касается второго вопроса

...