結論

CSSとは、HTMLで書いたWebページの色・文字・配置などの見た目を指定する言語です。HTMLが「中身と構造」、CSSが「見た目」を受け持ちます。

この記事でわかること

  • 書き方の3要素と、書く場所3つの比較表
  • CSSを8段階で足して測った表示の変化の実物
  • CSSが効かない原因12例と、直し方の表

2026年10月23日更新|Chromium 141で表示して確認

ブラウザは、HTML(中身と構造)と CSS(見た目)を組み合わせて画面を描きます。動きを足すのが JavaScript です。

flowchart TD
    H[HTML<br>中身と構造] --> B[ブラウザ<br>組み合わせる]
    C[CSS<br>見た目] --> B
    J[JavaScript<br>動き] --> B
    B --> S[画面に表示]

急いでいる人向けに、よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
CSS とは Web ページの見た目を指定する言語 CSSとは
読み方・正式名 シーエスエス。Cascading Style Sheets CSSとは
HTML との違い HTML は中身と構造、CSS は見た目 HTMLとの違い
書き方 セレクタ { プロパティ: 値; } 書き方
どこに書く 外部ファイル(.css)が基本 書く場所3つ
ぶつかったら !important → style属性 → 詳細度 → 後に書いた方 カスケードと詳細度
横に並べる display: flex か display: grid レイアウト
効かないとき 打ち間違い・全角・セレクタ違い・詳細度負け 効かない原因

