Свойство box-flex

Свойство box-flex.

До сих пор мы делали то, что в определенном смысле противоречит принципам рассматриваемой модели. Мы не пользовались преимуществами, предлагаемыми гибкими элементами. Свойство box-flex поможет нам исследовать эти возможности.

Свойство box-flex позволяет объявить блок как гибкий или негибкий, что помогает эффективно распределять пространство. По умолчанию блоки считаются негибкими, а значение данного свойства равно 0. Присваивая ему значение 1 или больше, вы объявляете гибкие блоки. Такие блоки растягиваются или сжимаются для заполнения дополнительного пространства. Их размер может меняться как по горизонтали, так и по вертикали — в зависимости от того, какая ориентация была объявлена в свойствах родительского блока.

Распределение пространства зависит также от свойств остальных блоков. Если все дочерние блоки объявлены как гибкие, то размер каждого из них определяется размером родительского блока и значением свойства box-flex. Давайте рассмотрим пример (листинг 2.52, рис. 2.11).

Листинг 2.52. Объявление гибких блоков с помощью свойства box-flex

#parentbox { display: box; box-orient: horizontal; width: 600px;

}

#box-1{

Box-flex: 1;

}

#box-2{

Box-flex: 1;

}

#box-3{

Box-flex: 1;

}

#box-4{

Box-flex: 1;

}

Pa rent box 600px

Ьок-1

Box-2

Box-3

Box-4

Box-flex: 1

Box-flex; 1

Box-ftex; 1

Box-flex: 1

Рис. 2.11. Пространство поровну делится между блоками

Размер каждого из блоков рассчитывается так: размер родительского блока умножается на значение свойства box-flex данного дочернего блока, а затем делится на сумму значений свойств box-flex всех дочерних блоков. В примере из листинга 2.52 формула для блока 1 будет выглядеть так: 600 х 1 / 4 = 150. Значение 600 — это размер родительского блока, 1 — значение свойства box-flex блока box-1, а 4 — сумма значений свойств box-flex всех дочерних блоков. Так как в нашем примере у всех дочерних блоков значение свойства box-flex равно 1, их итоговые размеры также равны между собой и составляют 150 пикселов.

Потенциал данного свойства становится очевиден, когда для разных блоков определяются разные значения box-flex, когда гибкие блоки сочетаются с негибкими и когда мы задаем точные размеры гибких блоков.

Листинг 2.53. Неравномерное распределение свободного пространства

#parentbox { display: box; box-orient: horizontal; width: 600px;

}

#box-1{

Box-flex: 2;

}

#box-2{

Box-flex: 1;

}

#box-3{

Box-flex: 1;

}

#box-4{

Box-flex: 1;

}

В листинге 2.53 для блока box-1 мы поменяли значение свойства box-flex — новое значение равно 2. Теперь формула для вычисления размера данного блока выглядит так: 600 х 2 / 5 = 240. Поскольку мы не меняли размер родительского блока, первая составляющая формулы осталась прежней, однако вторая теперь равна 2 (новое значение свойства box-flex для блока box-1). И, разумеется, сумма значений данного свойства всех дочерних блоков теперь равна 5 (2 для box-1 и 1 для трех остальных). Применив ту же формулу для оставшихся дочерних блоков, мы с легкостью определяем их размер: 600 х 1 / 5 = 120.

Сравнивая результаты, мы видим, что теперь пространство распределено по-другому. Доступное пространство было разделено на количество частей, равное сумме значений свойства box-flex всех дочерних блоков (в нашем примере сумма равна 5). После этого получившиеся части распределены между блоками. Блок номер 1 получил две части, а остальные потомки по одной, так как у них значение свойства box-flex равно 1. Результат применения данного метода проиллюстрирован на рис. 2.12. Его основное преимущество состоит в том, что, когда вы добавите новый дочерний блок, не придется пересчитывать все размеры, как в случае, когда они заданы процентными значениями. В гибкой блочной модели размеры пересчитываются автоматически.

Возможны и другие сценарии. Например, когда один из дочерних блоков

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

Листинг 2.54. Негибкие и гибкие потомки

#parentbox { display: box; box-orient: horizontal; width: 600px;

}

#box-1{

Width: 300px;

}

#box-2{

Box-flex: 1;

#box-3{

Box-flex: 1;

}

#box-4{

Box-flex: 1;

}

Размер первого блока в примере из листинга 2.54 равен 300 пикселам, поэтому оставшееся пространство, которое будет делиться между остальными потомками, также имеет ширину 300 пикселов (600 — 300 = 300). Браузер вычислит размер каждого гибкого блока по формуле, которую мы уже изучили: 300 х 1 / 3 = 100 (рис. 2.13).

Размер может быть задан явно как для одного блока, так и для нескольких. Тем не менее принцип не меняется: между остальными блоками распределяется только свободное пространство.

Кроме того, можно определять гибкие блоки, обладающие конкретными

Размерами (листинг 2.55).

Листинг 2.55. Для гибких блоков заданы предпочтительные размеры

#parentbox { display: box; box-orient: horizontal; width: 600px;

}

#box-1{

Width: 200px; box-flex: 1;

}

#box-2{

Width: 100px; box-flex: 1;

}

#box-3{

Width: 100px; box-flex: 1;

}

#box-4{

Width: 100px; box-flex: 1;

}

В данном случае для каждого блока указана предпочтительная ширина, однако после размещения всех блоков у нас остается еще 100 пикселов свободного пространства. Это свободное место делится между гибкими блоками. Для вычисления доли, которая достанется каждому блоку, используется уже знакомая нам формула: 100 х 1 / 4 = 25. Это означает, что к предпочтительной ширине каждого блока будет добавлено еще 25 пикселов (рис. 2.14).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *