目次
- CSSが効かない…の正体を一文で言うと
- CSSが効かない時にまずやる「5ステップ」
- まず確認|CSSファイルが読み込まれていない
- よくあるミス
- 反映チェック(3秒でできる)
- DevToolsで確定させる(ここが差別化ポイント)
- セレクタの指定ミス(いちばん気づきにくい)
- DevToolsで一発で見抜く
- HTML構造とセレクタが噛み合っていない
- こう直す(意図で分岐)
- 優先順位で負けている(いわゆる“上書きされてる”)
- ありがちな現場パターン
- “強さ”の正体(専門用語を噛み砕く)
- !importantが潜んでいる
- 対処の考え方
- CSSの文法ミス(途中から効かないの正体)
- まず見るポイント
- DevToolsで気づくコツ
- メディアクエリの条件ミス(スマホだけ効かないの代表)
- min-width / max-width の混同も多い
- スマホだけ効かない時はviewportも確認
- キャッシュで反映されない(直したのに変わらない問題)
- まず試す(順番通りでOK)
- それでも怪しいならクエリを付ける
- 「一部だけ効かない」時に疑うべきこと
- displayやwidthが効かない
- 横スクロール問題も“CSSが効かない”として現れる
- 横スクロールの犯人を特定する小技
- DevToolsで「効いてる/負けてる」を秒速で確認する
- 見る場所は2つだけ
- ありがちな失敗例(リアルなやつ)
- 失敗例1:相対パスがページによってズレる
- 失敗例2:メディアクエリが逆で、スマホだけ死ぬ
- 失敗例3:直したのに変わらない→キャッシュだった
- すぐ使えるチェックリスト(コピペでOK)
- よくある質問
- CSSが一瞬だけ効くのはなぜ?
- 毎回CSSが効かなくなるのはなぜ?
- まとめ|「css 効かない」は手順で解ける
CSSが効かない…の正体を一文で言うと
CSSが効かないとは、「書いたスタイルがブラウザに適用されていない(または適用されても別のCSSに負けている)」状態のことです。
色もサイズもレイアウトも変わらない。
さっきまで動いてたのに、急に何も起きない。
スマホだけ崩れる。横スクロールまで出る。
Web制作をやってると、これ避けて通れません。
私も最初の頃、クラス名のタイプミスを気づかずに30分溶かしました。
.title のつもりが .titile。しかも目が慣れて見逃すんですよね…。
そのときから「効かない時は、感情より手順」と決めました。
この記事はその手順を、実務でそのまま使える形にまとめたものです。
上から順に潰すだけで、だいたい片付きます。
CSSが効かない時にまずやる「5ステップ」
最初に結論の流れを置きます。ここが最短ルートです。
- CSSファイルが読み込まれているか
- セレクタが一致しているか(打ち間違い・構造ミス)
- 優先順位で負けていないか(詳細度・読み込み順)
- 文法エラーで途中から死んでいないか
- スマホ・メディアクエリ・キャッシュの罠に落ちていないか
この順番には理由があります。
上が崩れていたら、下を頑張っても反映されません。
まず確認|CSSファイルが読み込まれていない
いちばん多い原因です。しかも一番早く確認できます。
<link rel="stylesheet" href="style.css">
よくあるミス
- パスが違う(階層の勘違い)
- ファイル名のスペル違い(style.css / styles.css)
- 大文字小文字(サーバーだと別物)
- 全角文字が混ざる(コピペで起きがち)
- そもそもlinkタグが別ページにだけ無い
反映チェック(3秒でできる)
いったん雑に派手なCSSを当てます。
body {
outline: 8px solid red;
}
これが出ないなら、読み込みが怪しい。
DevToolsで確定させる(ここが差別化ポイント)
Networkで読み込み状況を見る
- F12 → Network
- ページをリロード
- フィルタを CSS にする
- 目的のCSSが Status 200 で取れているか確認
404 ならパスミス。
200 なのに反映されないなら次へ。
セレクタの指定ミス(いちばん気づきにくい)
CSSは「一致したもの」にしか当たりません。
一致しないなら、何を書いてもゼロ。
.title {
color: red;
}
<h1 class="titile">タイトル</h1>
この 1文字ミス が本当に多い。
しかも見た目で気づきづらい。
DevToolsで一発で見抜く
- F12 → Elements
- 対象要素をクリック
- 右側の Styles を見る
- 目的のCSSが出てこないなら「セレクタ不一致」
ここで迷わなくなります。
HTML構造とセレクタが噛み合っていない
「書いたのに効かない」の原因として、地味に多いです。
.box p {
color: blue;
}
<p class="box">テキスト</p>
この場合、.box の中に p が存在しないので当たりません。
こう直す(意図で分岐)
「boxというクラスの要素」自体を青くしたい
.box {
color: blue;
}
「boxの中のp」だけを青くしたい
<div class="box">
<p>テキスト</p>
</div>
「何を狙ってるか」を一回言語化すると、ズレが見えます。
優先順位で負けている(いわゆる“上書きされてる”)
CSSは「後から読み込まれた」「より具体的な」指定が勝ちます。
p {
color: red;
}
.text {
color: blue;
}
<p class="text">テキスト</p>
この場合は青。クラスの方が強いからです。
ありがちな現場パターン
- 共通CSSで
.btn {}を定義 - 下層ページで
.article .btn {}が追加 - トップだけ見た目が違う →「CSS効かない」になる
“強さ”の正体(専門用語を噛み砕く)
よく言う「詳細度」は、要するに ピンポイント度 です。
p→ ざっくり(弱い).text→ クラス指定(少し強い)#header .text→ かなりピンポイント(強い)
!importantが潜んでいる
これがあると、だいたい負けます。
p {
color: red !important;
}
対処の考え方
- まず どこに !important があるか をDevToolsで探す
- 直せるなら 消して設計を整える
- どうしても一時的に避難するなら、最小範囲で使う
「全部に !important」になると、後で地獄を見ます。
CSSの文法ミス(途中から効かないの正体)
これもあるある。
1行ミスっただけで、そこから下が無視されることがあります。
.box {
color: red
background: blue;
}
color: red の後のセミコロン抜けで、以降が崩れるケース。
まず見るポイント
- セミコロン(;)抜け
- 波括弧({ })の閉じ忘れ
- コメントの閉じ忘れ
/* ... */ - コピペで変な記号が混ざる
DevToolsで気づくコツ
Stylesで、途中からルールが消えていたり
意図しない場所まで打ち消し線が連鎖していたら疑います。
メディアクエリの条件ミス(スマホだけ効かないの代表)
よくあるのがこれ。
@media (max-width: 768) {
body { background: yellow; }
}
単位がないので成立しません。正しくは:
@media (max-width: 768px) {
body { background: yellow; }
}
min-width / max-width の混同も多い
max-width→ その幅「以下」min-width→ その幅「以上」
スマホだけ反映されない人は、ここで逆を書きがちです。
スマホだけ効かない時はviewportも確認
これが無いと、メディアクエリが期待どおりに動きません。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
「スマホ崩れ」が出ている時は、まずこれをチェック。
キャッシュで反映されない(直したのに変わらない問題)
CSSはキャッシュされやすいです。
まず試す(順番通りでOK)
- スーパーリロード(Windowsなら Ctrl + F5)
- シークレットウィンドウで確認
それでも怪しいならクエリを付ける
<link rel="stylesheet" href="style.css?v=2">
バージョンを変えるだけで別ファイル扱いになります。
「一部だけ効かない」時に疑うべきこと
displayやwidthが効かない
display: flexが効かないwidth: 100%が思った通りにならないmargin: autoが効かない
このへんは、だいたい 親の影響 です。
.parent {
display: flex;
}
.child {
width: 100%;
}
flexの子要素は、状況によって縮んだり広がったりします。
ここで「効かない」と感じやすい。
横スクロール問題も“CSSが効かない”として現れる
スマホで横スクロールが出ると、
「中央寄せが崩れた」「余白が消えた」みたいに見えます。
だいたい原因はこれ。
- 固定幅(例:
width: 1200px;) - 画像がはみ出し(
max-width: 100%が無い) positionで画面外に飛んでるtransformで見えないはみ出しが発生
横スクロールの犯人を特定する小技
DevToolsで、はみ出しを見つける用の一時CSSを入れます。
* {
outline: 1px solid rgba(255, 0, 0, 0.25);
}
どこが画面外に飛んでいるか、目で追えます。
DevToolsで「効いてる/負けてる」を秒速で確認する
ここは習慣にすると一気に楽になります。
見る場所は2つだけ
- Elements → Styles:どのCSSが当たってるか(打ち消し線が鍵)
- Computed:最終的に採用された値が何か
打ち消し線が出ている場合
「CSSは当たってる。でも負けてる」状態です。
書き方じゃなく、優先順位の問題。
そもそも出てこない場合
「セレクタが一致してない」か「読み込めてない」どちらか。
ありがちな失敗例(リアルなやつ)
失敗例1:相対パスがページによってズレる
トップは href="css/style.css" で動くのに、下層だと効かない。
原因は下層から見た相対パスが変わること。
対策の考え方
- ルート基準にする(例:
/css/style.css) - もしくはビルド環境でパスを統一する
失敗例2:メディアクエリが逆で、スマホだけ死ぬ
min-width と max-width を逆に書く。
PCで見て「効いてる!」と思って公開して、スマホで崩れる。
地味に多いです。
失敗例3:直したのに変わらない→キャッシュだった
「直したのに効かない」って時、
半分くらいキャッシュのせいです(体感)。
まずはシークレット。これで一気に切り分けできます。
すぐ使えるチェックリスト(コピペでOK)
- CSSファイルはNetworkで200になっている
- linkのパス・ファイル名・大文字小文字が合っている
- セレクタの打ち間違いがない(Elementsで確認)
- Stylesで打ち消し線が出ていない(負けてない)
- !important が潜んでいない
- 波括弧とセミコロンが崩れていない
- メディアクエリの単位(px)と条件(min/max)が合っている
- viewportが入っている
- キャッシュを疑い、シークレットで再確認
- スマホ崩れ・横スクロールは固定幅やはみ出しを疑う
よくある質問
CSSが一瞬だけ効くのはなぜ?
- JavaScriptが後からstyleを上書きしている
- CSSの読み込み順が入れ替わっている
- 画面サイズでメディアクエリが切り替わっている
まずはDevToolsで「最終的にどの値が採用されてるか」を見れば、だいたい方向性が見えます。
毎回CSSが効かなくなるのはなぜ?
- キャッシュで古いCSSが残る
- 共通CSSとページCSSのルールがぶつかっている
- 命名がバラバラで、似たクラスが増殖している
運用していくなら、クラス命名と読み込み順を一回整理するとラクになります。
まとめ|「css 効かない」は手順で解ける
CSSが効かない原因は、派手なバグより 基本の見落とし が多いです。
- 読み込み(Networkで確定)
- セレクタ一致(Elementsで確定)
- 優先順位(Stylesの打ち消し線で確定)
- 文法エラー
- キャッシュ/メディアクエリ/viewport
- スマホ崩れ・横スクロールのはみ出し
「css 効かない」で検索した時点で、もう半分勝ちです。
あとは感覚で悩まず、上から順に潰すだけ。
まずは CSSが本当に読み込まれているか。
ここから始めれば、原因はちゃんと見つかります。