確認環境:Ubuntu 24.04 上の Chromium 141.0.7390.37(Python の Playwright から操作)で、同じ HTML に CSS を1つずつ足して表示し、getComputedStyle(ブラウザが最終的に使った値を返す JavaScript の関数)と要素の位置・大きさを測りました。CSS ファイルは Python 3.11.15 の http.server で配り、404 と Content-Type が text/plain の場合も確かめました。仕様の説明は MDN Web Docs(日本語版)と W3C の CSS Snapshot 2026、DevTools の説明は Chrome for Developers で確かめました(確認日 2026年10月23日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「CSSとは|HTMLとの違い・書き方・効かない原因を実例で解説」

CSSとは(意味・読み方・できること)

この節では、CSS という言葉の意味と、CSS で何ができるのかが分かります。

CSS(シーエスエス)は Cascading Style Sheets(カスケーディング・スタイル・シート)の略で、Web ページの見た目を指定するための言語です。 MDN Web Docs は、CSS を Web ページの見た目を制御するスタイル言語と説明しています。「スタイルシート」は見た目の指定書、「カスケーディング」は、いくつもの指定が重なったときに、決まった順番で上から流れ落ちるように1つに決まる仕組みを指します(後の節で実物を見ます)。

CSS のファイルは拡張子 .css のテキストファイルで、サーバーからは text/css という種類(MIME タイプ)で送られます。メモ帳や VS Code などのテキストエディタで作れます。

1文字を整える

色・大きさ・太さ・行の高さ・書体・中央寄せ。見出しを紺色の 24px にする、など。

2余白と枠をつける

要素の内側と外側の余白、枠線、角丸、影、背景の色や画像。

3並べる(レイアウト)

カードを横に3つ並べる、ヘッダー・本文・サイドバーに分ける。Flexbox と Grid を使う。

4画面の幅で変える

パソコンでは3列、スマホでは1列。メディアクエリで切り替える(レスポンシブ)。

5動きをつける

マウスを乗せたら色が変わる、ふわっと表示する。transition と animation。

6まとめて変える

1つの CSS ファイルを全ページで読み込めば、1か所を直すだけでサイト全体の色が変わる。

CSS を書かなくても、ページには最低限の見た目が付いています。 ブラウザが自分の既定の CSS を持っているからです。何も CSS を書かないページを Chromium で開いて測ると、次の値でした。

要素 ブラウザの既定の見た目(実測)
body(ページ全体) 外側の余白 8px、文字 16px、黒 rgb(0, 0, 0)
h1(大見出し) 文字 32px、太字(700)、上の余白 21.44px
p(段落) 上下の余白 16px
ul(リスト) 左の内側の余白 40px、先頭に黒丸(disc)
a(リンク) 青 rgb(0, 0, 238)、下線あり

「見出しが大きい」「リンクが青くて下線がある」のは HTML の働きではなく、ブラウザの既定の CSS です。自分で CSS を書くと、この既定の見た目を上書きできます。

HTMLとCSSの違い(役割分担)

この節では、HTML と CSS がそれぞれ何を受け持つのかと、分けて書く理由が分かります。

HTML は「これは見出し」「これは段落」という中身と構造を、CSS は「見出しは紺色で 24px」という見た目を書きます。 家にたとえると、HTML は柱や部屋の間取り、CSS は壁紙や家具の配置です。間取りを変えずに壁紙だけを張り替えられるように、HTML を変えずに CSS だけで見た目を変えられます。

HTML(中身と構造)

<h1>今日のおすすめ</h1> のように、タグで意味を付ける

検索エンジンや読み上げソフトは、この構造を手がかりに内容を理解する

拡張子は .html

CSS(見た目)

h1 { color: navy; } のように、どの要素をどう見せるかを書く

同じ HTML でも、CSS を差し替えれば別のデザインになる

拡張子は .css

比べること HTML CSS JavaScript
受け持つもの 中身と構造 見た目 動き・処理
書く例 見出し・段落・リンク・画像 色・大きさ・余白・配置 ボタンを押したら開く
ファイル .html .css .js
分類 マークアップ言語 スタイルシート言語 プログラミング言語

見た目を CSS に分けておくと、直す場所が1か所になります。 たとえば 50 ページあるサイトで見出しの色を変えるとき、各ページの HTML に色を書いていれば 50 か所を直しますが、共通の CSS ファイルに書いていれば1行を直すだけです。

CSSの書き方(セレクタ・プロパティ・値)

この節では、CSS の1つのルールがどんな部品でできているのかが分かります。

CSS は「どの要素に(セレクタ)」「何を(プロパティ)」「どうする(値)」の3つで書きます。 波かっこ { } の中に「プロパティ: 値;」を並べます。

h1 {
  color: navy;      /* 文字の色を紺色に */
  font-size: 24px;  /* 文字の大きさを24pxに */
}
部品 上の例では 意味
セレクタ h1 どの要素に当てるか
宣言ブロック { ... } 指定をまとめる波かっこ
プロパティ color・font-size 何を変えるか
値 navy・24px どう変えるか
宣言 color: navy; プロパティと値の組。最後に ;
コメント /* ... */ メモ。表示には影響しない

書くときの決まりは次のとおりです。

  • プロパティと値の間は半角の :(コロン)、宣言の終わりは半角の ;(セミコロン)。
  • コメントは /* */ だけ。// は CSS のコメントではありません(後の節で、// を書いたルールが丸ごと消える実物を見ます)。
  • 改行や半角スペースの数は自由です。全角のスペースや全角の記号は使えません。
  • 大きさには単位が要ります(24px)。0 だけは単位なしで書けます。

よく使うセレクタ

セレクタは「どの要素に当てるか」の選び方です。HTML の class 属性・id 属性と組み合わせて使います。

セレクタ 書き方 選ばれる要素
要素(型)セレクタ p すべての p 要素
クラスセレクタ .lead class="lead" の要素
ID セレクタ #intro id="intro" の要素(1ページに1つ)
子孫セレクタ .cards li .cards の中にある li
複数指定 h1, h2 h1 と h2 の両方
擬似クラス a:hover マウスが乗っているリンク
属性セレクタ input[type="email"] type が email の input
全称セレクタ * すべての要素

実際の Web 制作では、クラスセレクタを中心に使うのが一般的です。 同じ class を何か所にも付けられ、ID より上書きしやすいためです(理由は「カスケードと詳細度」の節で実物を見ます)。セレクタの全種類と :has()・ネストの書き方は、関連記事「CSSセレクタ一覧|:has()・ネスト対応の早見表と詳細度」で扱っています。

色と大きさの書き方(単位)

種類 書き方の例 意味
色の名前 navy・red 決められた色の名前
カラーコード #555・#ff8800 赤・緑・青を16進数で
rgb rgb(255 136 0) 赤・緑・青を0〜255で
px 16px 画面の点の数で決まる大きさ
em 1.5em その要素の文字の大きさの何倍か
rem 1.5rem ページの基準の文字の大きさ(html 要素)の何倍か
% 50% 親の要素に対する割合
vw・vh 100vw 画面の幅・高さの1% が 1

ブラウザは、書いた色を rgb の形に直して使います。navy は rgb(0, 0, 128)、#555 は rgb(85, 85, 85) として返ってきました。em は文字の大きさによって長さが変わります。h1 の上の余白は既定で 0.67em なので、文字が 32px のときは 21.44px、24px に変えると 16.08px になりました。

CSSを書く場所3つ(style属性・styleタグ・外部ファイル)

この節では、CSS を HTML のどこに書けるのかと、それぞれをいつ使うのかが比較表で分かります。

CSS を書く場所は、要素の style 属性、HTML の head にある style タグ、外部の .css ファイルの3つです。 サイトを作るときは、外部ファイルが基本です。

<!-- 1. style属性(インライン):その要素だけに効く -->
<p style="color: orange;">この段落だけオレンジ</p>

<!-- 2. styleタグ:このページだけに効く。head の中に書く -->
<style>
  p { color: green; }
</style>

<!-- 3. 外部ファイル:同じファイルを読み込んだ全ページに効く。head の中に書く -->
<link rel="stylesheet" href="css/style.css">
書く場所 効く範囲 使う場面 注意
style 属性 その要素だけ メールの HTML、試しに1か所だけ変える 上書きしにくい。同じ指定を何度も書くことになる
style タグ そのページだけ 1ページだけの練習・そのページ専用の指定 他のページで使い回せない
外部ファイル(.css) 読み込んだ全ページ Web サイト全般 href のパスの間違いで読み込まれない

同じ段落の色を、外部ファイル(p { color: red; font-size: 20px; })と style タグ(p { color: green; })と style 属性(color: orange)で同時に指定し、どれが勝つかを測りました。

読み込む順番 style属性なしの段落 style属性ありの段落
link(外部)→ style タグ 緑 rgb(0, 128, 0)・20px オレンジ rgb(255, 165, 0)・20px
style タグ → link(外部) 赤 rgb(255, 0, 0)・20px オレンジ rgb(255, 165, 0)・20px

外部ファイルと style タグは、どちらが強いということはなく、後に書いた方が勝ちました。 style 属性は、読み込む順番に関係なく勝ちました。ぶつからない指定(font-size: 20px)は、場所に関係なくすべて効いています。複数の指定が重なって1つに決まるのが「カスケード」です。

よく使うCSSプロパティ早見表

この節では、はじめに覚えると多くの見た目を作れるプロパティが一覧で分かります。

やりたいこと プロパティ 書き方の例
文字の色 color color: #333;
文字の大きさ font-size font-size: 16px;
文字の太さ font-weight font-weight: bold;
行の高さ line-height line-height: 1.8;
文字の左右の位置 text-align text-align: center;
書体 font-family font-family: sans-serif;
背景の色 background-color background-color: #f5f5f5;
内側の余白 padding padding: 16px;
外側の余白 margin margin: 0 auto;
枠線 border border: 1px solid #ccc;
角丸 border-radius border-radius: 8px;
幅・高さ width・height width: 300px;
最大の幅 max-width max-width: 960px;
表示の種類 display display: flex;
並べたときの間隔 gap gap: 12px;
影 box-shadow box-shadow: 0 2px 4px #0003;
下線を消す text-decoration text-decoration: none;
箇条書きの点を消す list-style list-style: none;

プロパティの数はとても多く、Chromium 141 で body 要素の getComputedStyle が返したプロパティは 406 個ありました。全部を覚えなくても、上の表の18個で、文字・余白・枠・並べ方の基本がそろいます。

CSSを1つずつ足して表示を確かめる(Chromiumでの実物)

この節では、同じ HTML に CSS を8段階で足していき、見た目の数値がどう変わるかを実物で確かめられます。

使った HTML は次のとおりです。CSS を書かない状態から始め、head の style タグにルールを1つずつ足しました。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CSSの練習</title>
<style>
  /* ここに1つずつ足していく */
</style>
</head>
<body>
<h1>今日のおすすめ</h1>
<p id="intro" class="lead">CSSで見た目を変えます。</p>
<ul class="cards">
  <li class="card">HTML</li>
  <li class="card">CSS</li>
  <li class="card">JavaScript</li>
</ul>
<a href="#">もっと見る</a>
</body>
</html>

8段階で足した CSS の全体です。

/* 1 */ h1 { color: navy; font-size: 24px; }
/* 2 */ .lead { color: #555; line-height: 1.8; }
/* 3 */ .card { width: 200px; padding: 16px; border: 2px solid #ccc; margin: 8px 0; }
/* 4 */ .card { box-sizing: border-box; }
/* 5 */ .cards { display: flex; gap: 12px; list-style: none; padding: 0; }
/* 6 */ .cards { display: grid; grid-template-columns: repeat(3, 1fr); } .card { width: auto; }
/* 7 */ @media (max-width: 600px) { .cards { grid-template-columns: 1fr; } }

ブラウザの画面の幅を 800px にして、段階ごとに getComputedStyle と getBoundingClientRect(要素の位置と大きさを返す関数)で測った値です。段階 7 だけは、幅 390px(スマホの幅)でも測りました。

0

CSSなし

h1 は 32px の黒、リストは黒丸つきで縦に並び、カードの幅は 744px(画面いっぱい)。

既定の見た目

1

h1 に色と大きさ

h1 が rgb(0, 0, 128) の 24px になり、高さが 44px から 32px に縮んだ。

要素セレクタ

2

class で段落

class="lead" の段落だけが rgb(85, 85, 85)、行の高さ 28.8px(16px × 1.8)になった。

クラスセレクタ

3

カードに幅・余白・枠

width は 200px なのに、見た目の幅は 236px になった(200+16×2+2×2)。

ボックスモデル

4

box-sizing: border-box

見た目の幅が書いたとおりの 200px になった。余白と枠は内側に収まる。

ボックスモデル

5

flex で横並び

3枚のカードが x=8・220・432 の位置に横一列。間隔は gap の 12px、黒丸も消えた。

Flexbox

6

grid で3等分

列の幅が 253.328px ずつの3列。784px から間隔 12px×2 を引いて3で割った値。

Grid

7

スマホは1列

幅 800px では3列のまま、幅 390px では列が 374px の1列になり、カードが縦に並んだ。

メディアクエリ

段階ごとの測定値(抜粋)です。rect は「左端の x・上端の y・幅・高さ」(px)です。

== 0 CSSなし @800
   h1 {"color": "rgb(0, 0, 0)", "font-size": "32px", "font-weight": "700", "margin-top": "21.44px", "rect": [8, 21, 784, 44]}
   ul {"display": "block", "padding-left": "40px", "list-style-type": "disc", "grid-template-columns": "none"}
   li:nth-child(1) {"width": "744px", "rect": [48, 124, 744, 18]}
   a {"color": "rgb(0, 0, 238)", "text-decoration-line": "underline", "display": "inline", "width": "auto"}
== 1 h1に色と大きさ @800
   h1 {"color": "rgb(0, 0, 128)", "font-size": "24px", "font-weight": "700", "margin-top": "16.08px", "rect": [8, 16, 784, 32]}
== 3 カードに幅・余白・枠 @800
   li:nth-child(1) {"width": "200px", "rect": [48, 109, 236, 54]}
   li:nth-child(2) {"rect": [48, 171, 236, 54]}
== 4 box-sizing @800
   li:nth-child(1) {"width": "200px", "rect": [48, 109, 200, 54]}
== 5 flexで横並び @800
   ul {"display": "flex", "padding-left": "0px", "list-style-type": "none", "grid-template-columns": "none"}
   li:nth-child(1) {"width": "200px", "rect": [8, 117, 200, 54]}
   li:nth-child(2) {"rect": [220, 117, 200, 54]}
   li:nth-child(3) {"rect": [432, 117, 200, 54]}
== 6 gridで3等分 @800
   ul {"display": "grid", "padding-left": "0px", "list-style-type": "none", "grid-template-columns": "253.328px 253.328px 253.328px"}
== 7 スマホは1列 @390
   ul {"display": "grid", "padding-left": "0px", "list-style-type": "none", "grid-template-columns": "374px"}
   li:nth-child(1) {"width": "374px", "rect": [8, 117, 374, 54]}
   li:nth-child(2) {"rect": [8, 199, 374, 54]}
   li:nth-child(3) {"rect": [8, 281, 374, 54]}

段階 3 で、上下に並んだカードの間は 8px でした(1枚目の下端 163、2枚目の上端 171)。 それぞれに上下 8px の margin を付けたので 16px になりそうですが、上下に隣り合うブロックの margin は大きい方の1つにまとまります(マージンの相殺)。段階 5 で flex にすると、margin のまとまりは起きず、並べ方は gap で決まりました。

ブラウザの画面で同じことを確かめるときは、開発者ツール(DevTools)を使います。 Chrome では、要素を右クリックして「検証(Inspect)」を選ぶと、Styles タブに当たっているルールが上書きされたものも含めて並び、Computed タブには実際に使われている値だけが出ます。使い方は、関連記事「Chrome DevToolsの使い方|デバッグ手順と便利機能一覧」で扱っています。

カスケードと詳細度(どのCSSが勝つか)

この節では、同じ要素に複数の指定がぶつかったとき、どれが使われるのかを実物で確かめられます。

同じ要素の同じプロパティに複数のルールが当たったとき、ブラウザは決まった順番で1つを選びます。 これが CSS の名前にある「カスケード」です。MDN の説明では、要素に当たるルールを集めたあと、オリジン(誰が書いたか)と重要度(!important)、詳細度、スコープの近さ、出現順の順に比べます。自分で書く CSS では、次の順に考えると判断できます。

flowchart TD
    A[同じプロパティに<br>複数の指定] --> B{片方だけ<br>!important}
    B -->|はい| W1[!important<br>が勝つ]
    B -->|いいえ| C{style属性}
    C -->|はい| W2[style属性<br>が勝つ]
    C -->|いいえ| D{詳細度に差}
    D -->|はい| W3[高い方<br>が勝つ]
    D -->|いいえ| W4[後に書いた<br>方が勝つ]

詳細度は、セレクタの強さを「ID の数-クラスの数-要素の数」の3つの数で表したものです。 MDN では ID-CLASS-TYPE の3列と説明されています。左の数が大きい方が強く、左が同じなら次の列で比べます。

セレクタ 詳細度(ID-CLASS-TYPE) 数え方
* 0-0-0 全称セレクタは数えない
p 0-0-1 要素1
ul li a 0-0-3 要素3。間の空白(結合子)は数えない
.lead 0-1-0 クラス1
p.lead 0-1-1 クラス1・要素1
a:hover 0-1-1 擬似クラスはクラスの列
.cards .card:hover 0-3-0 クラス2・擬似クラス1
#intro 1-0-0 ID1。クラスがいくつあっても勝つ
:where(#intro) 0-0-0 :where() の中は数えない

同じ段落(<p id="intro" class="lead">)に、ぶつかるルールを書いて色を測りました。

書いた CSS 結果の色 理由
p { color: red; } .lead { color: green; } 緑 0-1-0 が 0-0-1 に勝つ
#intro { color: blue; } .lead {...green} p {...red} 青 ID が勝つ。前に書いても勝つ
.lead { color: green; } .lead { color: purple; } 紫 詳細度が同じなので後の方
p.lead { color: teal; } .lead { color: green; } ティール 0-1-1 が 0-1-0 に勝つ
#intro { color: blue; } と style属性 color: orange オレンジ style属性が ID に勝つ
p { color: red !important; } #intro { color: blue; } 赤 !important が詳細度に勝つ
p { color: red !important; } と style属性 color: orange 赤 !important が style属性にも勝つ
== cascade 型<class | p { color: red; } .lead { color: green; } => rgb(0, 128, 0)
== cascade class<id(順序逆でも) | #intro { color: blue; } .lead { color: green; } p { color: red; } => rgb(0, 0, 255)
== cascade 同じ詳細度は後勝ち | .lead { color: green; } .lead { color: purple; } => rgb(128, 0, 128)
== cascade p.lead > .lead | p.lead { color: teal; } .lead { color: green; } => rgb(0, 128, 128)
== cascade style属性 vs id => rgb(255, 165, 0)
== cascade !important | p { color: red !important; } #intro { color: blue; } => rgb(255, 0, 0)
== cascade !important vs style属性 => rgb(255, 0, 0)

!important は、詳細度を無視して勝たせる強い指定です。 MDN は、詳細度を上書きするために !important を使うのは避けるべき習慣としています。!important を一度使うと、それをさらに上書きするために !important が増えていくためです。上書きしたいときは、まずセレクタの詳細度を上げるか、後に書く方法を考えます。詳細度の計算と !important が効かないときの直し方は、関連記事「CSS優先順位と詳細度の早見表|!importantが効かない原因と直し方」で扱っています。

継承(親の指定が子に伝わる)

color や font-family のように、親の要素に書いた値が子の要素に伝わるプロパティがあります。これを継承と呼びます。 body に色・書体・枠線を書いて、中の段落を測りました。

== 継承
   p {"color": "rgb(51, 51, 51)", "border-top-width": "0px", "border-top-style": "none", "font-family": "sans-serif"}

文字の色と書体は段落に伝わり、枠線は伝わりませんでした。文字に関わるプロパティ(color・font-size・font-family・line-height など)は継承され、箱に関わるプロパティ(border・margin・padding・width など)は継承されないものが多い、と覚えておくと、body に書いた指定がどこまで効くかを予想できます。

ボックスモデル(余白・枠・幅の関係)

この節では、CSS で幅や余白を指定したとき、要素の大きさがどう決まるのかが分かります。

CSS では、すべての要素を四角い箱として扱います。 箱は内側から、中身(content)・内側の余白(padding)・枠線(border)・外側の余白(margin)の4層でできています。

flowchart TD
    subgraph M[margin 外側の余白 ほかの要素との間]
        subgraph B[border 枠線]
            subgraph P[padding 内側の余白]
                C[content 中身<br>width と height はここ]
            end
        end
    end
層 プロパティ 背景の色が付くか 例
content(中身) width・height 付く 文字や画像が入る部分
padding(内側の余白) padding 付く 枠線と文字の間のすき間
border(枠線) border 枠線の色 箱の外周の線
margin(外側の余白) margin 付かない(透明) 隣の要素との間

標準では、width は中身の幅だけを指し、padding と border はその外側に足されます。 先ほどの段階 3 では、width: 200px・padding: 16px・border: 2px で、見た目の幅は 236px になりました。box-sizing: border-box を付けると、width が枠線までを含む幅になり、段階 4 のとおり 200px に収まります。MDN のボックスモデルの解説でも、border-box をすべての要素に当てる書き方が紹介されています。

html {
  box-sizing: border-box;
}
*,
*::before,
*::after {
  box-sizing: inherit;
}

箱の振る舞いは display の値で変わります。 段落や見出しは display: block(横幅いっぱいに広がり、前後で改行される)、リンクや span は display: inline(文字の流れの中に入る)です。リンク(a 要素)に width: 300px・height: 50px を書いて測ると、次のようになりました。

== inline width ['inline', '300px', 49, 17]
== inline-block width ['inline-block', '300px', 300, 50]

inline のままでは、指定は受け付けられても、実際の箱は文字の大きさの 49×17px のままでした。display: inline-block にすると 300×50px になりました。ボタンのようにリンクに大きさを付けたいときは、inline-block や block に変えます。margin と padding の使い分けとマージンの相殺は、関連記事「CSS marginとpaddingの違い|相殺と効かない原因一覧」で扱っています。

レイアウトの入口(FlexboxとGrid)

この節では、要素を横に並べる2つの方法と、どちらを使うかの目安が分かります。

要素を並べるには、親の要素に display: flex か display: grid を書きます。 子の要素に書くのではなく、並べたい要素を囲む親に書くのがポイントです。

並べる向き

Flexbox1方向(横一列か縦一列)に並べる
↔
Grid行と列の2方向のマス目に並べる

段階5の flex は1列、段階6の grid は3列のマス目になった

幅の決まり方

Flexbox中身や子の width から決まる
↔
Grid親で列の幅を決め、子はマスに入る

flex では各 200px、grid では 253.328px ずつの3等分だった

向いている部品

Flexboxメニュー・ボタンの横並び・中央寄せ
↔
Gridカードの一覧・ページ全体の枠組み

どちらも gap で間隔を指定できる

/* Flexbox:横一列に並べ、上下の中央をそろえる */
.menu {
  display: flex;
  align-items: center;
  gap: 12px;
}

/* Grid:同じ幅の3列に並べる */
.cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}

1fr は「残りの幅を等分した1つ分」という Grid の単位です。段階 6 では、本文の幅 784px から間隔 12px×2 を引いた 760px を3つに分け、1列 253.328px になりました。同じ部品を Flexbox と Grid の両方で作った比較は、関連記事「FlexboxとGridの使い分け|同じUIを両方で作り3つの画面幅で実測比較」で扱っています。

レスポンシブ(スマホとパソコンで見た目を変える)

この節では、画面の幅に合わせて CSS を切り替える書き方と、そのための前提が分かります。

@media (max-width: 600px) { ... } のように書くと、画面の幅が 600px 以下のときだけ中の CSS が効きます。 これをメディアクエリと呼び、1つの HTML でパソコンにもスマホにも合わせる作り方をレスポンシブデザインと呼びます。

.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }

@media (max-width: 600px) {
  .cards { grid-template-columns: 1fr; }  /* 600px以下は1列 */
}

段階 7 の実物では、幅 800px のときは 253.328px 253.328px 253.328px の3列、幅 390px のときは 374px の1列になり、カードの y 座標が 117・199・281 と縦に並びました。

書き方 効くとき
@media (max-width: 600px) 幅が 600px 以下
@media (min-width: 768px) 幅が 768px 以上
@media (min-width: 768px) and (max-width: 1023px) 768〜1023px
@media (prefers-color-scheme: dark) 端末がダークモード
@media print 印刷するとき

スマホでメディアクエリを効かせるには、HTML の head に viewport の meta タグを書きます。 MDN の説明では、この指定が無いと、モバイルのブラウザはたとえば 980px の仮想の幅でページを描いてから縮小することがあります。width=device-width は、端末の画面の幅でレイアウトさせる指定です。

<meta name="viewport" content="width=device-width, initial-scale=1">

スマホから先に CSS を書く「モバイルファースト」の考え方と、ブレークポイント(切り替える幅)の決め方は、関連記事「メディアクエリ ブレークポイント|2026年版の推奨値と書き方テンプレート」で扱っています。

CSSが効かない原因と直し方

この節では、「CSS を書いたのに見た目が変わらない」ときの原因を、実際に起こした結果つきで確かめられます。

ブラウザは、読めない宣言やルールを黙って捨てます。 エラーの画面は出ないので、書いたつもりの指定が捨てられていることに気づきにくくなります。わざと間違えた CSS を読み込ませ、ブラウザがどう読んだか(document.styleSheets の cssText)と段落の色を測りました。

== bad プロパティ名の打ち間違い | 'p { colr: red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": ["p { }"]}
== bad 全角のコロン | 'p { color:red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": ["p { }"]}
== bad 全角スペース | 'p {\u3000color: red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": ["p { }"]}
== bad セミコロン忘れ | 'p { color: red font-size: 30px; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": ["p { }"]}
== bad 単位忘れ | 'p { font-size: 30; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": ["p { }"]}
== bad // コメント | '// 見出しの色\np { color: red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": []}
== bad class名の大文字小文字 | '.Lead { color: red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": [".Lead { color: red; }"]}
== bad class名に.を付けない | 'lead { color: red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 0)", "rules": ["lead { color: red; }"]}
== bad }の閉じ忘れ | 'h1 { color: navy;\np { color: red; }' => {"color": "rgb(0, 0, 0)", "fs": "16px", "h1": "rgb(0, 0, 128)", "rules": ["h1 {\n  color: navy;\n  & p { color: red; }\n}"]}

fs は段落の文字の大きさ、h1 は見出しの色です。p { } は「ルールは残ったが、中の宣言が全部捨てられた」、[] は「ルールが丸ごと捨てられた」ことを表します。最後の例では、閉じかっこを忘れた後ろの p { ... } が h1 の中のネスト(入れ子)のルール & p として読まれ、「h1 の中にある p」にしか当たらなくなりました。

症状・原因 実際に起きたこと 直し方
プロパティ名の打ち間違い(colr) 宣言が捨てられ p { } 名前を確かめる。エディタの補完を使う
全角のコロン・全角スペース 宣言が捨てられ p { } 記号とスペースを半角にする
セミコロン忘れ 次の宣言まで巻き込んで両方捨てられた 宣言ごとに ; を付ける
単位忘れ(font-size: 30) 宣言が捨てられ 16px のまま 30px のように単位を付ける
// でコメント 次のルールが丸ごと捨てられた コメントは /* */
} の閉じ忘れ 後ろのルールが入れ子として読まれた かっこの数をそろえる
class 名の大文字小文字が違う(.Lead) ルールはあるが当たる要素が無い HTML の class と一字一句そろえる
クラスに . を付け忘れ(lead) lead という要素を探して当たらない .lead と書く
詳細度で負けている 後に書いても ID のルールが勝った 詳細度をそろえる・DevTools で確かめる
inline 要素に width・height 指定しても 49×17px のまま display: inline-block か block
CSS ファイルのパスの間違い 404 で読み込まれず黒のまま href を HTML から見た位置で書く
サーバーが text/css 以外で返す text/plain で返すと適用されなかった サーバーの設定で text/css にする

