作成日:2024-06-17
grid cssを学び直してみました。
cssで縦や、横並びににする方法で昔はflot,その後flexとgridが一般的に使われている。
今回はGridについて学びなおしてみました。
まず,グリッドとはどういうものなのか。 一言でいうと、excel表のようなテーブルを作るものです。
必ず知っておかなければならないことは、gridの使い方は縦と横(行と、列)の数とサイズを指定すると言う事です。
明示的、暗黙的グリッドがある。
以下例として、縦と横の2x2のグリッドを作成しました。
.Grid{
display: grid;
grid-template-columns: 100px 100px;
grid-template-rows: 50px 50px;
gap: 10px;
}
このように
のグリッドが生成されます。
横に4つ、縦に1つのグリッドの場合は次のようになります。
.Grid{
display: grid;
grid-template-columns:100px 100px 100px 100px;
grid-template-rows: 50px;
gap: 10px;
}
基本的なgridの使い方はこのようにサイズと数を指定してグリッドを作成します。
明示的グリッドとは、girdでサイズと数を決めたのち、その範囲内にitemを入れることです。
しかし、グリッドの数を超えるitem数だった場合でも問題ありません。この超えた分は暗黙的グリッドと呼ばれます。
繰り返しになりますが、横に50,100,60,100サイズの4行
縦に1列50pxのテーブルを作成します。
.Grid{
display: grid;
grid-template-columns: 50px 100px 60px 100px;
grid-template-rows: 50px;
gap: 10px;
}
これが明示的グリッドです。 縦に1x4のテーブルがあり、itemも4つ配置しています。
では暗黙的グリッドとは何ぞや?
明示的グリッド以外の事を指します。
要するにcssで指定していない部分を指します。
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 50px;
gap: 10px;
1x3のグリッドを作成しましたが、item数が4であるためitem4がはみ出ています。
このitem4の状態を暗黙的グリッドと呼びます。
暗黙的グリッドは使ってはだめという話ではなく暗黙的グリッドになってしまった場合はレイアウトが崩れてしまう。これだけ知っておけばとりあえずOK。 itemの数が明確であれば、このように指定します。
明示的グリッドはどんな時に使うのか?
縦と横の数が明確に分かっていて、変動しない場合使います。
明示的グリッドを実際に使って行きましょう!
次の画像のように並べるには?
itemの位置を指定することで上記の並びにすることができます。
gridは行と列の番号をしてすることで位置を指定することができます。
<div className='Grid'>
<div className='Griditem Griditem1'>item1</div>
<div className='Griditem'>item2</div>
<div className='Griditem'>item3</div>
<div className='Griditem'>item4</div>
</div>
.Grid{
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 50px 50px;
gap: 10px;
}
.Griditem{
background-color: antiquewhite;
}
.Griditem1{
grid-column: 1/4;
grid-row: 1/2;
}
item1のcssに「grid-column」「grid-row」を指定しています。
次のcssの意味は?
.Griditem1{
grid-column: 1/4;
}
gridの1から4の間に配置するという意味です。
4-1= 3マス分配置していることになります。
つまり次のようにした場合は
.Griditem1{
grid-column: 2/4;
grid-row: 1/2;
}
2番目から4-2=2マス分配置するという意味になります。
もちろんグリッドの数を指定しているため綺麗に並びますが、それを超える場合はレイアウトが崩れてます。
.Grid{
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 50px 50px;
gap: 10px;
}
.Griditem1{
grid-column: 2/5;
grid-row: 1/4;
}
暗黙的グリッドだとレイアウトが崩れる。
レイアウトが崩れないように明示的グリッドにしたいが、itemの数が不明確、変動してしまう場合はどうすればいいのか?
その前に変動的な横や縦のサイズの指定方法を解説します。
縦と横のサイズは100pxなど、サイズを記入すればできる。pxの単位以外でも実装することができます。
<div className='Grid'>
<div className='Griditem Griditem1'>item1</div>
<div className='Griditem'>item2</div>
<div className='Griditem'>item3</div>
<div className='Griditem'>item4</div>
<div className='Griditem'>item5</div>
<div className='Griditem'>item6</div>
<div className='Griditem'>item7</div>
<div className='Griditem'>item8</div>
</div>
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns:10vw 1fr calc(20px + 10%) 20% 9rem;
grid-template-rows: 50px 50px;
gap: 10px;
}
windowサイズの10/100
余りのサイズ
10%+20px
gridの横幅の20%
ルートサイズの9倍
cssのサイズ単位上記のように全て使うことができます。それでここで注目してほしい単位が「fr」です。
frは余った空間の単位になります。gridレイアウトを使う上でこの単位は必須です。
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns:1fr 2fr 2fr;
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
frは余りのサイズを利用します。
のサイズになります。
frは余った余白を利用します。
そのため80%とすると、残りの20%を利用します。
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns:80% 2fr 2fr;
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
グリッドの数が変動する場合は「auto-fill」と「auto-fit」を使う。セットでrepeatも使用します。
auto-fillとauto-fixの違いは、余りの部分の活用方法が異なります。
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns: repeat(auto-fill,100px);
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns: repeat(auto-fill,100px);
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
固定で100pxとしていますが、minmaxを利用することで次のようになります。
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns: repeat(auto-fill,minmax(200px,1fr));
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns: repeat(auto-fit,minmax(200px,1fr));
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
適材適所だが、どちらかと言えば実用的な方はauto-fitだと思う。余白出てしまう場合はitemのサイズを大きくし、余白を無駄なく使う。
fillの場合は余白を使わないため、中央揃えにし左右に余白を持たすことができる。
minmaxを使う必要があるのか?
minmaxを使った場合と使わなかった場合
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns: repeat(auto-fill,minmax(500px,1fr));
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
.Grid{
width: 90vw;
margin: 0 auto;
margin-top: 100px;
display: grid;
grid-template-columns: repeat(auto-fill , 500px);
grid-template-rows: 50px 50px 50px;
gap: 10px;
}
minmaxを使った場合はサイズが伸び縮みし、使用しない場合はサイズが合わなければ改行される。
gridを使えば数が変動しても対応しやすい。
auto-fillとauto-fit、frの3つを覚えておけばgridに関してはとりあえず困らないだろう。たぶん...
長くなったため、記事を分けます。
max-contentやsubgridもあり...どうしましょう
質問や、間違いがありましたら、お気軽にどうぞ
※お名前とコメントの内容を入力してください。
※全てこのブログ上に公表されます。
※許可なく管理者によって修正・削除する場合がございます。 詳しくはプライバシーポリシーを参照ください