Web制作をしていると、「このレイアウト、どうやって実装すればいいんだろう?」と悩むことはありませんか?
HTMLやCSSの基本は知っているけれど、レイアウトを組む方法がいまいちわからない、あるいは 「いつもFlexboxしか使っていないけど、他にもっと適した方法があるのでは?」 と考えたことがある人もいるかもしれません。
この記事では、CSSのレイアウト方法を具体的なシチュエーションごとに紹介し、どのプロパティをどのように使えばよいのかを解説します。 「なんとなくやっているけど、もっと適切な方法を知りたい!」 という方にぴったりな内容ですので、ぜひ参考にしてください。
1. どんな場合にどのレイアウトを使うべきか?
① シンプルな1列・2列レイアウト(Flexbox)
使うシチュエーション:
- ブログ記事の本文エリア
- 商品ページなどのシンプルなコンテンツエリア
- サイドバーとメインコンテンツを並べる
使い方:
display: flex;
を使うと、flex-direction: column;
で縦並び、flex-direction: row;
で横並びにできます。
.container {
display: flex;
flex-direction: row; /* 横並び(2列) */
}
.sidebar {
width: 30%;
background-color: lightgray;
padding: 10px;
}
.main-content {
width: 70%;
background-color: lightblue;
padding: 10px;
}
サンプル:
サイドバーとメインコンテンツが横並びになります。
② 複数の要素を均等配置するナビゲーションバー(Flexbox)
使うシチュエーション:
- グローバルナビゲーション
- フッターメニュー
- ボタンを横並びにしたいとき
使い方:
justify-content: space-between;
を指定すると、要素が均等に配置されます。
.navbar {
display: flex;
justify-content: space-between;
background-color: black;
padding: 10px;
}
.navbar a {
background-color: gray; /* クリック領域を視覚化 */
color: white;
text-decoration: none;
padding: 5px 10px;
border-radius: 4px;
}
サンプル:
黒い背景のナビゲーションバーの両端にメニューが配置されます。
③ カード型のグリッドレイアウト(CSS Grid)
使うシチュエーション:
- 商品一覧ページ
- ブログのサムネイル表示
- 写真ギャラリー
使い方:
grid-template-columns
で列を指定し、gap
で要素の間隔を調整します。
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}
.card {
background-color: lightgray;
padding: 20px;
text-align: center;
}
サンプル:
3つのカードが均等に配置されます。
④ サイドバー付きのレイアウト(CSS Grid / Flexbox)
使うシチュエーション:
- サイドバー + メインコンテンツの配置
- 管理画面などの2カラムレイアウト
使い方(CSS Grid):
.container {
display: grid;
grid-template-columns: 280px 1fr;
}
.sidebar {
background-color: lightgray;
padding: 10px;
}
.main-content {
background-color: lightblue;
padding: 10px;
}
サンプル:
サイドバーとメインコンテンツが、グリッドで配置されます。
⑤ コンテンツの高さを揃える(Flexbox)
使うシチュエーション:
- カラムレイアウトで高さを統一したいとき
使い方:
align-items: stretch;
を指定すると、子要素の高さが揃います。
.container {
display: flex;
align-items: stretch;
gap: 16px; /* ボックスの間に余白を追加 */
}
.box {
background-color: lightcoral;
padding: 20px;
flex: 1;
}
サンプル:
各ボックスの高さが統一されます。
⑥ 縦横中央揃え(Flexbox / CSS Grid)
使うシチュエーション:
- ボタンやテキストを真ん中にしたいとき
- ローディング画面
使い方(Flexbox):
.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.content {
background-color: lightgreen;
padding: 30px;
border-radius: 8px;
text-align: center;
}
サンプル:
ページ全体の中央に要素が配置されます。
⑦ 画像の回り込み(float)
使うシチュエーション:
- テキストの横に画像を配置したい場合
使い方:
.image {
float: left;
margin-right: 16px;
width: 20%;
}
サンプル:
画像がテキストの左側に配置され、回り込みます。
⑧ 特定の要素をスクロールに追従させる(position: sticky)
使うシチュエーション:
- 目次を固定したいとき
- スクロール時にヘッダーを固定したいとき
使い方:
.header {
position: sticky;
top: 0;
background-color: #f0f8ff; /* 淡いブルー */
padding: 10px;
border-bottom: 1px solid #ccc;
z-index: 10;
}
.content {
padding: 20px;
line-height: 1.6;
}
サンプル:
スクロールしてもヘッダーが画面上部に固定されます。
⑨ ページ全体を中央寄せ(margin: auto;)
使うシチュエーション:
- レスポンシブデザインで幅を制限したいとき
使い方:
.container {
max-width: 800px;
margin: 0 auto;
}
サンプル:
⑩ レスポンシブデザインの切り替え(media queries)
使うシチュエーション:
- スマホとPCでレイアウトを変えたい場合
使い方:
.container {
display: flex;
gap: 16px;
}
.box {
background-color: lightseagreen;
padding: 20px;
flex: 1;
text-align: center;
color: white;
}
@media (max-width: 768px) {
.container {
flex-direction: column;
}
}
サンプル:
画面サイズが768px以下になると、レイアウトが1カラムになります。
2. ちょっと変わった使い方&便利なテクニック
① grid-auto-flow: dense;
で隙間なく配置する
通常の CSS Grid では、空きスペースができることがありますが、grid-auto-flow: dense;
を使うと、自動で要素を詰めてくれます。
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-flow: dense;
gap: 10px;
}
.item {
background-color: lightsteelblue;
padding: 20px;
text-align: center;
font-weight: bold;
}
.item:nth-child(2) {
grid-column: span 2;
}
サンプル:
grid-auto-flow: dense;
を指定すると、隙間なく要素が詰められます。
② CSSだけで高さゼロからスライドダウンするメニューを作る
max-height
と overflow: hidden;
を使うと、JavaScript なしで開閉できるメニューを作成できます。
.menu {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease-in-out;
background-color: lightgray;
padding: 0 10px;
}
.menu.open {
max-height: 200px;
padding: 10px;
}
.menu ul {
margin: 0;
padding: 0;
list-style: none;
}
.menu li {
padding: 5px 0;
}
サンプル:
メニューがゆっくりスライドダウンします。
③ aspect-ratio
を使って画像や要素の比率を維持する
通常、画像の比率を維持するには padding-top
などを使う必要がありましたが、aspect-ratio
を使うと簡単に実現できます。
.box {
width: 50%;
aspect-ratio: 16 / 9;
background-color: lightgray;
display: flex;
justify-content: center;
align-items: center;
font-weight: bold;
}
サンプル:
要素の比率が16:9に固定されます。
④ object-fit: cover;
で画像をレスポンシブにトリミング
画像を枠いっぱいに表示したいときに便利です。
img {
width: 100%;
height: 200px;
object-fit: cover;
}
.image-wrapper {
width: 50%; /* 画面幅の50%で表示(任意) */
margin: 0 auto;
}
サンプル:
画像が枠内に綺麗に収まります。
⑤ position: absolute;
を利用してテキストを画像の上に配置
position: absolute;
を使うと、画像の上にテキストを簡単に配置できます。
.container {
position: relative;
width: 50%;
margin: 0 auto;
}
.container img {
width: 100%;
height: 200px;
object-fit: cover;
}
.text-overlay {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
background-color: rgba(0, 0, 0, 0.5);
padding: 10px;
}
サンプル:
画像の中央にテキストが表示されます。
⑥ clip-path
を活用して要素を自由な形に切り抜く
clip-path
を使うと、CSSだけで要素の形を変えることができます。
.clip-box {
width: 200px;
height: 200px;
background-color: lightblue;
clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
margin: 40px auto;
}
サンプル:
要素が三角形に切り抜かれます。
⑦ overflow: hidden;
を活用してスクロールを制御する
スクロールさせたくない場合に便利です。
.outer-box {
width: 300px;
height: 100px;
background-color: lightgray;
overflow: hidden; /* はみ出す部分を非表示に */
border: 2px solid #ccc;
margin: 40px auto;
}
.inner-box {
width: 100%;
height: auto;
font-size: 16px;
line-height: 1.6;
}
サンプル:
はみ出た部分が非表示になります。
まとめ
CSSのレイアウトは、「どの場面でどの手法を使うか」 を理解すると、よりスムーズに組めるようになります。
- シンプルなレイアウトには Flexbox
- グリッド状に整列させたいときは CSS Grid
- ヘッダーを固定したいなら position: sticky
- 画像を綺麗にトリミングするなら object-fit
- 特殊な形にしたいなら clip-path
といったように、それぞれの特性を活かせば、より柔軟にレイアウトを組むことができます。
「いつも同じ方法でしか組んでいないな…」という方は、ぜひ今回紹介したテクニックを試してみてください。
ちょっとした工夫で、もっと美しく、メンテナンスしやすいレイアウトを作れるようになりますよ!