CSS ファイルの場所を間違えたときは、開発者ツールの Console に次のエラーが出ました。

Failed to load resource: the server responded with a status of 404 (File not found)

href="css/style.css" は「HTML ファイルと同じ場所にある css フォルダの中の style.css」という意味です。HTML と CSS が同じフォルダにあるなら href="style.css" と書きます。

どの原因かを見分けるには、開発者ツールで要素を選び、Styles タブで自分のルールが表示されているかを見ます。 ルールが一覧に無ければセレクタかファイルの読み込み、ルールはあるが上書きされていれば詳細度や順番、警告が出ていればプロパティ名や値の書き方が原因です。CSS の書き方として正しいかは、Console で CSS.supports() を使っても確かめられます。

== supports [True, True, False, False, True]

上から CSS.supports('display','grid')・('color','red')・('colr','red')・('font-size','30')・('selector(:has(a))') の結果です。打ち間違いと単位忘れは false(使えない)でした。

修正したのに見た目が変わらないときは、ブラウザが前の CSS ファイルを覚えている(キャッシュ)こともあります。再読み込みのほか、style.css?v=2 のようにファイル名の後ろを変えると、新しいファイルとして読み込まれます。

CSS3とは(CSSの版の考え方)

この節では、よく聞く「CSS3」という言葉が何を指すのかと、いまの CSS の版の考え方が分かります。

