結論

HTMLのコメントアウトは、<!-- と --> で囲むと書けます。VS Code では Ctrl + /(Mac は ⌘ + /)です。

この記事でわかること

  • 17パターンをChromiumで読み込んだ表示の実測表
  • エディタ3種のショートカットと入れ子の回避方法4つ
  • CSS・JS・PHP・テンプレート8種のコメント対応表

2026年10月22日更新|Chromium 141・parse5 8.0.1で実測

ブラウザは、開始の記号から最初の終了の記号までを「コメント」として読み、画面には出しません。ただしコメントは消えたわけではなく、ページのソースや DevTools では誰でも読めます。

flowchart TD
    S[HTML のソース] --> P[ブラウザのパーサー]
    P --> C[開始から最初の終了の記号まで<br>コメントになる]
    P --> E[それ以外<br>要素や文字]
    C --> H[画面には出ない<br>ソースと DevTools では見える]

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

やりたいこと 書き方・操作 補足
1行をコメントにする <!-- メモ --> 画面に出ない
複数行をコメントアウト 前に <!--、後ろに --> 途中に --> を入れない
VS Code のショートカット Ctrl + /(Mac は ⌘ + /) もう一度押すと解除
選んだ一部だけ Shift + Alt + A(Mac は ⇧⌥A) Linux は Ctrl + Shift + A
中にコメントがある範囲 入れ子にはできない 内側を消すか template
CSS・JavaScript /* */・// style・script の中
見られたくないメモ サーバー側のコメント PHP・Blade・Jinja 等
表示されてしまう ! の抜け・全角・閉じ忘れ 原因の表を参照

確認環境:Ubuntu 24.04・Chromium 141.0.7390.37(Playwright 1.56 から起動)。17パターンの HTML を Python の http.server(3.11.15)から配信して Chromium で読み込み、画面の文字(innerText)とコメントノードの数を数えました。仕様上のエラー名は HTML の仕様どおりに実装されたパーサー parse5 8.0.1 で出し、HTML の仕様(WHATWG HTML Living Standard)の「13.1.6 Comments」と「Parse errors」で確かめました。ショートカットの動きは VS Code のエディタ部分と同じ Monaco Editor 0.57.0 を Chromium で動かして実際にキーを押し、キーの割り当ては VS Code・JetBrains・Neovim の公式ドキュメントで確かめました。ほかの言語は PHP 8.4.21・Jinja2 3.1.6・EJS 7.0.2・Handlebars 4.7.10・@vue/compiler-dom 3.5.44・esbuild 0.28.2・html-minifier-terser 7.2.0(Node.js 22.22.2)で実行し、JSP・Thymeleaf・Blade は各公式の仕様・ドキュメントで確かめました(確認日 2026年10月22日)。

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

(記載例)出典:株式会社RJC「HTMLコメントアウトの書き方|ショートカット・入れ子・できない原因」

HTMLのコメントアウトとは(コメントとの違い)

この節では、「コメント」と「コメントアウト」の違いと、何のために使うのかが分かります。

HTML のコメントは、ブラウザの画面に表示されないメモです。 <!-- で始めて --> で終わる範囲が、コメントになります。

「コメント」と「コメントアウト」は、同じ書き方で目的が違います。

呼び方 中に書くもの 目的
コメント 説明・注意書き・区切りの目印 コードを読む人へのメモ
コメントアウト 動いている HTML のタグ 一時的に表示を止める

よく使われる場面です。

1ブロックの区切り

ヘッダー・メイン・フッターの始まりと終わりに目印を置き、長い HTML の中で場所を探しやすくする。

2一時的に隠す

キャンペーンのバナーなど、消すかもしれない部分を残したまま表示だけ止める。

3原因の切り分け

表示が崩れたとき、怪しい部分を1つずつコメントアウトして、どこが原因かを探す。

4チームへの申し送り

「この class は JavaScript から使う」など、コードだけでは分からない理由を残す。

ブラウザはコメントを捨てずに、DOM(ページの木構造)の中に「コメントノード」として残します。この記事では、Chromium の中でこのコメントノードの数を数えて、書き方ごとの結果を確かめています。

HTMLコメントアウトの書き方(1行・複数行・一部だけ)

この節では、1行・複数行・行の一部をコメントアウトする書き方が、コピーして使える形で分かります。

1行だけコメントにする

<p>表示A</p>
<!-- メモ:ここは表示されない -->
<p>表示B</p>

Chromium で読み込むと、画面には「表示A」「表示B」だけが出て、コメントノードが1個できました(中身は メモ:ここは表示されない。前後の半角スペースもそのまま残ります)。

複数行をまとめてコメントアウトする

開始の記号と終了の記号の間は、何行あってもかまいません。タグを含めることもできます。

