В CSS Flexbox почему нет свойств" оправдать-элементы "и" оправдать-себя"?

рассмотрим основную ось и поперечную ось контейнера flex:

enter image description here                                                                                                                        источник: W3C по

для выравнивания элементов flex вдоль главной оси есть одно свойство:

для выравнивания гибких элементов вдоль поперечной оси есть три свойства:

на изображении выше основная ось горизонтальна, а поперечная ось вертикальна. Это направления по умолчанию для контейнера 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)

    рассмотрим раздел заголовка с группа элементов навигации и логотип. С justify-self логотип может быть выровнен влево, в то время как элементы навигации остаются далеко справа, и все это плавно настраивается ("сгибается") на разные размеры экрана.

  • в ряду из трех элементов flex прикрепите средний элемент к центру контейнера (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>

jsFiddle версия


на момент написания этой статьи нет упоминания о justify-self или justify-items на спецификация flexbox.

, в модуль выравнивания CSS Box, который является W3C незаконченное предложение по созданию общего набора свойств выравнивания для использования во всех моделях коробки, есть следующее:

enter image description here                                                                                                                         источник: W3C по

Вы заметите, что justify-self и justify-items рассматриваются... но не для flexbox.


я повторяя главный вопрос:

почему нет свойств" оправдать-предметы "и" оправдать-себя"?

5 ответов


методы выравнивания гибких элементов вдоль главной оси

как указано в вопросе:

для выравнивания элементов flex вдоль главной оси есть одно свойство:justify-content

чтобы выровнять элементы flex вдоль поперечной оси, есть три свойства:align-content, align-items и align-self.

затем вопрос задает:

почему нет justify-items и justify-self свойства?

один ответ может быть: потому что они не нужны.

на спецификация flexbox предоставляет два методы выравнивания элементов гибкого трубопровода по главной оси:

  1. на justify-content ключевое слово свойство и
  2. auto поля

оправдать-содержание

на justify-content свойство выравнивает элементы flex вдоль главной оси контейнера flex.

применяется к контейнеру flex, но влияет только на элементы flex.

существует пять вариантов выравнивания:

  • flex-start ~ детали гибкого трубопровода упакованы к началу линия.

    enter image description here

  • flex-end ~ детали гибкого трубопровода упакованы к концу линии.

    enter image description here

  • center ~ детали гибкого трубопровода упакованы к центру линии.

    enter image description here

  • space-between ~ Flex элементы равномерно первый элемент выровнен по одному краю контейнера, а последний-по противоположному краю. Края, используемые первым и последним элементами, зависят от flex-direction и записи режим (ltr или rtl).

    enter image description here

  • space-around ~ так же, как space-between за исключением пробелов половинного размера на обоих концы.

    enter image description here


Автополя

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

в отличие от justify-content, который применяется к контейнеру flex,auto поля идут на элементы flex.

они работают, потребляя все свободное пространство в указанном направлении.


выровнять группу гибкого трубопровода элементы справа, но первый элемент слева

сценарий из вопроса:

  • создание группы элементов flex align-right (justify-content: flex-end) но первый элемент выровнять слева (justify-self: flex-start)

    рассмотрим раздел заголовка с группой элементов навигации и логотипом. С justify-self логотип может быть выровнен влево, в то время как элементы навигации остаются далеко справа, и все это плавно настраивается ("сгибается") на отличающийся размер экрана.

enter image description here

enter image description here


другие полезные сценарии:

enter image description here

enter image description here

enter image description here


поместите гибкий элемент в углу

сценарий от вопрос:

  • размещение элемента flex в углу .box { align-self: flex-end; justify-self: flex-end; }

enter image description here


центр гибкий элемент по вертикали и горизонтали

enter image description here

margin: auto альтернатива justify-content: center и align-items: center.

вместо этого кода на контейнере flex:

.container {
    justify-content: center;
    align-items: center;
}

вы можете использовать это на flex пункт:

.box56 {
    margin: auto;
}

эта альтернатива полезна, когда центрирование элемента flex, который переполняет контейнер.


центрируйте гибкий элемент и центрируйте второй гибкий элемент между первым и краем

контейнер flex выравнивает элементы flex, распределяя свободное пространство.

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

в приведенных ниже примерах невидимые третьи гибкие элементы (коробки 61 и 68) вводятся для балансировки "реальных" элементов (коробка 63 и 66).

enter image description here

enter image description here

конечно, этот метод не является чем-то большим с точки зрения семантики.

кроме того, вы можете использовать псевдо-элемент вместо фактического элемента DOM. Или вы можете использовать абсолютное позиционирование. Здесь рассматриваются все три метода:центр, а дно выровнять элементы изгибают

Примечание: приведенные выше примеры будут работать только-с точки зрения истинного центрирования-когда внешние элементы равны высоте / ширине. Если элементы flex имеют разную длину, см. Следующий пример.


центр гибкий элемент, когда соседние элементы различаются по размеру

сценарий из вопроса:

  • в ряду из трех элементов flex прикрепите средний элемент к центру контейнера (justify-content: center) и выровнять прилегающую элементы к краям контейнера (justify-self: flex-start и justify-self: flex-end).

    обратите внимание, что значения space-around и space-between on justify-content свойство не будет держать средний элемент по центру относительно контейнера, если соседние элементы имеют разную ширину (посмотреть демо).

как уже отмечалось, Если все элементы flex имеют одинаковую ширину или высоту (в зависимости от flex-direction), средний элемент не может быть действительно по центру. Эта проблема делает сильный случай для justify-self property (предназначен для обработки задачи, конечно).

#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 позволяет абсолютное позиционирование элементов flex. Это позволяет идеально центрировать средний элемент независимо от размера его братьев и сестер.

просто имейте в виду, что, как и все абсолютно позиционированные элементы, элементы удаляются из документооборот. Это означает, что они не занимают места в контейнере и могут перекрывать своих братьев и сестер.

в примеры ниже, средний элемент центрируется с абсолютным позиционированием, а внешние элементы остаются в потоке. Но тот же макет может быть достигнут в обратном порядке: центр среднего элемента с justify-content: center и абсолютно позиционировать внешние элементы.

enter image description here

решение #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) теперь является элементом flex.
  • каждого .box пункт дается flex: 1 распределить космос контейнера поровну.
  • теперь элементы потребляют все пространство в строке и имеют одинаковую ширину.
  • Сделайте каждый элемент (вложенным) контейнером flex и добавьте justify-content: center.
  • теперь каждый span элемент представляет собой центрированный сгиб пункт.
  • использовать flex auto поля для смещения внешнего spans влево и вправо.

вы также можете отказаться justify-content и использовать auto поля исключительно.

но justify-content можете работать здесь, потому что auto поля всегда имеют приоритет. Из спецификации:

8.1. Выравнивание с auto поля

до выравнивания с помощью justify-content и align-self любой положительное свободное пространство распределяется на автоматические поля в этом измерении.


оправдать-содержание: пространство-же (концепция)

возвращаясь к justify-content на минуту, вот идея для еще одного варианта.

  • space-same ~ гибрид space-between и space-around. Элементы Flex равномерно расположены (например,space-between), за исключением вместо пробелов половинного размера на обоих концах (например space-around), полноразмерные космосы на обоих концах.

эта компоновка может быть достигнута с помощью ::before и ::after псевдо-элементы на контейнере flex.

enter image description here

(кредит: @oriol для кода и @crl на этикетке)

обновление: браузеры начали реализацию space-evenly, который выполняет выше. См. этот пост для деталей: равное пространство между элементами flex


детская площадка (включает код для всех приведенных выше примеров)


Я знаю, что это не ответ, но я хотел бы внести свой вклад в этот вопрос, чего бы это ни стоило. Было бы здорово, если бы они могли освободить justify-self для flexbox, чтобы сделать его действительно гибким.

Я считаю, что когда есть несколько элементов на оси, наиболее логичный способ для justify-self вести себя-это выровнять себя с ближайшими соседями (или краем), как показано ниже.

Я действительно надеюсь, что W3C заметит это и, по крайней мере, рассмотрит его. =)