いまの CSS には、「CSS3」「CSS4」のような1つの版はありません。 W3C(Web の仕様を決める団体)の CSS Snapshot 2026(2026年6月22日発行)は、CSS には従来の意味での版(version)ではなくレベル(level)があり、CSS Level 3 からは、セレクタ・色・Flexbox・Grid などの機能ごとの「モジュール」が別々にレベルを上げていくと説明しています。同じ文書には「CSS Level 4 は存在しない」とも書かれています。

呼び方 指しているもの
CSS1・CSS2(CSS 2.1) 1つの文書にまとまっていた時期の CSS
CSS3 CSS 2.1 の後、モジュールに分かれた CSS の総称
CSS4 正式な版は無い。Selectors Level 4 などモジュールのレベルを指して使われることがある
CSS Snapshot 2026 2026年6月時点で安定している CSS の仕様の一覧

実際に使えるかどうかは、仕様の版ではなく、ブラウザが対応しているかで決まります。 MDN の各プロパティのページの下にある「ブラウザーの互換性」の表で、Chrome・Edge・Firefox・Safari の対応を確かめられます。

CSSを学ぶ順番

この節では、はじめての人が CSS を身につける順番と、それぞれで読む記事が分かります。

1

HTML の基本のタグを書く

見出し・段落・リスト・リンク・画像。CSS は HTML に当てるので、先に骨組みを書けるようにする。

