Мой Справочник | CSS3 | flex и block

Кратко:

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

flex-grow: 0* | 1 | 2 | 3 ...; /* Это свойство определяет, какую часть от оставшегося свободного пространства во флекс-контейнере займёт флекс-элемент. Свободное пространство = Ширина контейнера - контент всех флекс элементов во флекс-контейнере(расчитывается пропорционально). 0 - по ум*, ужимаются под контент. AКТУАЛЬНО ПРИ flex-wrap: wrap, когда нужно чтобы переносимый на новую строчку элемент растягивался по ширине, которую можно задавать с помощью этого свойства */
flex-shrink: 0 | 1* | 2 | ...; /* "Ужимание" флекс-элементов (на сколько ужмётся флекс-элемент, если ширина флекс-контейнера будет меньше ширины флекс-элемента). 0 - отмена ужимания, 1 - по ум* ужимаются. РАБОТАЕТ ТОЛЬКО с flex-wrap: nowrap; Лучше оставлять по ум* 1, или делать 0 когда нужно*/
flex-basis: 100% | 200px | auto* ...; /* Значение базового размера элемента вдоль ФЛЕКС-оси, если для row записывать это значение в px, то при flex-shrink: 0;, это будет являться значением мин. ширины. auto - по ум* (без базового значения) */

flex-basis при column действует на ВЫСОТУ, а не на ширину (вдоль флекс-оси)


flex:: flex-grow | flex-shrink | flex-basis; /* Краткая запись */

/* Приемлимые варианты: */
flex:: 0 0 150px; /* Фиксированный размер элементов по базису (без растяжений и сжатий) */
flex:: 0 0 33.333%; /* Относительный размер */
flex:: 1 0 150px; /* Занимают равную ширину, ужимаются до базиса */
flex:: 0 1 auto; /* По ум* (не растягиваются, ужимаются) */
flex:: 0 0 0; /* Ужмётся до минимума, базис не задан */
flex:: 1; /* Если не указывать shrink и basis (то будут подставляться значения для shrink: 1, для basis: 0%) */

flex-grow по идее должен быть пропорционален flex-basis, чтобы при сжатии контейнера сохранялась видимость пропорций.

Адаптивность на flex

Свойство flex-basis выступают в роли точек останова, определяющих, когда элементы переносятся на новые строки. Вы можете использовать значение свойства flex-basis для имитации точек останова. Например, если существует три элемента, которые вы хотите отобразить друг рядом с другом, а ширина страницы превышает 600 пикселов, можно присвоить свойству flex-basis каждого из них значение 200px. Если окно браузера станет уже 600 пикселов, то первый и второй элементы будут располагаться рядом друг с другом, а третий будет перенесен на новую строку. Если окно браузера станет уже 400 пикселов, то каждый из элементов будет находиться на отдельной строке, располагаясь друг над другом.

flex & block-model
Ширина, высота, внутренние отступы и рамки для флекс-контейнеров и флекс-элементов работают как обычно: общий размер элементов складывается из этих компонентов. Это поведение так же можно менять с помощью свойства box-sizing.

Есть и несколько важных отличий:
1. Флекс-элементы, в отличие от блочных элементов, не растягиваются на всю ширину контейнера по умолчанию;
2. На флекс-элементы не действует свойство float.
.flex-sample {
  width: 100px;
  height: 100px;
}
1
2
3
margin и флекс-элементы
1. внешние отступы не схлопываются, ни по горизонтали, ни по вертикали;
2. внешние отступы не выпадают, ни из флекс-контейнера, ни из флекс-элементов;
3. значение auto получило премию журнала Форбс в номинации «Самое влиятельное значение CSS-свойства внутри флекс-контейнера».
При значении auto свойство justify-content, align-items и align-self ломается
.flex-sample1 {
  margin-left: auto;
}
.flex-sample2 {
  margin-right: auto;
}
.flex-sample3 {
  margin-left: auto;
  margin-right: auto;
}
1
2
3
1
2
3
1
2
3
flex-grow
Если внутри флекс-контейнера по главной оси остаётся свободное место, то мы можем попросить флекс-элемент, чтобы он увеличился и занял это место. Это делается с помощью свойства flex-grow, которое можно назвать «коэффициентом флекс-жадности» флекс-элемента.
Свойство flex-grow принимает неотрицательные числовые значения, его значение по умолчанию — 0. Если значение flex-grow равно нулю, то флекс-элемент «не претендует» на оставшееся свободное место во флекс-контейнере и не будет увеличиваться, чтобы занять это место. Если значение flex-grow больше нуля, то флекс-элемент будет увеличиваться, «захватывая» оставшееся свободное место. Получается, что базовый размер — это исходный размер флекс-элементов до применения flex-grow.
flex-grow: 1; растягивает флекс-элемент на всю ширину, очень убобно при адаптивности и переносах элементах на новые строки
.flex-sample1 {
  ...
  flex-grow: 1;
}
.flex-sample2 {
  ...
  flex-grow: 1;
}
.flex-sample1, .flex-sample2 {
  ...
  flex-grow: 1;
}
.flex-sample1 {
  ...
  flex-grow: 1;
}
.flex-sample2 {
  ...
  flex-grow: 3;
}
1
2
1
2
1
2
1
2
flex-basis
Размер элемента вдоль ФЛЕКС-ОСИ