enter image description here

таким образом, вы можете иметь элемент, который действительно центрирован независимо от размера левого и правого поля. Когда одна из коробок достигает точки центральной коробки, она просто толкает ее, пока не останется места для распределения.

enter image description here

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

enter image description here


это было задано в списке www-style и Tab Atkins (редактор спецификаций) предоставил ответ, объясняющий, почему. Я поподробнее здесь.

для начала предположим, что наш контейнер flex является однострочным (flex-wrap: nowrap). В этом случае есть явная разница в выравнивании между главной осью и поперечной осью-есть несколько элементов, уложенных на главной оси, но только один элемент, уложенный на поперечной оси. Так что имеет смысл иметь настраиваемый для каждого элемента "align-self" в поперечной оси (поскольку каждый элемент выровнен отдельно, самостоятельно), тогда как он не имеет смысла в главной оси (поскольку там элементы выровнены вместе).

для многострочного flexbox та же логика применяется к каждой "гибкой линии". В данной строке элементы выравниваются индивидуально по поперечной оси (поскольку в поперечной оси есть только один элемент на строку), а в основной оси-коллективно.


вот еще образно говоря: так, все на *-self и *-content свойства о том, как распределить дополнительное пространство вокруг вещи. Но ключевое различие заключается в том, что *-self версии для случаев, когда есть только одна вещь в этой оси и *-content версии для Когда потенциально многие вещи в этой оси. Сценарии одно-и много-вещей-это разные типы проблем, и поэтому у них разные типы опций имеется, например,space-around / space-between значения имеют смысл для *-content, а не *-self.

Итак: в главной оси flexbox есть много вещей, чтобы распределить пространство вокруг. Так *-content свойство имеет смысл там, но не *-self собственность.

напротив, в поперечной оси у нас есть оба *-self и *-content собственность. Один определяет, как мы будем распределять пространство вокруг много гибкие линии (align-content), тогда как другие (align-self) определяет, как распределить пространство вокруг отдельные flex элементы в поперечной оси, в пределах данной линии flex.

(я игнорирую *-items свойства здесь, так как они просто устанавливают значения по умолчанию для *-self.)


здесь justify-self, но в Chrome Canary, а не в стабильной версии Chrome. Есть даже justify-items:

enter image description here

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


здесь justify-items.

Я думаю, что это новая функция. Совместимость браузера несколько отсутствует.