Добавить Автора
Макет флексбоксаВ настоящее время это один из самых популярных методов веб-макета, который обеспечивает большую гибкость и удобство для веб-разработчиков при завершении макета пользовательского интерфейса страниц или компонентов. Но также из-за его большой гибкости он скрывает некоторые неизвестные детали.Если вы не очень хорошо знакомы с 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: flexflex-элементы переполняют 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 для автоматического восстановления пользовательского интерфейса, эффект отличается от того, что вы ожидали, или есть что-то необоснованное, вы можете сообщить об этом в любое время.