HTML/CSS
投稿日:

いまさら聞けない!CSSでレイアウトを決めるプロパティと具体的な使い方

コーディング代行・フロントエンド開発はファストコーディング

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-heightoverflow: 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

といったように、それぞれの特性を活かせば、より柔軟にレイアウトを組むことができます。

「いつも同じ方法でしか組んでいないな…」という方は、ぜひ今回紹介したテクニックを試してみてください。
ちょっとした工夫で、もっと美しく、メンテナンスしやすいレイアウトを作れるようになりますよ!