<!--
<p>非表示1</p>
<p>非表示2</p>
-->
<p>表示</p>

画面には「表示」だけが出て、2つの段落はまるごと1個のコメントノードになりました。

行の一部だけをコメントアウトする

コメントは行の途中にも置けます。タグの外側(要素の中身)であれば、どこにでも書けます。

<p>価格:1,980円<!-- 税込み表示に変える予定 --></p>
<ul>
  <li>東京</li><!-- <li>大阪</li> --><li>名古屋</li>
</ul>

書くときの手順

1

半角で開始の記号を書く

<・!・ハイフン2つを、すき間なしで続ける。! を忘れたり全角にしたりすると、ただの文字として表示される。

2

中身を書く

説明の文やタグを書く。中に別のコメント(開始の記号や終了の記号)を入れない。

3

半角で終了の記号を書く

ハイフン2つと > を続ける。閉じ忘れると、そこから最後までが全部コメントになる。

4

ブラウザで確かめる

画面から消えたことと、DevTools の Elements パネルでコメントが灰色の1かたまりになっていることを見る。

コメントを置けない場所

コメントは、タグの中(属性の間)には書けません。また、次の場所では書いてもコメントになりません。Chromium で確かめた結果です。

書いた場所 結果 理由
属性の値(title="<!-- メモ -->") 値の文字として残る 属性の値は文字として読まれる
<textarea> の中 入力欄にそのまま表示される 中身は文字として扱われる
<title> の中 タブにそのまま表示される <textarea> と同じ扱い
<script>・<style> の中 各言語の読み方になる 後の節で実測

<textarea id="ta"><!-- メモ --></textarea> を読み込むと、入力欄の値は <!-- メモ --> という文字列でした。属性の値も同じで、コメントノードは0個です。

コメントアウトのショートカット(VS Code・JetBrains・Neovim)

この節では、主なエディタでコメントアウトと解除をするキーと、実際に押したときに HTML がどう変わるかが分かります。

エディタ別のショートカット

エディタ 行のコメント(切り替え) 選んだ範囲を囲む
VS Code(Windows) Ctrl + / Shift + Alt + A
VS Code(Mac) ⌘ + / ⇧ + ⌥ + A
VS Code(Linux) Ctrl + / Ctrl + Shift + A
JetBrains(WebStorm 等。Win・Linux) Ctrl + / Ctrl + Shift + /
Neovim 0.10 以降 gcc(選んで gc) ―

VS Code の公式のキーボードショートカット一覧では、行のコメントの切り替えが editor.action.commentLine、ブロックコメントの切り替えが editor.action.blockComment です。ほかに「Ctrl + K → Ctrl + C」でコメントを付けるだけ、「Ctrl + K → Ctrl + U」で外すだけの操作もあります(Mac は ⌘K ⌘C・⌘K ⌘U)。同じキーをもう一度押すと解除される「切り替え」なので、解除のための別のキーを覚えなくても戻せます。

JetBrains の IDE は、公式ドキュメントで Windows・Linux のキーが Ctrl + /(行)と Ctrl + Shift + /(範囲)です。macOS のキー割り当ては、Help メニューの「Keyboard Shortcuts PDF」で確かめられます。Neovim は 0.10 でコメントの機能が組み込まれ、ドキュメントでは gcc が現在の行、ビジュアルモードで選んで gc が選んだ行の切り替えです。

VS Code のショートカットの一覧は、関連記事「VSCodeショートカット一覧|Win/Mac対応130項目とAI操作・変更方法」で扱っています。

Ctrl + / を押すと HTML はどう変わるか(実測)

VS Code のエディタ部分と同じ Monaco Editor を Chromium で動かし、言語を HTML にしてキーを押しました。元の HTML は次のとおりです。

<div class="box">
  <p>段落1</p>
  <p>段落2</p>
</div>
<style>
  p { color: red; }
</style>
<script>
  console.log("A");
</script>

結果です(変わった行だけを抜き出しています)。

== 1行(カーソルを2行目に置いて Ctrl+/)
  <!-- <p>段落1</p> -->

== 複数行(2〜3行目を選択して Ctrl+/)
  <!-- <p>段落1</p>
  <p>段落2</p> -->

== もう一度 Ctrl+/(解除)
  <p>段落1</p>
  <p>段落2</p>

== 一部だけ(「段落1」の文字だけ選択して Ctrl+Shift+A。Linux のキー)
  <p><!-- 段落1 --></p>

== style の中(6行目で Ctrl+/)
  /* p { color: red; } */

== script の中(9行目で Ctrl+/)
//   console.log("A");

