У меня есть ряд элементов произвольной ширины. Они центрированы внутри контейнера (обратите внимание на пробелы с левой и правой сторон красного контейнера):
Иногда контейнер становится меньше, чем ширина всех элементов:
Когда это произойдет, я хочу, чтобы элементы в конце были перенесены в следующую строку следующим образом:
Для меня очень важно, что содержимое каждой строки должно быть выровнено по левому краю, но сетка в целом должна быть по центру :
Первоначально я пытался реализовать это с помощью FlexBox. После многих разочарований и выдергивания волос я понял, что это невозможно с FlexBox: { ссылка }
Другой ответ на той же странице предлагает использовать сетку CSS вместо flexbox. .
CSS grid дает немного другой результат, но меня это тоже устраивает:
Вот код, который делает это работа:
.red-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(210px, max-content));
justify-content: center;
}
Этот код содержит множество ключевых слов, которые я не понимаю: grid-template-columns
, repeat
, auto-fit
, minmax
и max-content
. Я попытался их прочитать, но потерпел неудачу. Ни одно из руководств и документов API не объясняет, как работает эта конкретная комбинация. Документы MDN слишком короткие и шифрованные c.
То, с чем я особенно борюсь с , - это 210px
magi c номер. Зачем это нужно? (Эм, я знаю, что это необходимо, потому что спроектирован SP c, но это не помогает мне понять.)
Размеры элементов в моей сетке произвольны, поэтому я не могу использовать фиксированный стоимость. Кроме того, установка этого фиксированного значения немного ухудшает результат: мелкие элементы растут, а большие - переполняют контейнер.
По сути, я хочу:
grid-template-columns: repeat(auto-fit, minmax(min-content, max-content));
, но это правило распознается браузерами как ошибочное.
Я наткнулся на этот ответ это объясняет, что использование min-content
и max-content
вместе запрещено SPE c в этом контексте. Предлагаемое решение - использовать Flexbox!
Л oop закрылся. Я вернулся к тому, с чего начал, ожидаю, что у меня теперь не хватает волос на голове для следующего раунда.
Как мне центрировать сетку, выравнивая по левому краю содержимое каждой строки, с элементами произвольной ширины?
Вот шаблон, с которым можно поиграть для вашего удобства: https://jsbin.com/vuguhoj/edit?html, css, вывод
Размер контейнера можно изменить, перетащив его за правый нижний угол.
PS Нет display: inline
и float: left
Пожалуйста.
.page {
border: 1px solid black;
overflow: hidden;
resize: horizontal;
max-width: 500px;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(max-content, 50px));
justify-content: center;
}
.item {
border: 1px solid black;
margin: 1px;
}
<div class="page">
<div class="grid">
<div class="item">
Foofoofoo
</div>
<div class="item">
Bar
</div>
<div class="item">
BazBaz
</div>
<div class="item">
QuuxQuuxQuux
</div>
</div>
</div>