HTML

2

書き方と文字・色のプロパティ

セレクタ・プロパティ・値。この記事の HTML に color・font-size・text-align を足して変化を見る。

基本

3

ボックスモデルと余白

width・padding・border・margin・box-sizing。DevTools で箱の大きさを見る習慣をつける。

基本

4

カスケードと詳細度

どの指定が勝つかを説明できると、「効かない」をすぐ直せる。

しくみ

5

Flexbox と Grid

メニューの横並び、カードの一覧、ページの枠組みを自分で組む。

レイアウト

6

レスポンシブと仕上げ

メディアクエリ、transition、変数(カスタムプロパティ)。その後に Sass や Tailwind CSS などの道具へ進む。

応用

  • 1見た目は CSS、中身は HTML に分けて書く見出しを大きくしたいだけで h1 を使わない。意味に合うタグを選び、大きさは CSS で決める
  • 2CSS は外部ファイルにまとめるstyle 属性に書くと、あとで上書きしにくく、同じ指定が散らばる
  • 3セレクタはクラス中心にするID や長いセレクタは詳細度が高く、後から上書きしにくい
  • 4!important は最後の手段にする使うと、さらに上書きするための !important が増えていく
  • 5効かないときは DevTools で確かめるルールが一覧にあるか、上書きされていないか、警告が出ていないかを見る

