自動で折り返し、良い感じに幅が伸縮するリストを作る
結論
cssなら
css.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
gap: 10px;
}
tailwindなら
ts <ul className="grid grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] gap-4">
<li>..</li>
...
</ul>
特徴
Containerのサイズによって、列数が変わる
1行に、何列表示するかは指定しない
Itemの幅の最小値を指定する
自動で折り返す
1行でも画面幅いっぱいに広がる
複数行になってもスタイルが崩れない
適当な隙間がある
Itemは左詰めになるとかではなく、Container幅全体に分布する
mediaqueryを使わない
flex
を使った場合、以下の要件を満たしたいイメージ
Containerは以下を満たす
flex
flex-wrap
justify-between
gap
Itemは以下を満たす
grow
最終列も、他の行に従う
flex
だとここの実現が難しい

mediaqueryは使いたくない
しかし、flexでやるのは難しい
afterとかbeforeとか使えば出来るらしいが、hack感が漂う
上がGrid、下がFlex
Flexは一方向しか扱えない
2列以上になった際に、最終列が、1列の時と同じ挙動になってしまう
逆に言えば、最終列を、上の列と同じように配置することが出来ない
Gridを使うことで、行と列を同時に扱うことが出来る
懸念点
アイテムが少ない時にめちゃくちゃ伸びてしまう
girdのやつの問題点
minmax(px, fr)
の px
よりも、viewport幅が狭い場合に、はみ出る
flex-basisならこれを解決できる