Insights

技術情報

【HTML/CSS】フッターの下に消えない「謎の余白」が発生する原因と対処法(テキストノード/BOM)

Webサイトのコーディングで、ページ最下部(フッターの下)に数px〜1行分程度の「謎の余白(スクロールできる空白領域)」が発生することがあります。

html / bodymargin / padding は 0、フッターの margin-bottom も 0。DevTools で見ても原因が掴みにくい。
このタイプの余白は、CSSではなく 「テキストノード(不可視文字)」が原因になっていることがあります。

本記事では、切り分け方法と、実務で踏みやすい2パターン(A:タグ間の不可視文字、B:BOM)を整理します。


1. 現象と切り分け

次の条件に当てはまるなら、本文のパターンA/Bが疑わしいです。

  • html, bodymargin, padding0
  • フッター要素(.l-footer 等)の margin-bottom0
  • outline で全要素を囲っても、余白が「要素の枠としては捉えづらい」領域に見える
  • overflow: hidden; を付けても症状が変わらないことがある

診断方法:「CSSの余白」か「文字の高さ」かを判別する

一時的に body に以下を当てます。

body {
  font-size: 0;
}

これで 余白が消える場合、原因は「不可視文字(テキストノード)」である可能性が高いです。

空白や改行など“見えない文字”でも、ブラウザは文字として扱うため、通常は font-sizeline-height を持ちます。
この「行の高さ」が、結果としてページ最下部の余白として現れます。

body { font-size: 0; } はあくまで診断・対症療法であり、本番の恒久対応としては非推奨です(本文後半で理由を説明します)。


2. パターンA:HTMLタグ間/HTML末尾に混入した不可視テキストノード

原因

</footer> の直後や </body> の直前などに、以下のような不可視文字が混入しているケースです。

  • 全角スペース
  • 改行
  • ゼロ幅文字
  • コピペ由来の制御文字

例(見えにくい全角スペースが混ざっている):

</footer>
 
</body>

この不可視文字が DOM 上ではテキストノードとして存在し、条件によって line-box が生成されて高さを持ち、余白のように見えます。

解決策

HTML末尾(</body> 直前)やフッター閉じタグ周辺にある不要な空白・改行・不可視文字を削除します。

ポイントは「タグを詰めて </footer></body> にする」ことではなく、不要な不可視文字を除去することです。
(可読性の観点でタグを同一行に詰めるのは推奨しません)


3. パターンB:テンプレートの文字コードが UTF-8 with BOM(BOM問題)

原因

エディタ上では空白が一切ないのに余白が出る場合、疑うべきは BOM(Byte Order Mark)です。

特に以下のような構成で踏みやすいです。

  • Nunjucks(.njk
  • EJS
  • PHPテンプレート
  • 共通パーツ(ヘッダー/フッター)を include している

include しているテンプレートが UTF-8 with BOM で保存されていると、ファイル先頭の BOM が不可視文字(U+FEFF 相当)としてHTMLに混入し、
ブラウザによってはテキストノードとして扱われ、line-box が生成されて余白になります。

(実例:src/templates/partials/_global-menu.njksrc/templates/partials/footer.njk が UTF-8 with BOM だったため、BOMなしへ変換して解決)

解決策(VS Code)

  1. 該当テンプレートファイルを開く
  2. 右下のエンコード表示(例:UTF-8 with BOM)をクリック
  3. 「UTF-8」(BOMなし) を選択して保存し直す

Git管理下では差分が分かりづらい場合があるため、確実に「BOMなし」で上書き保存します。


4. なぜ body { font-size: 0; } は恒久対策として非推奨か

font-size: 0 は line-box の高さをゼロ化するため、症状が消えることがあります。
ただし次の副作用があります。

  • body直下のテキストが意図せず消える
  • 子要素側で font-size を戻し忘れると表示崩れの原因になる
  • 原因(不可視文字混入)を温存したままになり、別の場所で再発し得る

したがって、基本方針は HTML(またはテンプレートのエンコーディング)を修正して根本解決です。


5. まとめ

フッター下の余白が font-size: 0 で消えるなら、原因は「そこに見えない文字がある」可能性が高いです。

  • パターンA:HTML末尾やタグ間の不可視テキストノード(全角スペース/改行/ゼロ幅文字など)
  • パターンB:テンプレートが UTF-8 with BOM(BOMが不可視文字として混入)

CSSハックで無理やり消すのではなく、ソースまたはファイルの文字コードを修正して根本対応しましょう。