よくある質問

Q. CSSとは簡単に言うと何ですか? A. Web ページの色・文字の大きさ・余白・配置などの見た目を指定する言語です。HTML が「これは見出し」と中身を決め、CSS が「見出しは紺色の 24px」と見た目を決めます。

Q. CSS の読み方と正式名称は? A. 読み方は「シーエスエス」で、正式名称は Cascading Style Sheets(カスケーディング・スタイル・シート)です。ファイルの拡張子は .css です。

Q. HTML と CSS の違いは? A. HTML はページの中身と構造(見出し・段落・リンク)を、CSS は見た目を書きます。CSS を差し替えるだけで、同じ HTML を別のデザインで表示できます。

Q. CSS はプログラミング言語ですか? A. 一般にはスタイルシート言語と呼ばれ、JavaScript のように処理の手順を書く言語とは性格が違います。「どの要素をどう見せるか」という指定を並べて書きます。

Q. CSS はどこに書けばよいですか? A. style 属性・style タグ・外部の .css ファイルの3つに書けます。Web サイトでは、外部ファイルを <link rel="stylesheet" href="..."> で読み込む方法が基本です。この記事の実物では、外部ファイルと style タグは後に書いた方が勝ち、style 属性は順番に関係なく勝ちました。

Q. CSS の優先順位はどう決まりますか? A. 自分で書く CSS では、!important、style 属性、詳細度(ID-クラス-要素の数)、後に書いた方、の順に比べて決まります。「カスケードと詳細度」の節に、7通りの組み合わせを測った結果があります。