HTML は「1行ずつのコメント」の記号が無いので、複数行を選んで Ctrl + / を押すと、各行ではなく選んだ範囲全体が1組の記号で囲まれます。 VS Code の HTML の言語設定(language-configuration.json)にも、コメントの記号は "blockComment": [ "<!--", "-->" ] の1組だけが書かれています。<style> の中では CSS の /* */、<script> の中では JavaScript の // に、自動で切り替わりました。

ショートカットが効かないときに確かめること

  • 1右下の言語モードが HTML になっているかコメントの記号は言語ごとの設定で決まる。拡張子の無いファイルや新規ファイルはプレーンテキストのことがある
  • 2同じキーをほかの機能が使っていないかVS Code は Ctrl + K → Ctrl + S でショートカットの画面を開き、右クリックの「Show Same Keybindings」で重なりを探せる
  • 3押したキーが VS Code に届いているかコマンドパレットの「Developer: Toggle Keyboard Shortcuts Troubleshooting」で、押したキーの記録が出力パネルに出る
  • 4キーボードの配列を切り替えた直後ではないかVS Code のドキュメントでは、Linux で配列を変えたら VS Code を再起動するよう書かれている

入れ子にできない理由と回避方法

この節では、コメントの中にコメントを入れると何が起きるのかと、すでにコメントがある範囲をまとめて隠す方法が分かります。

入れ子にすると、最初の終了の記号でコメントが閉じる

HTML のコメントは、中にある最初の --> で終わります。 内側にコメントがあると、内側の終了の記号で外側のコメントまで閉じてしまい、その後ろの HTML が画面に出ます。

flowchart TD
    A[外側の開始の記号<br>ここからコメント] --> B[内側の開始の記号<br>ただの文字として読む]
    B --> C[内側の終了の記号<br>ここでコメントが閉じる]
    C --> D[残りの段落と外側の終了の記号<br>画面に表示される]
<!-- 外側の開始
<p>段落1</p>
<!-- 内側のコメント -->
<p>段落2</p>
-->
<p>段落3</p>

Chromium で読み込んだ結果です。

画面の文字   : 段落2 / --> / 段落3
コメントノード : 1個 " 外側の開始\n<p>段落1</p>\n<!-- 内側のコメント "
parse5 のエラー: nested-comment(7行5列)

隠したつもりの「段落2」と、外側の終了の記号 --> が画面に文字として出ました。 HTML の仕様の「nested-comment」の説明にも、このようなコメントは最初に出てくる --> で閉じ、その後ろはすべてマークアップとして扱われる、と書かれています。

中にコメントがある範囲を隠す

入れ子外側を開始と終了の記号で囲むだけ。内側の終了の記号で閉じて、残りが画面に出る
→
回避内側のコメントを先に消すか、template やサーバー側のコメントで囲む

ブラウザは何個目の開始の記号かを数えない。最初の終了の記号だけを見る

エディタのショートカットでも入れ子になる

すでに2行目がコメントになっている HTML で、1〜4行目を選んで Ctrl + / を押すと、Monaco Editor は次のように外側を囲みました。

<!-- <div class="box">
  <!-- <p>段落1</p> -->
  <p>段落2</p>
</div> -->

この結果を Chromium に読み込ませると、画面には「段落2」と「-->」が出ました。ショートカットは入れ子を防いでくれないので、範囲の中にコメントがあるかを先に見ます。

回避方法

1内側のコメントを先に外す

内側をショートカットで解除してから、外側をまとめてコメントアウトする。メモの文は残したいなら、記号を消して普通の文にする。

2template 要素で囲む

中身は表示されず、画像の読み込みも script の実行も起きない。中のコメントもそのまま保てる。

3サーバー側のコメントで囲む

PHP の /* */、Blade・Jinja・JSP のコメントなら、中に HTML のコメントがあっても閉じない。ブラウザにも送られない。

4ファイルを分ける・Git に任せる

大きな部分を長く止めるなら、削除して Git の履歴に残すほうが、HTML の中に使わないコードが積もらない。

template と、よく似た使い方をされる hidden 属性を、Chromium で比べました。どちらの中にもコメント・段落・画像・script を入れています。

<template id="t">
  <!-- 内側のコメント -->
  <p>段落T</p>
  <img src="t.png">
  <script>console.log("template の中");</script>
</template>
<div hidden>
  <!-- 内側のコメント -->
  <p>段落H</p>
  <img src="h.png">
  <script>console.log("hidden の中");</script>
</div>
<p>表示</p>
画面の文字       : 表示
console        : hidden の中
画像のリクエスト   : h.png だけ
template の中のコメント: 1個(template.content の中に残る)

hidden は画面から消すだけで、画像は読み込まれ、script も実行されました。template はどちらも起きません。 MDN によると、template の中身は既定では描画されず、content プロパティの DocumentFragment に入ります。ただし、どちらもソースには残るので、見られたくないものを隠す方法にはなりません。

