Добавить Автора
Макет флексбоксаВ настоящее время это один из самых популярных методов веб-макета, который обеспечивает большую гибкость и удобство для веб-разработчиков при завершении макета пользовательского интерфейса страниц или компонентов. Но также из-за его большой гибкости он скрывает некоторые неизвестные детали.Если вы не очень хорошо знакомы с Flexbox или не знаете его спецификаций, многие детали будут упущены, и эти детали заставят вас запутаться в том, что вы используете, и это может даже вызвать некоторые проблемы.
на этот раз вОптимизация макета Flexbox imgcookКогда я перечитал спецификацию Flexbox, я обнаружил, что упустил из виду важную информацию. По этой причине в этой статье я объединил макет Flexbox, режим написания CSS, логические свойства и выравнивание для организации заметки, надеясь помочь учащимся, которые хотят понять или испытать трудности при использовании Flexbox.
некоторые термины и понятия
Терминология флексбокса
Унификация терминологии помогает нам лучше обсуждать и решать проблемы позже. Используйте следующую диаграмму для описания терминов во Flexbox:
Главная ось и боковая ось имеют такое понятие только в системе компоновки Flexbox, а не горизонтальное направление всегда является главной осью (Main Axis), а вертикальное направление всегда является боковой осью (Cross Axis). Flexbox не влияет на основную и боковую оси.
flex-direction
Помимо влияния значения, на него также повлияет режим записи CSS.writing-mode
иdirection
и HTMLdir
Влияние атрибутов!
Блочная ось и встроенная ось
Модуль CSS Box Alignment Level 3 представляет две новые концепции: ось блока иВстроенная ось :
-
ось блоканаходится рядомблокировать(например, элемент абзаца) ось, проходящая в направлении компоновки,он будет пересекать встроенную ось вертикально
-
Встроенный вал— это ось вдоль направления потока слов в предложении при использовании того или иного режима письма. Например, для английского или китайскогоВстроенные оси горизонтальны
в то же времяБлочная ось (Block Axis) часто называется Column (Колонка), Inline Axis (Встроенная ось) также часто называется Row (Ряд):
Хотя спецификация Flexbox и спецификация Grid пока имеют свои описания выравнивания, выравнивание в CSS будет закрыто для модуля Box Alignment, на будущее описание оси будет более "ось блока" и "Встроенная ось", в сочетании с макетом Flexbox, соответствующее отношение оси:
-
Встроенная ось также выровнена с основной осью во Flexbox.
-
Ось блока также выровнена с поперечной осью во Flexbox.
Ось блока и встроенная ось также зависят от режима записи CSS.
writing-mode
иdirection
и HTMLdir
имущественные эффекты. Однако в макете Flexbox на него также влияетflex-direction
эффекты свойства.
режим записи
в спецификации CSS Write Modes Level 3writing-mode
иdirection
а такжев HTML dir
АтрибутыОн влияет как на основную, так и на боковую оси во Flexbox и меняет направление основной и боковой осей.
логическое свойство
ось блока,Встроенный вал,режим записиПосле появленияНачало блока, конец блока, встроенное начало и встроенный конец:
При размещении в макете Flexbox:
-
Встроенный стартЭквивалент макета FlexboxОсновной старт
-
Встроенный конецЭквивалент макета FlexboxГлавный конец (Главный конец)
-
Заблокировать запускЭквивалент макета FlexboxКросс-старт
-
Конец блокаЭквивалент макета FlexboxКросс-Энд
В то же время была введена спецификация CSS Logical Properties and Values Level 1.block-start
,block-end
,inline-start
иinline-end
, но они такие же, как и во Flexbox, Grid in Box Alignmentflex-start
,start
,flex-end
иend
не эквивалентны и не являются понятиями в одной и той же области. Эти свойства соответствуют физическим свойствамtop
,right
,bottom
иleft
:
То есть после введения логических свойств CSS блочная модель CSS будет разделена нафизическая модель коробкиимодель логического ящика :
С тех пор свойства CSS такжелогическое свойствоифизические свойстваточки:
Обратите внимание, что на логические свойства CSS также влияет режим записи CSS.writing-mode
,directioin
атрибуты и HTMLdir
Атрибуты влияют и различаются при разных комбинациях:
Свободное место (свободное место) и недостаточно места
В модуле макета Flexbox контейнер flex может содержать один или несколько flex-элементов. А flex-контейнер и flex-элемент имеют свой размер, поэтому будут ситуации, когда сумма размеров flex-элемента больше или меньше, чем flex-контейнера:
-
Когда сумма размеров всех flex-элементов меньше, чем flex-контейнер, flex-контейнер будет иметь избыточное пространство, которое не заполнено, тогда это пространство называется оставшимся пространством flex-контейнера (Positive Free Space).
-
Когда сумма размеров всех flex-элементов больше, чем flex-контейнер, flex-контейнеру не хватает места для размещения всех flex-элементов (flex-элементы переполнят flex-контейнер), а дополнительное пространство называется Negative Free. Пространство, также известное как негативное пространство
Flex-контейнеры и Flex-элементы
использовать на элементахdisplay
установить значение наflex
илиinline-flex
, контейнер станет контейнером Flex, а подэлементы внутри контейнера, включая текстовые узлы, — псевдоэлементами.
использоватьflex
иinline-flex
Конкретная сцена:
Если элемент явно устанавливаетdisplay
значениеflex
илиinline-flex
, Flex-элементы явно не задают свойства, связанные с размером, Flex-элементы будут основываться на размере своего содержимого для расчета собственного размера.
-
Установить как
display: flex
, когда у гибкого контейнера нет явно установленных свойств, связанных с шириной, его ширина равна его родительскому контейнеру (эквивалентноwidth: 100%
) -
Установить как
display: inline-flex
Когда flex-контейнер не имеет явно установленных свойств, связанных с шириной, его ширина равна ширине всех flex-элементов и
Когда все flex-элементы во flex-контейнере все шире и больше, чем flex-контейнер:
-
Установить как
display: flex
flex-элементы переполняют flex-контейнер, когда -
Установить как
display: inline-flex
Когда flex-элемент расширяет flex-контейнер, это может привести к тому, что flex-контейнер переполнит родительский элемент (или элемент-предок).
использоватьdisplay: inline-flex
лучшее сочетаниеmin-width
иmin-height
использовать вместе. Явная установка не рекомендуетсяwidth
иheight
.
display
Установить какflex
, контейнер Flex аналогичен контейнеру блока по выражению, фактически это контейнер Flex, а формат контекста — FFC (Flexbox Formatting Content), поэтому некоторые свойства макета, примененные к контейнеру блока (Block Formatting Content), больше не применимо, например:
-
CSS
column-*
Свойство не работает на гибком контейнере -
CSS
float
иclear
Свойства не работают с элементами Flex и не исключают элементы Flex из потока документов. -
CSS
vertical-align
Свойства, не работающие с гибкими элементами -
Псевдоэлементы CSS
::first-line
и::first-letter
Не работает с flex-контейнерами, а flex-контейнеры не обеспечивают форматирование первой строки или первой буквы для своих предков.
Одно замечание,если элемент display
значениеinline-flex
, и элемент явно устанавливаетfloat
илиposition
значениеrelative
,absolute
илиfixed
,Такdisplay
Расчетное значениеflex
, т. е. производительность контейнера Flex иdisplay: flex
эквивалент.
Работа со свойствами в flex-контейнерах
Укажите направление шпинделя
Явное использование в контейнерах Flexflex-direction
Направление главной оси можно указать, если оно не задано явноflex-direction
свойство, контейнер Flex примет значение по умолчаниюrow
.
На картинке выше показано только как читатьLTR (слева направо), если нет специального объявления, следующие документы не будут затронуты способом чтения (т.е. CSS writing-mode
,direction
и HTMLdir
Атрибуты), чтобы перечислить различные схемы.
Если вам не нужно явно изменять направление основной оси, вам нужно явно установить его в контейнере flex.flex-directioin
, например метод набора текста, как показано ниже:
flex-direction: column
row-reverse
и значение по умолчаниюrow
Производительность прямо противоположная, подходит для следующих сценариев компоновки:
В макете Flexboxflex-direction
При указании направления главной оси flex-контейнера это также влияет на порядок расположения flex-элементов (Это очень удобно, когда вы хотите добиться обратного набора текста без изменения структуры DOM.). Кромеflex-direction
Явное использование во гибких элементах может использоваться в дополнение к влиянию на порядок гибких элементов.order
Атрибуты также могут быть упорядочены по вашему желанию, не затрагивая структуру DOM.
В настоящее время при использовании макета Flexbox в imgcook он явно задается для контейнера Flex.flex-direction
значение, даже значение по умолчанию:row
. При оптимизации алгоритма компоновки соответствующую обработку можно сделать, только в не-row
явно установлен на гибком контейнереflex-direction
:
Управляет переносом гибких элементов (гибкая линия)
использоватьflex-wrap
Вы можете контролировать, как flex-элементы оборачивают flex-контейнер:
Устанавливайте только в том случае, если сумма ширин всех flex-элементов больше, чем размер основной оси flex-контейнера.flex-wrap
свойства вступят в силу.
flex-wrap
значение неnowrap
(которыйwrap
иwrap-reverse
) может сделать так, чтобы flex-элементы переносились (столбцы) явно, гдеwrap-reverse
исполнительское поведение иwrap
Как раз наоборот.
Комбинированный эффект
эффект производительности
Эффект 1
Эффект 2
Эффект 3
Эффект 4
Эффект 5
Эффект 6
Эффект 7
Эффект 8
flex-direction
иflex-wrap
можно сократить какflex-flow
.flex-flow
При использовании можно явно задать только одно значение, а можно явно задать два значения:
-
flex-flow
Явно задано только одно значение, и это значение и<flex-direction>
при совпадении,flex-wrap
примет значениеinitial
-
flex-flow
Явно задано только одно значение, и это значение и<flex-wrap>
при совпадении,flex-direction
примет значениеinitial
-
flex-flow
При явной установке двух значенийflex-direction
иflow-wrap
Нет порядка старшинства, простоflex-flow: column wrap
иflex-flow: wrap column
эквивалент
Выравнивание направления шпинделя
Использование в контейнере Flexjustify-content
Для управления выравниванием гибких элементов в направлении основной оси гибкого контейнера, а также может использоваться для выделения оставшегося пространства в направлении основной оси гибкого контейнера. использоватьjustify-content
Выделение оставшегося пространства flex-контейнера в основном предназначено для выделения оставшегося пространства двум сторонам flex-элемента в соответствии с различными методами выравнивания, то есть для управления расстоянием между flex-элементом и flex-элементом.
justify-content
Есть две спецификации:
-
CSS Flexible Box Layout Module Level 1
-
CSS Box Alignment Module Level 3
В модуле макета Flexbox,justify-content
Есть только следующие шесть значений:
требует вниманияspace-between
,space-around
иspace-evenly
Разница между тремя:
-
space-between
Это приведет к тому, что начальный край блока первого гибкого элемента выровняется с начальной точкой основной оси гибкого контейнера, край конца блока последнего гибкого элемента будет выровнен с конечной точкой основной оси гибкого контейнера, а расстояние между другими соседними гибкими элементами равно . Когда во flex-контейнере есть только один flex-элемент, его поведение иflex-start
эквивалент -
space-around
Сделает расстояние между начальным краем первого гибкого элемента и началом основной оси гибкого контейнера, а также конечным краем последнего гибкого элемента и главной осью гибкого контейнера, чтобы они были одинаковыми и равными половине расстояния между двумя другими соседними гибкие элементы. Когда во flex-контейнере есть только один flex-элемент, его поведение иcenter
эквивалент -
space-evenly
Расстояние между начальным краем блока первого гибкого элемента и началом основной оси гибкого контейнера, а также конечным краем поля последнего гибкого элемента и главной осью гибкого контейнера будет одинаковым и равным расстоянию между двумя другими соседними гибкими элементами. Предметы. Когда во flex-контейнере есть только один flex-элемент, его поведение иcenter
эквивалент
Если во гибком контейнере нет дополнительного оставшегося места или оставшееся пространство отрицательное,justify-content
Представление значения:
-
flex-start
Делает flex-элементы переполненными в конце основной оси flex-контейнера. -
flex-end
Делает flex-элементы переполненными в начале главной оси flex-контейнера. -
center
Делает flex-элементы переполненными на обоих концах flex-контейнера -
space-between
иflex-start
такой же -
space-around
иcenter
такой же -
space-evenly
иcenter
такой же
В макете flexbox вы можете использовать эти свойства для управления оставшимся пространством контейнера flex, например:
Выравнивание боковой оси
Использование в контейнере Flexboxalign-items
для управления выравниванием гибких элементов в направлении боковой оси.
align-items
Значение по умолчаниюstretch
, но только гибкие элементы показывают явные настройкиheight
(илиwidth
), элемент flex будет растянут, чтобы заполнить весь flex-контейнер.
Если во флекс-контейнере нет свободного места или оставшееся пространство отрицательное:
-
flex-start
Делает flex-элементы переполненными в конце боковой оси flex-контейнера -
flex-end
Делает flex-элементы переполненными в начале боковой оси flex-контейнера. -
center
Делает flex-элементы переполненными по обеим сторонам боковой оси flex-контейнера -
baseline
Сделает flex-элементы переполненными в конце боковой оси flex-контейнера, что-то вродеflex-start
Выравнивание нескольких строк (столбцов)
align-content
Работает только тогда, когда в flex-контейнерах недостаточно места (сумма всех ширин flex-элементов больше, чем размер основной оси flex-контейнера), и явно заданоflex-wrap
значение неwrap
Время.
align-content
ведет себя несколько похоже наjustify-cotent
Управляет выравниванием flex-элементов в направлении основной оси (выделяет оставшееся пространство на главной оси flex-контейнера), в то время какalign-content
Его можно использовать для управления выравниванием строк по боковой оси flex-контейнера в многострочном состоянии (выделить оставшееся пространство боковой оси flex-контейнера). можно поставитьalign-content
Вся строка на боковой оси в состоянии рассматривается какjustify-content
Один гибкий элемент в состоянии.
align-content
Есть еще одно отличие, еще одноstretch
ценность. Когда сумма размеров всех строк во флекс-контейнере больше, чем размер боковой оси флекс-контейнера (боковая ось флекс-контейнера не имеет свободного места или свободное пространство отрицательное), значения вести себя следующим образом:
-
flex-start
сделает строку flex-контейнера переполненной в конечной точке боковой оси -
flex-end
сделает строку flex-контейнера переполненной в начале боковой оси -
center
приведет к переполнению строки гибкого контейнера на обоих концах боковой оси -
stretch
ведет себя аналогичноflex-start
-
space-around
ведет себя аналогичноcenter
-
space-between
ведет себя аналогичноflex-start
-
space-evenly
ведет себя аналогичноcenter
Интервал (ряд-к-ряду, столбец-столбец)
gap
Используется для управления расстоянием между элементами гибкости, но игнорирует расстояние между элементами гибкости и краями контейнера гибкости:
Свойства, применяемые к элементам Flex
Самовыравнивание элементов Flex
Доступно в контейнерах Flexjustify-content
,align-content
а такжеalign-items
Выделите пространство для основной и боковой осей flex-контейнера (управляет выравниванием всех flex-элементов в flex-контейнере). Если вам нужно иметь дело с индивидуальным выравниванием гибких элементов, вы можете использоватьalign-self
:
align-self
Эффект от принятия разных значений:
Flex проекта align-self
Явно установите значениеauto
не перезаписывает flex-контейнерalign-items
;Также, если явно установлено для гибкого элементаmargin
значениеauto
Когда элемент Flexalign-self
значение будет недействительным.
Сценарии, подобные приведенному выше,align-self
Это очень практично.
Гибкая сортировка элементов
Использование в контейнере Flexflex-direction
Все flex-элементы во flex-контейнере можно нажимать "LTR", "RTL", "TTB" или "BTT«Ориентация.
-
LTR:
flex-driection: row
-
RTL:
flex-direction: row-reverse
-
TTB :
flex-direction: column
-
BTT :
flex-direction: column-reverse
Для элементов Flex вы также можете использоватьorder
Укажите конкретное значение, чтобы сортировать элементы Flex без изменения структуры DOM. Чем больше значение, тем больше назад:
В некоторых случаях, когда порядок слева и справа, сверху и снизу меняется на противоположный, за исключениемflex-direction
Кроме того, вы также можете установить проект Flexorder
:
Расчет масштабирования гибкого проекта
Используется в проектах Flexflex
Свойство может масштабироваться в соответствии с доступным пространством контейнера Flex, который содержит три подсвойства:flex-basis
,flex-shrink
иflex-grow
. Эти свойства имеют свои начальные значения:
-
flex-grow
Начальное значение0
-
flex-shrink
Начальное значение1
-
flex-basis
Начальное значениеauto
которыйflex
Три подсвойства :flex-grow
(коэффициент расширения),flex-shrink
(коэффициент усадки) иflex-basis
(эталон масштабирования). Эти три свойства могут управлять элементами Flex, и конкретная производительность выглядит следующим образом:
-
flex-grow
: Установите коэффициент расширения элемента Flex, пусть элемент Flex получит (расширит) сколько оставшегося пространства контейнера Flex (Positive Free Space), то есть элемент Flex может стать больше -
flex-shrink
: установите коэффициент сжатия гибкого элемента, чтобы гибкий элемент минус недостаточное пространство гибкого контейнера (отрицательное свободное пространство), то есть гибкий элемент может стать меньше. -
flex-basis
: Размер гибкого элемента перед его расширением или сжатием, то есть указывает начальный размер гибкого элемента в направлении главной оси.
flex
свойства могут быть указаны1 значение (синтаксис с одним значением),2 значения (синтаксис с двумя значениями)или3 значения (синтаксис с тремя значениями).
Синтаксис с одним значением: значение должно быть одним из следующих:
-
безразмерное число (
<number>
),Напримерflex: 1
, на этот раз он будет рассматриваться как<flex-grow>
значение -
допустимая ширина (
width
) значение, такое какflex: 30vw
, на этот раз он будет рассматриваться как<flex-basis>
значение -
Ключевые слова
none
,auto
илиinitial
(т.е. начальное значение)
Синтаксис двойного значения: первое значение должно быть безразмерным числом, и оно будет рассматриваться как<flex-grow>
значение; второе значение должно быть одним из следующих:
-
безразмерное число (
<number>
), он будет рассматриваться как<flex-shrink>
значение -
допустимая ширина (
width
) значение, оно будет рассматриваться как<flex-basis>
значение
Трехзначный синтаксис:
-
Первое значение должно быть безразмерным числом (
<number>
), и он будет рассматриваться как<flex-grow>
значение -
Второе значение должно быть безразмерным числом (
<number>
), и он будет рассматриваться как<flex-shrink>
значение -
Третье значение должно быть допустимой шириной (
width
) значение, и оно будет рассматриваться как<flex-basis>
значение
flex
Стоимость имущества может быть:
-
auto
: гибкие элементы будутwidth
иheight
чтобы определить размер, но гибкий элемент расширяется и сжимается в соответствии с оставшимся пространством гибкого контейнера. что эквивалентноflex: 1 1 auto
-
initial
: гибкие элементы будутwidth
иheight
для установки размера. Он укорачивается, чтобы соответствовать гибкому контейнеру, но не растягивается и не поглощает дополнительное оставшееся пространство в гибком контейнере, чтобы соответствовать гибкому контейнеру. что эквивалентноflex: 0 1 auto
-
none
: гибкие элементы будутwidth
иheight
для установки размера. Он совершенно неэластичен (не укорачивается и не растягивается, чтобы соответствовать гибкому контейнеру). что эквивалентноflex: 0 0 auto
-
<flex-grow>
: определяет элемент Flexflex-grow
свойство, значение<number>
-
<flex-shrink>
: определяет элемент Flexflex-shrink
свойство, значение<number>
-
<flex-basis>
: определяет элемент Flexflex-basis
Атрибуты.Если значение0
, единицы должны быть добавлены, чтобы не считаться эластичным
flex-grow расчет
flex-grow
Формула расчета:
Пример:
Предполагая, что в контейнере flex есть четыре flex-элемента, конкретные параметры:
-
Ширина гибкого контейнера
80vw
-
В контейнере flex есть четыре flex-элемента, и ширина каждого flex-элемента равна
10vw
-
Сумма ширин flex-элементов равна
10vw x 4 = 40vw
-
Оставшееся пространство гибкого контейнера
80vw - 40vw = 40vw
-
Flex проекта
flex-grow
Значения0
,1
,2
и3
, для всех гибких элементовflex-grow
Сумма0 + 1 + 2 + 3 = 6
процесс расчета:
Расчетный результат:
flex-grow
Значение также может бытьдесятичное значение. Если приведенный выше примерflex-grow
Значения заменены на0
,0.1
,0.2
и0.3
,В настоящее времяflex-grow
Сумма (всех гибких элементовflex-grow
и является0.6
, что меньше1
. В настоящее время проект Flex также будет основан наflex-grow
Фактор роста используется для разделения оставшегося пространства flex-контейнера, и ширина самого flex-контейнера станет больше, но оставшееся пространство flex-контейнера не будет разделено полностью, потому что всеflex-grow
и меньше чем1
. В этом примере делится только оставшаяся ширина пространства гибкого контейнера.60%
.
еслиflex-grow
и меньше чем1
, формула его расчета выглядит следующим образом:
Даже если все flex-элементы во flex-контейнере имеютflex-grow
и больше, чем1
, но нельзя однозначно сказать, что элементы Flex могутflex-grow
Соотношение для разделения оставшегося пространства гибкого контейнера. Поскольку на размер элемента влияетmax-width
Влияние.Когда flex-элемент задан явно max-width
значение, когда гибкий элемент основан наflex-grow
Расчетная ширина большеmax-width
, элемент Flex будет нажиматьmax-width
значение. Например, в предыдущем примере мы установилиmax-width
значение18vw
, процесс расчета и результаты следующие:
В это время оставшееся пространство контейнера Flex не используется.40vw - 0vw - 6.667vw - 8vw - 8vw = 17.333vw
, т.е. flex-контейнер также имеет17.333vw
оставшееся пространство.
Если элемент Flex не задает явным образом свойства, связанные с шириной (включаяflex-basis
),Такflex-grow
При расчете гибкие элементы рассчитываются по ширине их содержимого.
Из приведенного выше рисунка вы можете получить:
-
Ширина гибкого контейнера
804px
-
Ширина flex-элементов
43.36px
,92.09px
,140.83px
и189.56px
, сумма ширины всех гибких элементов равна465.84px
-
Оставшаяся ширина гибкого контейнера равна
804px - 465.84px = 338.16px
-
всех элементов Flex
flex-grow
значение1
, то есть все элементы Flexflex-grow
Сумма4
применить соответствующее значение кflex-grow
По формуле можно получить:
Обратите внимание, что разные браузеры по-разному обрабатывают десятичные дроби.
расчет гибкости и усадки
flex-shrink
Формула расчета:
Пример:
Предполагая, что flex-контейнер имеет четыре flex-элемента, конкретные параметры будут следующими:
-
Ширина гибкого контейнера
40vw
-
В контейнере flex есть четыре flex-элемента, и ширина каждого flex-элемента равна
15vw
-
Сумма ширин flex-элементов равна
15vw x 4 = 60vw
-
Недостаточно места для гибкого контейнера
40vw - 60vw = -20vw
-
Flex проекта
flex-shrink
Значения0
,1
,2
и3
, для всех гибких элементовflex-shrink
Сумма0 + 1 + 2 + 3 = 6
процесс расчета:
Расчетный результат:
flex-shrink
Расчет также можно рассчитать и по другой формуле:
flex-shrink
иflex-grow
Точно так же можно брать и десятичные значения. Если все flex-элементы в flex-контейнере имеютflex-shrink
сумма меньше чем1
, тогда недостаточное пространство гибкого контейнера не будет разделено гибким элементом в соответствии с коэффициентом сжатия, и гибкий элемент все равно будет переполнять гибкий контейнер.
flex-shrink
сумма меньше чем1
, формула его расчета выглядит следующим образом:
На основе приведенного выше примера поместите элемент Flexflex-shrink
соответственно установлен на0
,0.1
,0.2
и0.3
, процесс расчета выглядит следующим образом:
Даже если все flex-элементы во flex-контейнере имеютflex-shrink
и больше, чем1
, но нельзя однозначно сказать, что элементы Flex могутflex-shrink
Соотношение, чтобы разделить недостаточное пространство гибкого контейнера. Поскольку на размер элемента влияетmin-width
Влияние.Когда flex-элемент задан явно min-width
значение, когда гибкий элемент основан наflex-shrink
Расчетная ширина меньшеmin-width
, элемент Flex будет нажиматьmin-width
значение. Например, в предыдущем примере мы установилиmin-width
значение10vw
, процесс расчета и результаты следующие:
В этом случае окончательная сумма ширин flex-элементов все равно будет больше ширины flex-контейнера, и flex-элементы также переполнят flex-контейнер.
flex-shrink
иflex-grow
Существует также сходство, то есть, когда свойства, связанные с шириной, не заданы явно для flex-элемента flex-контейнера, начальная ширина flex-элемента будет рассчитываться на основе ширины его содержимого.
flex-shrink
немного иflex-grow
Совершенно по-другому, если следует гибкий элементflex-shrink
Расчетная новая ширина имеет тенденцию быть0
, элемент Flex будет следовать за элементомmin-content
Ширина задается размером, и эта ширина будет передана другим гибким элементам, а затем сжата в соответствии с соответствующим коэффициентом сжатия.
Например, мы помещаем четвертый элемент Flexflex-shrink
значение от3
изменить на9
. Согласно формуле, представленной выше, можно узнать, что новая ширина flex-элемента 4 равна15vw - (20vw ÷ 12) × 9 = 0
Расчетная ширина0
, но на самом деле отображаемая в это время ширина равна ширине элементаmin-content
(Этот пример представляет собой ширину слова «усадить», как показано ниже), примерно47.95px
(записаться на прием3.66vw
). то это значение будет разделено на3
копий (потому что пример трех других flex-элементовflex-shrink
да0
,1
и2
), и соответствующий flex-элемент продолжает выделять ширину, которую должен был уменьшить flex-элемент 4. который:
-
flex item 1 новая ширина равна
15vw - 20 ÷ 12 × 0 - 3.66 ÷ 3 × 0 = 15vw
(записаться на прием196.5px
) -
flex item 2 новая ширина равна
15vw - 20 ÷ 12 × 1 - 3.66 ÷ 3 × 1 = 12.113vw
(записаться на прием158.6847px
) -
flex item 3 новая ширина равна
15vw - 20 ÷ 12 × 2 - 3.66 ÷ 3 × 2 = 9.227vw
(записаться на прием120.869px
)
Ширина окна браузера1310px
Результат, отображаемый в состоянии, выглядит следующим образом:
В модуле макета Flexbox, на основе вышеупомянутых свойств выравнивания контейнера Flex,flex-shrink
иflex-grow
Мы можем очень хорошо справиться с оставшимся и недостаточным пространством гибкого контейнера:
-
Во гибком контейнере осталось место (сумма ширин всех гибких элементов меньше ширины гибкого контейнера), если установлено
flex-grow
, гибкий элемент будет выделять оставшееся пространство гибкого контейнера в соответствии с коэффициентом расширения;flex-grow
Когда выравнивание установлено во flex-контейнере, если это так, оставшееся пространство flex-контейнера будет выделено в соответствии с выравниванием, если нет, то оставшееся пространство flex-контейнера останется неизменным. -
Во гибком контейнере недостаточно места (сумма ширин всех гибких элементов больше ширины гибкого контейнера), если установлено
flex-shrink
значение0
, flex-элементы не сжимаются, flex-элементы переполняют flex-контейнер; если это не указано явноflex-shrink
значение, flex-элементы распределяются равномерно, если во flex-контейнере не хватает места, flex-элемент станет уже (т.flex-shrink
Значение по умолчанию1
), если явно заданоflex-shrink
значение не0
, тогда flex-элемент будет выделять недостаточно места во flex-контейнере в соответствии с различными коэффициентами сжатия, и flex-элемент также станет уже.
В частности, мы можем нарисовать блок-схему в этом отношении:
гибкий расчет
flex-basis
рассчитывается относительноflex-grow
иflex-shrink
Немного сложнее, потому что это то же самое, что и проект Flex.Содержание,width
,min-width
иmax-width
относятся к. Отношение здесь относится котношение веса между ними, вообще говоря,Когда эти свойства появляются во гибком элементе одновременно, кто определяет ширину гибкого элемента?.
В макете Flexbox вы можете использоватьflex-basis
для инициализации размера элемента Flex, т.е.Инициализировать размер гибкого элемента до того, как произойдет выделение пространства гибкого контейнера (оставшегося или недостаточного).
На самом деле существует неявная формула для установки размера flex-элементов в модуле макета Flexbox:
content
➜width
➜flex-basis
Проще говоря, если flex-элемент явно не указанflex-basis
значение, тоflex-basis
вернется кwidth
(илиinline-size
) атрибут; если явно не указаноwidth
(илиinline-size
) значение свойства, тоflex-basis
Вернется к расчету ширины на основе содержимого гибкого элемента. Однако на определение размера элемента Flex также влияетflex-grow
иflex-shrink
И влияние размера гибкого контейнера. иОкончательный размер элемента Flex будет зависеть от min-width
,max-width
(илиmin-inline-size
,max-inline-size
) предел атрибута. Это необходимо отметить.
Давайте посмотрим пример:
<div class="flex__container">
<div class="flex__item"></div>
<div class="flex__item"></div>
<div class="flex__item"></div>
<div class="flex__item"></div>
</div>
.flex__container {
width: 600px;
display: flex;
border: 1px dashed #f36;
align-items: stretch;
}
Элементы Flex не задают явно никаких свойств, связанных с размером, просто используйте content
распространять гибкий проект.
<div class="flex__container">
<div class="flex__item">Lorem ipsum dolor sit amet</div>
<div class="flex__item">Lorem ipsum dolor sit amet consectetur adipisicing elit</div>
<div class="flex__item">Fugiat dolor nihil saepe. Nobis nihil minus similique hic quas mollitia.</div>
<div class="flex__item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias consequuntur sequi suscipit iure fuga ea!</div>
</div>
В этом примере нет явной настройки для элемента Flex.flex-basis
свойства, в настоящее времяflex-basis
примет значение по умолчаниюauto
:
Явно задано для элементов Flex width
ценность.
:root {
--width: 120px;
}
.flex__item {
width: var(--width);
}
На данный момент все flex-элементы имеют одинаковую ширину:
рассчитывается браузеромflex-basis
значение по-прежнемуauto
, но явно установленоwidth: 120px
, наконец-тоwidth
Значение свойства определяет размер гибкого элемента.
Явно задано для элементов Flex flex-basis
значение, т. е. flex-элемент имеет обаwidth
иflex-basis
ценность.
:root {
--width: 120px;
--flexBasis: 150px;
}
.flex__container {
width: 800px;
}
.flex__item {
width: var(--width);
flex-basis: var(--flexBasis);
}
Хотя явно задано при этом в элементе Flexwidth
иflex-basis
, но окончательный размер гибкого элемента занимаетflex-basis
Значение:
Влияние на размер flex-элемента в модуле макета flexbox должно основываться на его неявной формуле (т.е.content
➜width
➜flex-basis
) судить.Если вы хотите явно установить размер гибкого элемента, лучше всего использовать flex-basis
, вместоwidth
(илиinline-size
).
И последнее, но не менее важное: не забывайте:
использовать flex-basis
получитmin-width
иmax-width
(или в логических свойствахmin-inline-size
илиmax-inline-size
)ограничения.
В CSS, если элементы появляются одновременноwidth
,min-width
иmax-width
атрибут, его вес вычисляется по следующим правилам:
-
элементаль
width
больше, чемmax-width
, элементыwidth
равныйmax-width
,Сейчасmax-width
может покрытьwidth
(max-width
выиграть) -
элементаль
width
меньше, чемmin-width
, элементыwidth
равныйmin-width
,Сейчасmin-width
может покрытьwidth
(min-width
выиграть) -
когда
min-width
больше, чемmax-width
час,min-width
приоритет будет выше, чемmax-width
(min-width
выиграть)
Если гибкие элементы появляются одновременноwidth
,flex-basis
иmin-width
Конкретный процесс работы выглядит следующим образом:
-
По правилу:
content
➜width
➜flex-basis
, чтобы определить значение, применяемое к элементу Flex, то естьflex-basis
будет применяться к проектам Flex (flex-basis
выиграть) -
Тогда по закону: Flex проекта
width
меньше, чемmin-width
Когда элемент Flexwidth
равныйmin-width
,Сейчасmin-width
может покрытьwidth
(min-width
выиграть)
Таким образом,если flex-basis
меньше, чемmin-width
, ширина гибкого элемента будет принимать значениеmin-width
,Сейчасmin-width
обложкаflex-basis
(min-width
выиграть).
Если гибкие элементы появляются одновременноwidth
,flex-basis
иmax-width
Конкретный процесс работы выглядит следующим образом:
-
По правилу:
content
➜width
➜flex-basis
, чтобы определить значение, применяемое к элементу Flex, то естьflex-basis
будет применяться к проектам Flex (flex-basis
выиграть) -
Тогда по закону: Flex проекта
width
больше, чемmax-width
Когда элемент Flexwidth
равныйmax-width
,Сейчасmax-width
может покрытьwidth
(max-width
выиграть)
Таким образом,если flex-basis
больше, чемmax-width
, ширина гибкого элемента будет принимать значениеmax-width
,Сейчасmax-width
обложкаflex-basis
(max-width
выиграть).
Если гибкие элементы появляются одновременноwidth
,flex-basis
,min-width
иmax-width
, к приведенному выше правилу будет добавлено новое правило для оценки:
-
когда
min-width
больше, чемmax-width
час,min-width
приоритет будет выше, чемmax-width
(min-width
выиграть).
Затем примените его к проекту Flex:
-
flex-basis
больше, чемmax-width
, ширина гибкого элемента равнаmax-width
,Сейчасmax-width
может покрытьflex-basis
(max-width
выиграть) -
flex-basis
меньше, чемmin-width
, ширина гибкого элемента будет принимать значениеmin-width
,Сейчасmin-width
обложкаflex-basis
(min-width
выиграть)
так какmin-width
больше, чемmax-width
возьметmin-width
, с этим предварительным условием мы можемflex-basis
иmin-width
Сделайте сравнение веса, то есть:flex-basis
возьметmin-width
. И наоборот, еслиmin-width
меньше, чемmax-width
все равно возьмуmax-width
, и еслиflex-basis
больше, чемmax-width
возьметmax-width
.
Если вы понимаете это, вы можете использовать более простые правила для определения размера, используемого для гибких элементов.
Сначала согласно content
➜width
➜flex-basis
чтобы решить, что использовать для проектов Flex. Если элемент flex установлен явноflex-basis
свойство, оно игнорируетсяcontent
иwidth
. иmin-width
используется для установки нижнего предела элемента Flex;max-width
Используется для установки верхнего предельного значения гибкого элемента.
Используйте простую блок-схему для описания:
Примечание. Элементы Flex flex-shrink
иflex-grow
Также влияет на размер гибкого элемента.!
маржа на гибких элементах
Явно задано во гибких элементахmargin
значениеauto
Вы можете гибко управлять положением одного гибкого элемента во гибком контейнере:
Например, для эффекта, подобного изображению ниже, используйтеmargin-left: auto
Это очень полезно:
Отделка корпуса
проблема заполнения и автоматической ширины
В этом случае лучшее решение не устанавливает никаких явных значений.padding
иmargin
характеристики. Ручная реализация может выглядеть так:
<div class="flex__container">
<span class="coupon">卷</span>
<span class="divider"></span>
<span class="price">¥1000</span>
</div>
.flex__container {
display: inline-flex;
min-width: 200px;
height: 60px;
border: 1px solid rgba(255, 0, 54, 1);
background-color: rgba(255, 0, 54, 0.1);
border-radius: 4px;
color: #ff0036;
font-size: 24px;
font-weight: 400;
}
.flex__container > span {
display: inline-flex;
justify-content: center;
align-items: center;
}
.divider {
border-right: 1px dashed currentColor;
}
.coupon {
min-width: 50px;
}
.price {
flex: 1;
min-width: 0;
padding: 0 10px;
}
-
① Подобно кнопке, значку и т. д. (форма похожа на встроенный блок), установите для контейнера Flex значение
inline-flex
и установитеmin-width
(эквивалентно Sketch по умолчанию) иheight
-
② Из анализа эскизного проекта видно, что ширина предыдущего «рулета» известна, и на этом элементе задана фиксированная ширина.
width
-
③ встреча
1px
Разделительную линию можно использоватьborder
или мертвая ширинаwidth
-
④ "Цена" в крайнем правом углу – это следующий неопределенный фактор. Для элементов Flex его можно задать явно.
flex: 1
, пусть раздел займет оставшееся пространство гибкого контейнера -
⑤ Чтобы сделать «цену» более расширяемой, когда ее значение расширяется до точки, где в контейнере flex не остается места, число будет близко к конечной точке и разделительной линии главной оси контейнера flex. , Чтобы сделать его визуально дружественным, его следует установить в контейнере «цена».
padding-left
иpadding-right
резюме
Эта заметка охватывает большую часть содержимого спецификации Flexbox и некоторые критические моменты.В дополнение к некоторому основному содержанию и деталям, упомянутым в статье, есть и другие аспекты использования Flexbox для завершения макета в пользовательском интерфейсе. Например, позиционирование во Flex-контейнере, иерархический расчет и т. д., Flex-контейнер и встреча Flex-элемента.overflow
И расчеты прокрутки во flex-контейнерах и т. д. Они очень специфичны для сцены, и обработка границы слишком сложна. При обычном использовании Flexbox мы редко или даже редко сталкиваемся с ним. Поэтому в статье не указан.
Если вы используете Flexbox, особенно используя imgcook для автоматического восстановления пользовательского интерфейса, эффект отличается от того, что вы ожидали, или есть что-то необоснованное, вы можете сообщить об этом в любое время.