В 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-betweenonjustify-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поля для смены внешнегоspans слева и справа.вы также можете отказаться
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.Я думаю, что это новая функция. Совместимость браузера несколько отсутствует.



















