В CSS Flexbox, почему нет" оправдать элементы "и" оправдать себя " свойства?
рассмотрим главную ось и поперечную ось гибкого контейнера:
источник: W3C
для выравнивания гибких элементов вдоль главной оси существует одно свойство:
для выравнивания гибких элементов вдоль поперечной оси имеются три свойства:
на изображении выше, главная ось горизонтальна и поперечная ось вертикальна. Это направления по умолчанию для контейнера flex.
однако, эти направления можно легко поменять местами с flex-direction
собственность.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(поперечная ось всегда перпендикулярно главной оси.)
моя точка зрения в описании того, как работают оси, заключается в том, что в любом направлении нет ничего особенного. Главная ось, поперечная ось, они оба равны с точки зрения важности и flex-direction
позволяет легко переключаться вперед и назад.
так почему же поперечная ось получает два дополнительных свойства выравнивания?
почему align-content
и align-items
объединены в одно свойство для главного Аксис?
почему главная ось не получает justify-self
собственность?
сценарии, где эти свойства были бы полезны:
размещение элемента flex в углу контейнера flex
#box3 { align-self: flex-end; justify-self: flex-end; }
-
создание группы гибких элементов выравнивание-право (
justify-content: flex-end
), но первый пункт выровнять по левому краю (justify-self: flex-start
)рассмотрим раздел заголовка с a группа элементов навигации и логотип. С
justify-self
логотип может быть выровнен влево, в то время как элементы навигации остаются далеко справа, и все это плавно настраивается ("сгибается") на разные размеры экрана. -
в ряду из трех гибких элементов прикрепите средний элемент к центру контейнера (
justify-content: center
) и выровнять соседние элементы по краям контейнера (justify-self: flex-start
иjustify-self: flex-end
).обратите внимание, что значения
space-around
иspace-between
наjustify-content
свойство не будет удерживать средний элемент по центру относительно контейнера, если соседние элементы имеют разную ширину.
#container {
display: flex;
justify-content: space-between;
background-color: lightyellow;
}
.box {
height: 50px;
width: 75px;
background-color: springgreen;
}
.box1 {
width: 100px;
}
.box3 {
width: 200px;
}
#center {
text-align: center;
margin-bottom: 5px;
}
#center > span {
background-color: aqua;
padding: 2px;
}
<div id="center">
<span>TRUE CENTER</span>
</div>
<div id="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
<p>note that the middle box will only be truly centered if adjacent boxes are equal width</p>
на момент написания этой статьи, нет никакого упоминания о justify-self
или justify-items
на на основе спецификаций.
источник: W3C
Вы заметите, что justify-self
и justify-items
рассматриваются... но не для flexbox.
я закончу повторяя главный вопрос:
почему нет свойств" оправдать элементы "и" оправдать себя"?
5 ответов:
методы выравнивания гибких элементов вдоль главной оси
как указано в вопросе:
для выравнивания гибких элементов вдоль главной оси существует одно свойство:
justify-content
для выравнивания гибких элементов вдоль поперечной оси есть три свойства:
align-content
,align-items
иalign-self
.затем задается вопрос:
почему нет
justify-items
иjustify-self
свойства?один ответ может быть: потому что они не нужны.
The спецификация flexbox предоставляет два методы выравнивания гибких элементов вдоль главной оси:
- The
justify-content
ключевое слово свойство, иauto
поля
оправдать-содержание
The
justify-content
свойство выравнивает элементы flex вдоль главной оси контейнера flex.он применяется к контейнеру flex, но влияет только на элементы flex.
есть пять вариантов выравнивания:
flex-start
~ детали гибкого трубопровода упакованы к началу линия.
flex-end
~ детали гибкого трубопровода упакованы к концу линии.
center
~ детали гибкого трубопровода упакованы к центру линии.
space-between
~ гибкие элементы равномерно разнесенный, с первым элементом, выровненным по одному краю контейнера, и последним элементом, выровненным по противоположному краю. Ребра, используемые первым и последним элементами, зависят отflex-direction
и записи режим (ltr
илиrtl
).
space-around
~ так же, какspace-between
за исключением пробелов половинного размера на обоих концы.
Авто Поля
с
auto
поля, элементы flex могут быть центрированы, разнесены или упакованы в подгруппы.в отличие от
justify-content
, который применяется к контейнеру flex,auto
поля идут на гибких элементов.они работают, потребляя все свободное пространство в указанном направлении.
выровнять группу гибкого трубопровода элементы справа, но первый элемент слева
сценарий из вопроса:
создание группы гибких элементов выравнивания по правому краю (
justify-content: flex-end
) но есть первый пункт выровнять влево (justify-self: flex-start
)рассмотрим раздел заголовка с группой элементов навигации и логотипом. С
justify-self
логотип может быть выровнен влево, пока элементы навигации остаются далеко справа, и все это плавно настраивается ("сгибается"), чтобы отличающийся размер экрана.
другие полезные сценарии:
поместите гибкий элемент в углу
сценарий от вопрос:
- размещение элемента flex в углу
.box { align-self: flex-end; justify-self: flex-end; }
центр гибкого элемента по вертикали и горизонтали
margin: auto
альтернативаjustify-content: center
иalign-items: center
.вместо этого кода на контейнере flex:
.container { justify-content: center; align-items: center; }
вы можете использовать это на флекс пункт:
.box56 { margin: auto; }
эта альтернатива полезна, когда центрирование гибкого элемента, который переполняет контейнер.
центр гибкого элемента, и второй элемент гибкого трубопровода между первым и краю
контейнер выравнивание элементов контейнера за счет распределения свободного пространства.
Следовательно, чтобы создать равновесие, так что средний элемент может быть расположен в контейнере с один пункт рядом, противовес должен быть введен.
в приведенных ниже примерах невидимые третьи гибкие элементы (коробки 61 и 68) вводятся для балансировки "реальных" элементов (коробка 63 и 66).
конечно, этот метод не является чем-то большим с точки зрения семантики.
кроме того, вы можете использовать псевдо-элемент вместо фактического элемента DOM. Или вы можете использовать абсолютное позиционирование. Все три метода рассматриваются здесь: центрируйте и нижн-выровняйте детали гибкого трубопровода
Примечание: приведенные выше примеры будут работать только с точки зрения истинного центрирования – когда самые внешние элементы равны высоте/ширине. Если гибкие элементы имеют разную длину, см. Следующий пример.
центр гибкого элемента, когда соседние элементы различаются по размеру
сценарий из вопроса:
в ряду из трех гибких элементов прикрепите средний элемент к центру контейнера (
justify-content: center
) и выровнять прилегающую элементы к краям контейнера (justify-self: flex-start
иjustify-self: flex-end
).обратите внимание, что значения
space-around
иspace-between
onjustify-content
свойство не будет держать средний элемент по центру относительно контейнера, если соседние элементы имеют разную ширину (посмотреть демо).как уже отмечалось, Если все элементы flex не имеют равной ширины или высоты (в зависимости от
flex-direction
), средний элемент не может быть действительно по центру. Эта проблема делает сильный случай дляjustify-self
свойство (предназначенное для обработки задачи, конечно).#container { display: flex; justify-content: space-between; background-color: lightyellow; } .box { height: 50px; width: 75px; background-color: springgreen; } .box1 { width: 100px; } .box3 { width: 200px; } #center { text-align: center; margin-bottom: 5px; } #center > span { background-color: aqua; padding: 2px; }
<div id="center"> <span>TRUE CENTER</span> </div> <div id="container"> <div class="box box1"></div> <div class="box box2"></div> <div class="box box3"></div> </div> <p>The middle box will be truly centered only if adjacent boxes are equal width.</p>
здесь два способа решения этой проблемы:
Решение №1: Абсолютное Позиционирование
спецификация flexbox позволяет абсолютное позиционирование гибких элементов. Это позволяет среднему элементу быть идеально центрированным независимо от размера его братьев и сестер.
просто имейте в виду, что, как и все абсолютно позиционированные элементы, элементы удаляются из документооборот. Это означает, что они не занимают места в контейнере и могут перекрывать своих братьев и сестер.
в примеры ниже, средний элемент центрируется с абсолютным позиционированием, а внешние элементы остаются в потоке. Но тот же макет может быть достигнут в обратном порядке: центр среднего элемента с
justify-content: center
и абсолютно позиционировать внешние элементы.решение #2: вложенные гибкие контейнеры (без абсолютного позиционирования)
.container { display: flex; } .box { flex: 1; display: flex; justify-content: center; } .box71 > span { margin-right: auto; } .box73 > span { margin-left: auto; } /* non-essential */ .box { align-items: center; border: 1px solid #ccc; background-color: lightgreen; height: 40px; }
<div class="container"> <div class="box box71"><span>71 short</span></div> <div class="box box72"><span>72 centered</span></div> <div class="box box73"><span>73 loooooooooooooooong</span></div> </div>
вот как это работает:
- div верхнего уровня (
.container
) представляет собой гибкий контейнер.- каждый ребенок div (
.box
) теперь является гибким элементом.- каждого
.box
пункт даетсяflex: 1
для того, чтобы равномерно распределять пространство контейнера.- теперь элементы занимают все пространство в строке и имеют одинаковую ширину.
- сделать каждый элемент (вложенный) гибкий контейнер и добавить
justify-content: center
.- теперь каждый
span
элемент представляет собой центрированный изгиб пункт.- используйте flex
auto
поля для смены внешнегоspan
s слева и справа.вы также можете отказаться
justify-content
и использоватьauto
поля исключительно.но
justify-content
можете работать здесь, потому чтоauto
поля всегда имеют приоритет. Из спецификации:до выравнивания с помощью
justify-content
иalign-self
любой положительное свободное пространство распределяется на автоматические поля в этом измерении.
justify-content: space-same (concept)
возвращаясь к
justify-content
на минуту, вот идея для еще одного варианта.
space-same
~ гибридspace-between
иspace-around
. Гибкие элементы расположены равномерно (напримерspace-between
), за исключением вместо пробелов половинного размера на обоих концах (напримерspace-around
), есть полноразмерные пространства на обоих концах.этот макет может быть достигнуто с
::before
и::after
псевдо-элементы на контейнере flex.(кредит: @oriol для кода, и @crl на этикетке)
обновление: браузеры начали реализацию
space-evenly
, который выполняет выше. Смотрите этот пост для деталей: равное пространство между элементами flex
детская площадка (включает код для всех примеров выше)
Я знаю, что это не ответ, но я хотел бы внести свой вклад в этот вопрос, чего бы это ни стоило. Было бы здорово, если бы они могли освободить
justify-self
для flexbox, чтобы сделать его действительно гибким.Я считаю, что когда есть несколько элементов на оси, наиболее логичным способом для
justify-self
чтобы вести себя, нужно выровнять себя по ближайшим соседям (или краю), как показано ниже.Я действительно надеюсь, что W3C заметит это и, по крайней мере, рассмотрит его. =)
таким образом, вы можете иметь элемент, который действительно центрирован независимо от размера левой и правой коробки. Когда одна из коробок достигает точки центральной коробки, она просто нажимает на нее, пока не останется места для распределения.
простота создания удивительных макетов бесконечны, взгляните на этот "сложный" пример.
этот вопрос был задан в списке www-style и Tab Atkins (редактор спецификаций) предоставил ответ, объясняющий, почему. Я немного остановлюсь на этом здесь.
для начала давайте предположим, что наш контейнер flex является однострочным (
flex-wrap: nowrap
). В этом случае существует явная разница в выравнивании между главной осью и поперечной осью-есть несколько элементов, уложенных на главной оси, но только один элемент, уложенный на поперечной оси. Так что имеет смысл иметь настраиваемый для каждого элемента "выравнивание" по поперечной оси (поскольку каждый элемент выравнивается отдельно, самостоятельно), тогда как это не имеет смысла в главной оси (поскольку там элементы выравниваются вместе).для многострочного flexbox та же логика применяется к каждой "гибкой линии". В данной строке элементы выравниваются по отдельности по поперечной оси (так как в каждой строке на поперечной оси есть только один элемент), а не вместе по главной оси.
вот еще способ формулировки: так,все на
*-self
и*-content
свойства о том, как распределить дополнительное пространство вокруг вещи. Но ключевое отличие в том, что*-self
версии для случаев, когда есть только одна вещь в этой оси и*-content
версии предназначены для того, когда есть потенциально многие вещи в этой оси. Сценарии "одно против многих" - это разные типы проблем, и поэтому у них есть разные типы опций имеется, например,space-around
/space-between
значения имеют смысл для*-content
, а не*-self
.Итак: в главной оси flexbox есть много вещей, чтобы распределить пространство вокруг. Так что
*-content
свойство имеет смысл там, но не*-self
собственность.напротив, в поперечной оси у нас есть оба
*-self
и*-content
собственность. Один определяет, как мы будем распределять пространство вокруг много гибкие линии (align-content
), тогда как другие (align-self
) определяет, как распределить пространство вокруг отдельные элементы гибкого трубопровода в поперечной оси, в пределах заданной линии гибкого трубопровода.(я игнорирую
*-items
свойства здесь, так как они просто устанавливают значения по умолчанию для*-self
.)
здесь
justify-self
, но в Chrome Canary, а не в стабильной версии Chrome. Есть дажеjustify-items
:но насколько я могу судить, эти свойства тоже не работают. Поэтому, вероятно, Google сохранил его заранее для будущих выпусков CSS. Остается только надеяться, что они добавят свойства в ближайшее время.
здесь
justify-items
.Я думаю, что это новая функция. Совместимость браузера несколько отсутствует.