コメントアウトできない・表示される原因(Chromiumで実測)

この節では、「コメントアウトしたのに表示される」「下が全部消えた」ときに、書き方のどこが原因かを、実測の表から探せます。

17パターンの HTML を Chromium で読み込み、画面の文字・コメントノードの数を数え、parse5 で仕様上のエラー名を出しました。

書き方 画面に出た文字 コメント数 仕様上のエラー
<!-- メモ -->(正しい) 前後の段落だけ 1 なし
複数行を囲む(正しい) 囲んだ外だけ 1 なし
<!-- 区切り -- ここまで --> 前後の段落だけ 1 なし
入れ子にした 内側より後ろと --> 1 nested-comment
閉じ忘れ 開始より前だけ。後ろは全部消える 1 eof-in-comment
! を抜いた <-- メモ --> <-- メモ --> が出る 0 invalid-first-character-of-tag-name
全角の <!-- メモ --> <!-- メモ --> が出る 0 invalid-first-character-of-tag-name
<!-->(中身なしで閉じた) 次の段落と --> 1 abrupt-closing-of-empty-comment
ダッシュ <!–– <p>段落1</p> ––> 段落1 と ––> 1 incorrectly-opened-comment
<! -- メモ -->(すき間あり) 出ない(偶然コメントになる) 1 incorrectly-opened-comment
<!-- メモ --> 出ない 1 incorrectly-closed-comment

読み取れることです。

  • 閉じ忘れは、開始の記号からファイルの最後までが1個のコメントになり、下のページが全部消えます。 「画面が途中から真っ白になった」ときは、まず閉じ忘れを疑います。実測では </body> と </html> までコメントの中に入っていました。
  • ! の抜け・全角の ! は、コメントにならずに記号がそのまま画面に出ます。 日本語入力のまま打つと全角になりやすい部分です。
  • ハイフンがダッシュ(–)に変わったコメントは、仕様上は「間違って開いたコメント」として、最初の > までがコメントになります。 実測では、コメントの中身は –– <p で終わり、隠したはずの「段落1」と ––> が画面に出ました。ブログの編集画面や文書作成ソフトからコピーしたときに、ハイフン2つが自動でダッシュに変わることがあります。
  • <!--> は、仕様では「空のコメントが > で急に閉じた」と扱われます。中身が空のコメントになり、その後ろはふつうに表示されます。
  • <! -- メモ --> や <!-- メモ --> は、エラーではあっても結果として画面からは消えます。見た目が正しくても仕様上は誤りなので、正しい形に直しておくと、ほかのツールで読んだときに困りません。

DOCTYPE の前や html の後ろに書いたコメント

<!-- DOCTYPE より前のコメント -->
<!DOCTYPE html>
<html lang="ja">
...
</html>
<!-- </html> より後のコメント -->

どちらもコメントノードとして文書に残り(2個)、document.compatMode は標準モードを表す CSS1Compat でした。Chromium 141 では、DOCTYPE の前のコメントで互換モード(Quirks モード)にはなりませんでした。

原因の探し方

  1. ブラウザで右クリックし「ページのソースを表示」を開きます。コメントの部分は色が変わるので、どこまでがコメントになっているかが見えます。
  2. DevTools の Elements パネルで、コメントが1かたまりになっているか、途中で切れていないかを見ます。DevTools の使い方は、関連記事「Chrome DevToolsの使い方|デバッグ手順と便利機能一覧」で扱っています。
  3. 原因が見つからないときは、W3C の Nu Html Checker などの検証ツールに HTML を貼ると、エラーの位置が出ます。

ハイフン(--)を含めたときの扱い(HTMLとXHTML)

この節では、「コメントの中でハイフン2つを使ってはいけない」という説明が、いまの HTML でどこまで正しいのかが分かります。

いまの HTML の仕様では、コメントの中に -- があってもエラーになりません。 仕様(13.1.6 Comments)で禁じられているのは、中身を > や -> で始めること、中に <!--・-->・--!> を含めること、<!- で終えることです。

ただし、XML として読む XHTML(application/xhtml+xml で配信したページ)では、-- はエラーになります。Chromium の DOMParser で、同じコメントを2通りに読み込みました。

<!-- 区切り -- ここまで -->  text/html               コメント1個  エラーなし
<!-- 区切り -- ここまで -->  application/xhtml+xml   コメント0個  エラー: error on line 1 at column 52: Comment must not contain '--' (double-hyphen)
<!-- 区切り - ここまで -->   text/html               コメント1個  エラーなし
<!-- 区切り - ここまで -->   application/xhtml+xml   コメント1個  エラーなし
<!--- 3本 --->             text/html               コメント1個  エラーなし
<!--- 3本 --->             application/xhtml+xml   コメント0個  エラー: error on line 1 at column 52: Comment must not contain '--' (double-hyphen)