Q. CSS が効かないのはなぜですか? A. 多い原因は、プロパティ名の打ち間違い、全角の記号やスペース、セミコロン忘れ、class 名の違い、詳細度で負けている、CSS ファイルのパスの間違いです。ブラウザは読めない宣言を黙って捨てるので、開発者ツールの Styles タブで確かめます。

Q. CSS3 とは何ですか?CSS4 はありますか? A. CSS3 は、CSS 2.1 の後に機能ごとのモジュールに分かれた CSS の総称です。W3C の CSS Snapshot 2026 には「CSS Level 4 は存在しない」と書かれていて、各モジュールが別々にレベルを上げています。

Q. CSS だけで Web サイトは作れますか? A. CSS は HTML に見た目を付ける言語なので、CSS だけではページになりません。HTML と組み合わせて使い、動きや処理が必要なら JavaScript を足します。

Q. CSS の勉強はどの順番で進めればよいですか? A. HTML の基本のタグ、CSS の書き方と文字・色、ボックスモデル、カスケードと詳細度、Flexbox と Grid、レスポンシブ、の順が一般的です。この記事の「CSSを学ぶ順番」の節にまとめています。

Q. Sass や Tailwind CSS と CSS の関係は? A. どちらも最終的にブラウザが読む CSS を作るための道具です。Sass は変数や入れ子を使って書き、CSS に変換します。Tailwind CSS は、用意されたクラス名を HTML に並べて見た目を付けます。どちらも土台は CSS の知識です。

