Продолжаем изучение нетрадиционного CSS. В данной статье собрано еще больше свойств для работы с Flexbox-лейаутами. Читаем, вникаем и используем!
В прошлый раз мы разобрали основные свойства Flexbox-лейаутов: flex-direction, justify-content, align-items и align-self.
Данные свойства являются мощным инструментом создания базовых лейаутов. Но придет время, когда вы начнете создавать веб-страницы, используя Flexbox-ы, и тогда вам придется узнать больше, чтобы раскрыть их потенциал на максимум.
Давайте углубимся в определение размеров Flexbox и то, как мы сможем использовать это для построения адаптивных и красивых лейаутов.
Свойство #1: Flex-Basis
В предыдущей статье большая часть рассмотренных свойств применяется к элементам контейнера. В этот раз мы сосредоточим наше внимание исключительно на изменении размера дочерних элементов.
Наше первое свойство, на мой взгляд, наиболее плохо объяснено в большинстве Flexbox-туториалах. Но не беспокойтесь, оно довольно-таки простое.
Свойство Flex-basis управляет размером элемента по умолчанию до того, как данный элемент будет изменённым другими Flexbox-свойствами (подробнее об этом позже).
На приведенной ниже гифке видно, что данной свойство является взаимозаменяемым со стандартным свойством width:
Но что же делает свойство flex-basis таким уникальным в отличие от стандартного width? Для ответа на этот вопрос давайте обратимся к нашим старым осям:
Flex-basis влияет на размер элементов, расположенных на основной оси. Давайте посмотрим, что изменится, если мы оставим то же свойство flex-basis, но изменим направление основной оси:
Обратите внимание, что нам необходимо перейти от ручной настройки высоты к ручной настройке ширины. Свойство flex-basis попеременно определяет высоту и ширину в зависимости от свойства flex-direction.
Свойство #2: Flex Grow
Теперь перейдем к немного более сложному свойству.
Для начала установим нашим квадратам то же значение ширины, 120px:
Теперь перейдем к свойству flex-grow, которое по умолчанию имеет значение 0. При установке данного свойства наши квадраты не будут иметь возможности расти или, если сказать более правильно, у них нет возможности забирать лишнее пространство в контейнере.
Что это означает? Давайте попробуем увеличить на 1 значение свойства flex-grow для каждого квадрата:
Наши квадраты дружно заняли всю ширину контейнера, при этом пространство между ними было равномерно распределено. Значение свойства flex-grow переопределяет значение свойства width.
Наверное, единственное, что сбивает с толку, - это то, что же на самом деле значение свойства flex-grow означает. Что подразумевается под flex-grow:1?
Итак, на приведённом ниже изображении представлен пример того, что будет, если установить значение flex-grow:999:
Эм… в точности тоже самое.
Так что же задаёт flex-grow?
Причиной этого является то, что значение свойства flex-grow не является абсолютной величиной. Значение свойства flex-grow – величина относительная.
Важно не то, как влияет значение свойства flex-grow на каждый квадрат в отдельности, а то, как это значение ведет себя по отношению к другим квадратам. Например, если мы установим flex-grow:1 для каждого квадрата, а для третьего будем его менять, вот тогда мы и увидим изменения:
Для того, чтобы во всем разобраться, давайте немного углубимся в простую математику.
Изначально каждый квадрат имеет значение flex-grow:1. Если мы посчитаем значения каждого из квадратов, то в сумме получим шесть. Таким образом наш контейнер поделён на шесть равных секций, а каждый квадрат занимает ровно 1/6 часть контейнера.
Когда мы увеличиваем значение данного свойства у третьего квадрата до 2, то контейнер разделяется на 7 различных частей, так как общее количество значений выглядит так 1+1+2+1+1+1. И получается, что третий квадрат занимает 2/7 части контейнера, а остальные - 1/7 часть. При увеличении значения до 3 контейнер разделяется на 8 частей (1+1+3+1+1+1), третий квадрат занимает 3/8, а остальные - по 1/8. И так далее…
Сутью свойства flex-grow являются пропорции. Так, например, если мы установим для каждого из квадратов flex-grow:4, а для третьего установим значение flex-grow:12, то, соответственно, получим такой же результат, как и для значений 1 и 3:
Важно запомнить, что при использовании свойства flex-grow, каждый квадрат пропорционален другим квадратам.
И последнее замечание, запомните, что также как flex-basis, flex-grow применяется к элементам основной оси. Наши квадраты будут расти только в ширину за исключением того случая, когда мы установим flex-direction: column.
Свойство #3: Flex Shrink
Flex-shrink является противоположным свойству flex-grow, определяя, насколько квадрату нужно уменьшиться.
Данное свойство применяется только тогда, когда элементы должны уменьшиться, чтобы поместиться в свой контейнер, то есть тогда, когда их контейнер очень маленького размера. Основное назначение этого свойства заключается в определении того, какие элементы вы хотите уменьшить, а какие - нет. По умолчанию каждый квадрат имеет flex-shrink:1, это означает, что они будут уменьшаться по условиям контейнера.
Давайте посмотрим на то, как работает данное свойство. На приведённой ниже гифке наши квадраты обладают свойством flex-grow:1 и свойством flex-shrink:1, поэтому они имеют право уменьшаться, как и должны.
А теперь давайте для третьего квадрата установим значение 0. Данное действие запрещает уменьшение, и поэтому в то время, как данный квадрат растет, чтобы заполнить контейнер, его ширина не уменьшается ниже заданных 120px.
Значением по умолчанию для свойства flex-shrink является 1, это означает, что элементы будут уменьшаться до тех пор, пока вы не запретите им это!
Так же, как и у flex-grow, сутью flex-shrink являются пропорции. Если один квадрат будет иметь flex-shrink:6, а остальные - flex-shrink:2, то один из квадратов будет уменьшаться в три раза быстрее остальных.
Запомните данную формулировку: Квадрат с увеличенным в три раза значением свойства flex-shrink, будет в три раза быстрее уменьшаться. Однако это не означает, что ширина будет уменьшена на треть.
Очень скоро мы углубимся в изучение того, как много элементов могут уменьшаться и расти. Но для начала давайте рассмотрим наше последнее свойство и соберем все изученное вместе.
Свойство #4: Flex
Данное свойство представляет собой все вышеперечисленные свойства (grow, shrink, и basis) вместе. По умолчанию flex-grow:0, flex-shrink:1 и flex-basis: auto. Давайте упростим наш последний пример и оставим только два квадрата.
Ниже приведены свойства каждого:
.square#one { flex: 2 1 300px; } .square#two { flex: 1 2 300px; }
Оба имеют одинаковое значение свойства flex-basis. Это означает, что при достаточном месте для обоих квадратов наш контейнер будет иметь размер 600px плюс внешний и внутренний отступы, а сами квадраты будут по 300px в ширину.
Однако при том, что оба квадрата будут расти, первый квадрат будет расти в два раза быстрее, так как имеет более высокое значение свойства flex-grow. В свою очередь, за счет более высокого значения свойства flex-shrink, второй квадрат будет в два раза быстрее уменьшаться.
А теперь все вместе:
Как вещи растут и уменьшаются
Вот что может вас сбить с толку: при росте первого квадрата в два раза он все равно не становится в два раза больше второго. Точно так же при уменьшении в два раза второго квадрата его размеры не становятся в два раза меньше первого. Даже при соотношении значений flex-shrink 2 к 1.
Дело в том, что не их размеры растут или уменьшаются в соотношении 2 к 1 или 1 к 2. Эти соотношения относятся к их скорости роста и уменьшения.
Немного математики
Начальный размер контейнера - 640px. С учетом внутреннего отступа 20px на каждой стороне контейнера, места для двух квадратов достаточно, поэтому можно вернуться к их изначальному flex-basis:300px.
Когда мы устанавливаем размер контейнера 430px, то теряем 210px пространства. Первый квадрат, с учетом свойства flex-shrink:1, теряет 70px. Второй квадрат, с учетом flex-shrink:2, теряет 140px.
После уменьшения контейнера до 340px мы теряем 300px пространства, а первый и второй квадрат теряют соответственно 100 и 200px.
Потерянное пространство распределяется в соответствии с отношением соответствующих значений свойства flex-shrink (2 к 1).
То же самое происходит со свойством flex-grow. Когда контейнер увеличивается до 940px, мы получаем 300px пространства. Первый квадрат получит 200px, а второй - 100px дополнительного пространства.
Когда же дело доходит до свойства flex, то в игру вступают пропорции.
На приведённой выше гифке вы можете видеть, как изменяется ширина в соответствии с коэффициентами дельта (∆), что показывает отличие данного свойства от flex-basis.
Заключение
Подведем итог: свойство flex-basis управляет размером элементов, расположенных вдоль основной оси, до тех пор, пока не появится какое-либо уменьшающее или увеличивающее свойство. Flex-grow определяет, насколько будут увеличиваться элементы относительно соседних, а flex-shrink определяет, насколько элементы будут уменьшаться, тоже относительно других элементов.
Впереди еще много Flexbox-свойств, поэтому в дальнейшем мы также их рассмотрим. Надеюсь, каждый найдет время, чтобы дочитать статью до конца.
Спасибо за прочтение!
Ссылка на оригинальную статью
Перевод: Александр Давыдов
Комментарии