HTML(text/html)

中の -- はエラーにならない

ハイフンを並べた区切り線も1個のコメント

中に終了の記号を入れると、そこで閉じる

XHTML・XML・SVG ファイル

中の -- はエラーで、ページ全体が表示されない

ハイフン3本で閉じる形もエラー

区切り線は = や * で書く

ハイフンを並べた区切り線(<!--------- 見出し --------->)は、HTML では1個のコメント(中身は ------- 見出し -------)になり、エラーもありませんでした。同じコメントを XML や SVG のファイルにも貼る可能性があるなら、区切り線は = などで書いておくと、どちらでも壊れません。

CSS・JavaScript・PHP・テンプレートエンジンのコメントとの違い

この節では、HTML 以外の言語のコメントの書き方と、それぞれが「ブラウザに届くか」が一目で分かります。

言語・テンプレート 1行 複数行・範囲 ブラウザに届くか
HTML <!-- --> <!-- --> 届く(ソースで見える)
CSS ― /* */ CSS ファイルなら届く
JavaScript // /* */ JS ファイルなら届く
PHP //・# /* */ 届かない
JSP ― <%-- --%> 届かない
Thymeleaf ― <!--/* */--> 届かない
Blade(Laravel) ― {{-- --}} 届かない
Jinja2 ― {# #} 届かない
EJS ― <%# %> 届かない
Handlebars {{! }} {{!-- --}} 届かない
JSX(React) ― {/* */} ビルドで消える
Vue のテンプレート ― <!-- --> 本番ビルドでは消える

サーバー側やビルドのときに消えるコメントは、ブラウザに届きません。HTML のコメントは、テンプレートの中に書いても、そのままブラウザに届きます。

style の中の HTML コメントは CSS を止めない

<style>
<!--
p.t { color: red; }
-->
/* p.u { color: red; } */
</style>
<p class="t">t</p>
<p class="u">u</p>
p.t の色: rgb(255, 0, 0)   ← HTML のコメントで囲んだのに効いている
p.u の色: rgb(0, 0, 0)     ← /* */ で止まっている

<style> の中を HTML のコメントで囲んでも、CSS は止まりません。 CSS の仕様(CSS Syntax Level 3)では、<!-- と --> は CDO・CDC という記号で、スタイルシートの一番外側では読み捨てられます。昔、<style> を知らないブラウザに CSS を見せないために HTML のコメントで囲む書き方が広まり、その名残だと仕様に書かれています。CSS を止めるときは /* */ を使います。

script の中の HTML コメントは「1行コメント」になる

<script>
<!-- console.log("A");
console.log("B");
--> console.log("C");
</script>
<script type="module">
<!-- console.log("D");
</script>
console: B
pageerror: HTML comments are not allowed in modules

ふつうの <script> では、<!-- から行の終わりまでと、行頭の --> から行の終わりまでが、JavaScript の1行コメント(ECMAScript の付属書 B.1.1「HTML-like Comments」)として扱われ、「B」だけが出力されました。type="module" の script では、同じ書き方が構文エラーになります。JavaScript を止めるときは // か /* */ を使います。

PHP:HTML のコメントの中の PHP は実行される

<?php $price = 1980; $secret = "dev-db-pass"; ?>
<p>価格:<?php echo $price; ?>円</p>
<!-- HTML のコメント:<?php echo $secret; ?> -->
<?php // PHP の1行コメント ?>
<?php /* PHP の複数行コメント
         echo $secret; */ ?>
<?php # シャープでも1行コメント ?>
<?php // ここで ?> が来ると PHP のコメントは終わる

PHP 8.4.21 で実行した出力です。

<p>価格:1980円</p>
<!-- HTML のコメント:dev-db-pass -->
 が来ると PHP のコメントは終わる

HTML のコメントの中の <?php echo $secret; ?> は実行され、その値がブラウザに届きました。 PHP のマニュアルでも、// と # の1行コメントは行の終わりか ?> のどちらか先に来たほうで終わる、と書かれています。最後の行で ?> より後ろの文字が出力されたのはこのためです。また、/* */ は最初の */ で終わるので、入れ子にしないよう注意されています。

テンプレートエンジン:自分のコメントは消え、HTML のコメントは残る

Jinja2・EJS・Handlebars で、テンプレートのコメントと HTML のコメントを並べて書き、price = 1980 で出力しました。

[Jinja2 3.1.6]   {# Jinja のコメント #}            → 消える   <!-- HTML のコメント {{ price }} -->      → <!-- HTML のコメント 1980 -->
[EJS 7.0.2]      <%# EJS のコメント %>              → 消える   <!-- HTML のコメント <%= price %> -->     → <!-- HTML のコメント 1980 -->
[Handlebars 4.7.10] {{! コメント }}・{{!-- … --}}   → 消える   <!-- HTML のコメント {{price}} -->       → <!-- HTML のコメント 1980 -->

どのエンジンも、HTML のコメントの中の変数まで埋め込んでブラウザに送りました。 Handlebars のドキュメントには、}} などを含むコメントは {{!-- --}} を使うこと、コメントを出力に残したいなら HTML のコメントを使うこと、と書かれています。