まとめ

  • CSS(Cascading Style Sheets)は、Web ページの見た目を指定する言語。HTML が中身と構造、CSS が見た目、JavaScript が動きを受け持つ。
  • 書き方は セレクタ { プロパティ: 値; }。書く場所は style 属性・style タグ・外部ファイルの3つで、サイトでは外部ファイルが基本。
  • CSS が無くてもブラウザの既定の CSS がある(h1 は 32px、リンクは rgb(0, 0, 238) の下線つき)。
  • ぶつかったときは、!important、style 属性、詳細度、後に書いた方の順に比べる。外部ファイルと style タグは後に書いた方が勝った。
  • 標準の width は中身だけの幅。padding と border が足されて 200px が 236px になり、box-sizing: border-box で 200px に収まった。
  • 並べるのは親に display: flex か grid。メディアクエリで、幅 390px のときだけ1列に切り替わった。
  • 効かないときは、打ち間違い・全角・セミコロン・単位・// コメント・閉じかっこ・class 名・詳細度・パス・MIME タイプを疑い、DevTools で確かめる。

参考・出典

確認日はいずれも 2026年10月23日です。

  • MDN Web Docs「CSS とは何か」:https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/What_is_CSS
  • MDN Web Docs「CSS: カスケーディングスタイルシート」:https://developer.mozilla.org/ja/docs/Web/CSS
  • MDN Web Docs「カスケード入門」:https://developer.mozilla.org/ja/docs/Web/CSS/Guides/Cascade/Introduction
  • MDN Web Docs「詳細度」:https://developer.mozilla.org/ja/docs/Web/CSS/Guides/Cascade/Specificity
  • MDN Web Docs「ボックスモデル」:https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/Box_model
  • MDN Web Docs「viewport meta タグ」:https://developer.mozilla.org/ja/docs/Web/HTML/Reference/Elements/meta/name/viewport
  • MDN Web Docs「よくある MIME タイプ」:https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/MIME_types/Common_types
  • W3C「CSS Snapshot 2026」:https://www.w3.org/TR/css/
  • Chrome for Developers「CSS features reference」:https://developer.chrome.com/docs/devtools/css/reference

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「CSSとは|HTMLとの違い・書き方・効かない原因を実例で解説」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?