В первом примере базис переопределяет ширину, во втором - высоту.

Может быть как высотой, так и шириной соответственно. Если для row записывать это значение в px, то при flex-shrink: 0;, это будет являться значением мин. ширины
.flex-cont {
  display: flex;
  flex-direction: row;
  align-items: center;
  border: 1px solid #000;
  width: 100%;
  height: 500px;
}
.flex-cont2 {
  ...
  flex-direction: column;
  ...
}
.flex-sample {
  width: 50px;
  height: 50px;
  flex-basis: 100%;
  color: #fff;
  font-size: 25px;
  background-color: maroon;
  border: 3px solid yellow;
  margin: 10px;
}
1
2
flex-shrink
Если сумма базовых размеров флекс-элементов больше, чем размер флекс-контейнера, то возникает отрицательное пространство.
Механизм перераспределения работает не только для свободного места, но и для отрицательного пространства. Флекс-элементы умеют распределять отрицательное пространство между собой и сжиматься.
За уменьшение флекс-элементов отвечает свойство flex-shrink, которое можно назвать «коффициентом сжатия».
Свойство flex-shrink принимает неотрицательные числовые значения, его значение по умолчанию — 1.
Если значение flex-shrink больше нуля, то флекс-элемент будет уменьшаться, «впитывая» часть отрицательного пространства, если оно существует.
Если значение flex-shrink равно нулю, то флекс-элемент уменьшаться не будет.
Флекс-элементы стараются быть максимально «гибкими» и не выпадать из своего контейнера, поэтому у flex-shrink значение по умолчанию равно 1. Но если задавать нулевые значения для коэффициента сжатия, то выпадения элементов добиться можно.
flex-shrink: 0; не сужает флекс-элемент, если внутри него задан текст при малой ширине, будет адаптация под этот текст
.flex-sample1,
.flex-sample2
{
...
  flex-shrink: 0;
}
.flex-sample2 {
...
  flex-shrink: 1;
}
.flex-sample1,
.flex-sample2
{
...
  flex-shrink: 1;
}
.flex-sample1,
.flex-sample2
{
...
  flex-shrink: 3;
}

Это свойство наподобие flex-grow, только действует оно не на расширение размера элемента, а его сжатие, это актуально когда флекс-элементы "вылазят" из флекс контейнеров

Это блоки без overflow бы выпадали

1
2
1
2
1
2
1
2
Общая запись
Общая запись .flex-item {
  flex: 1 2 300px;
}
.flex-item {
  flex-grow: 1;
  flex-shrink: 2;
  flex-basis: 300px;
}
flex: initial; -> flex: 0 1 auto;
flex: auto;    -> flex: 1 1 auto;
flex: none;    -> flex: 0 0 auto;
flex: 1 0;     -> flex: 1 0 0%;
flex: 1;       -> flex: 1 1 0%;

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

flex-элементы столбом
Будет всегда расположение столбом
.flex-cont {
    display: flex;
    flex-wrap: wrap;
}
.flex-sample {
    min-height: 20px;
    flex-basis: 100%;
}
1
2
3
Заголовок с описанием
<h1 class="card-title">
  <span class="card-main">Кекс против флекса </span>
  <span class="card-note">история взросления </span>
</h1>

card {
  margin-bottom: 20px;
  line-height: 1.3;
}
.card-title-note {
  font-size: 14px;
  color: maroon;
}
.card-title {
    display: flex;
    flex-wrap: wrap;
    margin-top: 0;
    align-items: flex-end;
}

.card-title span {
    background-color: #c8dcff;
    border: 1px solid #999999;
}
.card-title-main {
    flex-grow: 1;
}
     

Кекс против флекса история взросления

Кекс против флекса флекса флекса флекса история взросления

img/flex-maket.jpg