Java のテンプレートは公式の仕様・ドキュメントで確かめました。

  • JSP:Jakarta Server Pages 3.1 の仕様(1.5.1)で、<%-- --%> の中身は「完全に無視される」、HTML のコメントは「解釈されないテンプレートの文字」として扱われ、中の動的な部分は処理される、とされています。
  • Thymeleaf:3.1 のチュートリアル(11 Comments and Blocks)で、<!--/* ... */--> はテンプレートを読むときに取り除かれる「パーサーレベルのコメント」、ふつうの <!-- --> はほかの文字と同じように処理される、とされています。
  • Blade:Laravel のドキュメントで、{{-- --}} は HTML のコメントと違い、アプリが返す HTML に含まれない、とされています。

Javadoc のようなドキュメント用のコメントは、関連記事「Javadocの書き方|タグ一覧(@param,@return)と生成コマンド」で扱っています。

JSX と Vue

$ esbuild a.jsx --jsx=automatic      # {/* JSX のコメント */} を書いたファイル
export const A = () => /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("p", { children: "表示" }) });

$ esbuild b.jsx --jsx=automatic      # <!-- HTML のコメント --> を書いたファイル
✘ [ERROR] Expected identifier but found "!"

    b.jsx:3:5:
      3 │     <!-- HTML のコメント -->
        ╵      ^

JSX の中に HTML のコメントは書けず、構文エラーになります。 JSX では {/* */} と書き、変換後のコードからは消えていました。

Vue のテンプレートは HTML のコメントをそのまま書けます。@vue/compiler-dom で comments の設定を変えて変換すると、true では _createCommentVNode(" Vue のテンプレートのコメント ") が作られ、false では消えました。Vue のドキュメントでは、この設定の既定は false で、本番ではコメントを取り除き、開発中は常に残す、とされています。

コメントはソースで見える(書いてはいけない情報と消し方)

この節では、HTML のコメントが誰に見えるのかと、公開前に何を確かめ、どう消すかが分かります。

HTML のコメントは画面に出ないだけで、ページを開いた人なら誰でも読めます。 次のページを手元のサーバーから配信し、curl で取りました。

$ curl -s -i http://127.0.0.1:34600/secret.html
HTTP/1.0 200 OK
Content-type: text/html
Content-Length: 277

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="utf-8"><title>公開ページ</title></head>
<body>
<!-- TODO: 管理画面 /admin-test/ は公開前に消す -->
<h1>お知らせ</h1>
<!-- <p>11月1日に新料金を発表します</p> -->
<p>本文</p>
</body>
</html>

画面には「お知らせ」「本文」だけが出ますが、ブラウザが受け取る中身には、管理画面の URL も、発表前の文もそのまま入っています。JavaScript からも、document.createTreeWalker(document, NodeFilter.SHOW_COMMENT) で2個のコメントの中身を読み出せました。

公開前に確かめること

  • 1パスワード・API キー・接続先を書いていないかテンプレートの HTML コメントの中の変数も、値が埋め込まれて届く(PHP・Jinja で実測)
  • 2管理画面・テスト用の URL を書いていないかTODO のメモに URL を残しやすい
  • 3発表前の情報をコメントアウトで隠していないか価格・日付・キャンペーンの文は、公開の時点まで HTML に入れない
  • 4人の名前・社内の事情を書いていないか担当者名や取引先名は、課題管理のツールや Git のコミットに書く

見られたくないメモは、PHP・Blade・Jinja などサーバー側のコメントに書けば、ブラウザには届きません。

公開するときにコメントを消す(実測)

ビルドのときに HTML を小さくするツール(ミニファイ)で、コメントを消せます。html-minifier-terser 7.2.0 の removeComments: true で、上のページに3種類のコメントを足して実行しました。

元 405 バイト → 242 バイト
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="utf-8"><title>公開ページ</title></head>
<body>

<h1>お知らせ</h1>

<p>本文</p>
</body>
</html>
<!--[if IE]><p>IE</p><![endif]-->
<!-- 残す -->
<!--! ライセンス表記 -->
405Bコメントを含む元の HTMLコメント5個
242BremoveComments の後約40%小さくなった
3個消されずに残ったコメント条件付き・ignore・! 付き

