タイトル: <head>タグに書いた内容が<body>タグに移動する場合の解決方法
SEOタイトル: <head> の内容が <body> に移動する原因と対処(HTML5 パーサのエラー復旧)
| この記事の要点 |
|
現象
HTML ソースでは 内に書いたはずの / / が、ブラウザの DevTools で見ると 内に移動している現象。Chrome / Firefox / Safari 共通で起きます。
My Page
これが原因!
Hello
My Page
これが原因!
Hello
原因: HTML5 パーサのエラー復旧
HTML5 仕様(WHATWG HTML Living Standard)はパースエラー時の挙動を厳密に決めており、 内に不正な要素が現れた瞬間に、その要素と以降の要素はすべて へ移動するルールです。これにより「壊れた HTML でも何かは表示される」性質を担保しています。
に置けるタグ一覧
| タグ | 用途 |
|---|---|
| タブのタイトル(必須) |
| charset / viewport / description / og:* 等 |
| CSS / favicon / preload / canonical |
| 外部 / インライン JS |
| インライン CSS |
| 相対 URL の基底 |
| JS 無効時表示(head 内は // 限定) |
| クライアントテンプレ(head/body 両方可) |
これ以外( 説明 Laravel Blade の場合: Q: head に Google Analytics の Q: jQuery プラグインが Q: View Source(生 HTML)と DevTools で差があるのが普通? / / 素のテキスト)を置くと押し出されます。
原因チェックリスト
① タグの誤配置
Title
② BOM や空白行
NG: ファイル先頭に BOM (EF BB BF) や空白行がある
↓
← BOM があると quirks mode に落ちる
対処:
- エディタで「BOM なし UTF-8」で保存し直す
- VS Code: 右下のステータスバーで「UTF-8 with BOM」→「UTF-8」に変更
- PHP: ③ サーバ側テンプレートの出力ミス
// NG: include されたファイルの末尾に空白行があり、それが 内に流れ込む
// NG: BOM 付きファイル
// → output buffer 取って一括出力するか、文字コード変換ツールで一括解消{{-- NG: @section の外にテキストや HTML を書いている (head に流れ込む可能性) --}}
@extends('layout')
これは body 用テキスト {{-- ← レイアウト次第で 内に出る --}}
@section('content')
Hello
@endsection
{{-- OK: 必ず @section 内で出力 --}}
@extends('layout')
@section('content')
Hello
@endsection④ の位置
は 開始から 1024 バイト以内に置く必要があります。先に長いコメントや別 meta があると charset が無視され、エラー復旧が走ることがあります。
確認手順
内に置けないタグが無いか目視# CLI で W3C 系チェック
npm install -g html-validate
html-validate index.html
# あるいは tidy
sudo apt install tidy
tidy -errors -quiet index.html対処パターン
原因 対処 head 内に div / p / 素テキスト 削除 or body 側へ移動 BOM 付きファイル 「BOM なし UTF-8」で保存 テンプレ include の末尾改行 末尾の ?> を省略、ob_start 利用meta charset が遅い head 開始直後に置く 独自タグ(カスタム要素) HTML5 でカスタム要素は body 推奨。head に置くとパースエラー コメントタグの誤閉じ 構造を再確認FAQ
を置きたいだけなのに body に行く
A: 自体は head 可。直前に不正タグがあって連鎖押し出しされている。直前を確認。 を動的に head に追加してくれない
A: document.head.appendChild(...) なら確実。jQuery $('head').append(...) はパース後の DOM 操作なので問題なし(パース時の押し出しと別の話)。
A: 動的 DOM 操作(JS)の影響もあるが、JS なしで読み込み直後に差がある場合はパーサ復旧。View Source は壊れた HTML、Elements は復旧後の DOM を表示。