ふつうのコメントは消えましたが、条件付きコメント、htmlmin:ignore で挟んだ部分、<!--! で始まるコメント(ライセンス表記などに使う形)は残りました。消し忘れを防ぐには、ミニファイの後のファイルを grep -n '<!--' で確かめます。

条件付きコメント(IE用・廃止済み)

この節では、以前のサイトで見かける <!--[if IE]> が何で、いまのブラウザでどう扱われるかが分かります。

条件付きコメントは、Internet Explorer(IE)だけが中を読む特別なコメントでした。Microsoft のドキュメント「Conditional comments are no longer supported」によると、IE10 の標準モードと互換モードでサポートが取り除かれ、ほかのブラウザと同じ「ふつうのコメント」として扱われるようになりました。IE11 のデスクトップアプリは、Windows 10 の半期チャネルで2022年6月15日にサポートが終了しています。

<!--[if IE]><p>IE だけ</p><![endif]-->
<!--[if !IE]><!--><p>IE 以外</p><!--<![endif]-->
<p>通常</p>
画面の文字   : IE 以外 / 通常
コメントノード : 3個  "[if IE]><p>IE だけ</p><![endif]"  "[if !IE]><!"  "<![endif]"

Chromium では、[if IE] の中身は1個のコメントとして隠れ、<!--[if !IE]><!--> の形で書いた「IE 以外」の部分は表示されました。いまのブラウザでは条件付きコメントは意味を持たないので、見つけたら中身ごと消すか、IE 以外向けの部分だけを残すと整理できます。 ただし上で見たとおり、ミニファイのツールには条件付きコメントを残す動きのものがあります。

よくある質問

Q. HTMLのコメントアウトのショートカットは? A. VS Code は Windows・Linux で Ctrl + /、Mac で ⌘ + / です。選んだ一部だけを囲むときは、Windows が Shift + Alt + A、Mac が ⇧⌥A、Linux が Ctrl + Shift + A です。JetBrains の IDE(Windows・Linux)は Ctrl + / と Ctrl + Shift + / です。

Q. Macでコメントアウトするには? A. VS Code では ⌘ + / で、選んだ行がまとめて囲まれます。もう一度 ⌘ + / を押すと解除されます。

Q. 複数行をまとめてコメントアウトするには? A. 範囲の前に <!--、後ろに --> を書きます。エディタでは行を選んで Ctrl + /(Mac は ⌘ + /)を押すと、選んだ範囲全体が1組の記号で囲まれました(Monaco Editor で実測)。

Q. コメントアウトを解除するには? A. 開始と終了の記号を消すか、コメントの中にカーソルを置いて、付けたときと同じショートカットを押します。VS Code の Ctrl + /・Shift + Alt + A は、付ける・外すを切り替える操作です。

Q. HTMLのコメントは入れ子にできますか? A. できません。中にある最初の --> で外側まで閉じ、残りが画面に出ます(Chromium で実測)。内側のコメントを先に外すか、template 要素やサーバー側のコメントで囲みます。

Q. コメントアウトしたのに表示されるのはなぜ? A. 多い原因は、! の抜け、全角の !、ハイフンがダッシュ(–)に変わったこと、中に別のコメントがあることです。逆に、下が全部消えたときは閉じ忘れです。症状ごとの結果は「コメントアウトできない・表示される原因」の表にあります。

Q. コメントの中でハイフン(--)を使ってもいいですか? A. いまの HTML(text/html)ではエラーになりません。XHTML や SVG など XML として読むファイルではエラーになるので、区切り線は = などで書くと安全です。

Q. HTMLのコメントは他人に見えますか? A. 見えます。画面には出ませんが、ページのソースや DevTools、curl で取った中身にそのまま入っています。見られたくないメモはサーバー側のコメントに書きます。

Q. CSSやJavaScriptのコメントアウトは? A. CSS は /* */、JavaScript は //(1行)と /* */(範囲)です。<style> の中を HTML のコメントで囲んでも CSS は効いたままでした。

Q. PHPファイルの中でHTMLの部分をコメントアウトするには? A. <?php /* ... */ ?> で囲むと、中の HTML も PHP も出力されません。HTML のコメントで囲むと、中の PHP は実行されて結果がブラウザに届きます(PHP 8.4 で実測)。

Q. HTMLのコメントを一括で削除するには? A. ビルドのときに HTML を小さくするツールで消せます。html-minifier-terser の removeComments: true では、405 バイトの HTML が 242 バイトになりました。条件付きコメントや <!--! で始まるコメントは残るので、出力を確かめます。

Q. WordPressで書いたコメントが消えたり壊れたりするのは? A. ブロックエディターは、ブロックの区切りを <!-- wp:paragraph --> のような HTML のコメントで保存しています(WordPress の開発者向けドキュメント)。記事の本文に HTML のコメントを例として見せたいときは、コードのブロックの中に書くと、そのまま文字として表示されます。

まとめ

  • HTML のコメントは <!-- から最初の --> まで。画面に出ないだけで、ソースや DevTools では誰でも読める。
  • VS Code は Ctrl + /(Mac は ⌘ + /)で切り替え。HTML は複数行を選ぶと範囲全体が1組の記号で囲まれる。
  • 入れ子にはできない。内側の終了の記号で閉じて残りが表示される。ショートカットでも入れ子になる。
  • 表示されてしまう原因は ! の抜け・全角・ダッシュ・入れ子、全部消えるのは閉じ忘れ(17パターンの実測表)。
  • いまの HTML ではコメントの中の -- はエラーではない。XHTML・XML ではエラー。
  • <style>・<script> の中を HTML のコメントで囲んでも止まらない。CSS は /* */、JS は //・/* */。
  • 見られたくないメモは、PHP・JSP・Thymeleaf・Blade・Jinja などのサーバー側のコメントに書く。

HTML の雛形の書き方は、関連記事「HTMLテンプレートの基本|コピペで使える雛形とheadの書き方を1行ずつ解説」で、HTML のタグの種類と書き方は、関連記事「HTMLタグ一覧表|基本タグから全要素まで表示例・コピペ用コード付き」で扱っています。

参考・出典

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

  • WHATWG「HTML Living Standard 13.1.6 Comments」:https://html.spec.whatwg.org/multipage/syntax.html#comments
  • WHATWG「HTML Living Standard 13.2.2 Parse errors」:https://html.spec.whatwg.org/multipage/parsing.html#parse-errors
  • W3C「CSS Syntax Module Level 3」:https://www.w3.org/TR/css-syntax-3/
  • Ecma International「ECMAScript Language Specification B.1.1 HTML-like Comments」:https://tc39.es/ecma262/#sec-html-like-comments
  • MDN「<template>: The Content Template element」:https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/template
  • Visual Studio Code「Default keyboard shortcuts reference」:https://code.visualstudio.com/docs/reference/default-keybindings
  • Visual Studio Code「Keyboard shortcuts for Visual Studio Code」:https://code.visualstudio.com/docs/configure/keybindings
  • microsoft/vscode「extensions/html/language-configuration.json」:https://github.com/microsoft/vscode/blob/main/extensions/html/language-configuration.json
  • JetBrains「WebStorm: Write and edit source code」:https://www.jetbrains.com/help/webstorm/working-with-source-code.html
  • JetBrains「WebStorm: Learn shortcuts」:https://www.jetbrains.com/help/webstorm/mastering-keyboard-shortcuts.html
  • Neovim「runtime/doc/various.txt(commenting)」:https://github.com/neovim/neovim/blob/master/runtime/doc/various.txt
  • Neovim「runtime/doc/news-0.10.txt」:https://github.com/neovim/neovim/blob/master/runtime/doc/news-0.10.txt
  • Microsoft Learn「Conditional comments are no longer supported」:https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/compatibility/hh801214(v=vs.85)
  • Microsoft Learn「Internet Explorer 11 - Microsoft Lifecycle」:https://learn.microsoft.com/en-us/lifecycle/products/internet-explorer-11
  • PHP マニュアル「Comments」:https://www.php.net/manual/en/language.basic-syntax.comments.php
  • Jakarta EE「Jakarta Server Pages 3.1」:https://jakarta.ee/specifications/pages/3.1/jakarta-server-pages-spec-3.1
  • Thymeleaf「Tutorial: Using Thymeleaf(3.1)11 Comments and Blocks」:https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html
  • Laravel「Blade Templates(13.x)Comments」:https://laravel.com/docs/blade#comments
  • Jinja「Template Designer Documentation(3.1)Comments」:https://jinja.palletsprojects.com/en/stable/templates/#comments
  • EJS「README(Tags)」:https://github.com/mde/ejs
  • Handlebars「Introduction(Template comments)」:https://handlebarsjs.com/guide/#template-comments
  • Vue.js「Application API: app.config.compilerOptions.comments」:https://vuejs.org/api/application.html#app-config-compileroptions-comments
  • WordPress Developer Resources「Key Concepts(Block Editor)」:https://developer.wordpress.org/block-editor/explanations/architecture/key-concepts/
  • parse5:https://github.com/inikulin/parse5
  • html-minifier-terser:https://github.com/terser/html-minifier-terser

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

(記載例)出典:株式会社RJC「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で一緒に開発しながら、 成長を楽しみませんか?