タイトル: 空白(スペース)の入力方法
SEOタイトル: HTML 空白 (スペース) 入力完全ガイド — nbsp/CSS white-space/pre タグ
この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;background:#fffbea;border:1px solid #f4c430;margin:1em 0;width:100%"><tr><td style="background:#f4c430;color:#000;font-weight:bold;padding:8px">この記事の要点</td></tr><tr><td style="padding:10px"><ul><li>HTML は<strong>連続する空白を 1 つに圧縮</strong>する。半角スペースを並べても 1 つに見える</li><li>空白を保持するには: <strong> </strong> / <strong><pre></strong> / <strong>CSS white-space: pre</strong></li><li>幅違いの空白: <strong> </strong> (en) / <strong> </strong> (em) / <strong> </strong> (細)</li><li>改行も同様に圧縮される → <strong><br></strong> / <strong>white-space: pre-wrap</strong></li><li>推奨は CSS で。整形のために <code> </code> 連打はアクセシビリティ的に NG</li></ul></td></tr></table>
<h2>HTML の空白圧縮ルール</h2>
<p>HTML パーサは<strong>連続する空白文字 (スペース / タブ / 改行)</strong> を 1 つの半角スペースに圧縮します。これは仕様 (CSS の <code>white-space: normal</code>) によるもの:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-html"><!-- ❌ ソース上で 5 つスペースを入れても -->
<p>Hello World</p>
<!-- 表示は: "Hello World" (1 つに) -->
<!-- 改行も圧縮 -->
<p>Hello
World</p>
<!-- 表示は: "Hello World" --></code></pre>
<h2>方法1: (Non-Breaking Space)</h2>
<p>もっとも基本。<strong>圧縮されず、改行もされない</strong>半角スペース:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-html"><!-- 連続スペース表現 -->
<p>Hello World</p>
<!-- 表示: "Hello World" (5 つのスペース) -->
<!-- 行頭インデント -->
<p> インデント文字</p>
<!-- 単位や数値の改行禁止 -->
<p>合計 1,000 円</p>
<!-- 「1,000」と「円」の間で改行されない --></code></pre>
<h2>各種空白文字</h2>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th>エンティティ</th><th>名前</th><th>幅</th><th>用途</th></tr></thead>
<tbody>
<tr><td><code> </code></td><td>Non-Breaking Space</td><td>通常の半角スペース幅 (U+00A0)</td><td>改行禁止スペース</td></tr>
<tr><td><code> </code></td><td>En Space</td><td>1/2 em (U+2002)</td><td>欧文の中スペース</td></tr>
<tr><td><code> </code></td><td>Em Space</td><td>1 em (U+2003)</td><td>欧文の広いスペース</td></tr>
<tr><td><code> </code></td><td>Thin Space</td><td>1/6 em (U+2009)</td><td>細い区切り</td></tr>
<tr><td><code> </code></td><td>Hair Space</td><td>極細 (U+200A)</td><td>装飾的に狭く</td></tr>
<tr><td><code>&zwsp;</code></td><td>Zero-Width Space</td><td>0 (U+200B)</td><td>改行可ポイントを作る (見えない)</td></tr>
<tr><td><code> </code> または「 」</td><td>Ideographic Space</td><td>全角 1 文字 (U+3000)</td><td>日本語の全角スペース</td></tr>
</tbody>
</table>
<h2>方法2: <pre> タグ</h2>
<p><code><pre></code> 内では<strong>空白も改行もそのまま保持</strong>されます。コード片や ASCII アート向け:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-html"><pre>
function hello() {
if (cond) {
return "many spaces";
}
}
</pre>
<!-- インデントもスペースも改行もすべて保持 --></code></pre>
<h2>方法3: CSS white-space</h2>
<p>CSS で空白の扱いを制御するのが現代的な解決法:</p>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th>white-space 値</th><th>連続空白</th><th>改行</th><th>自動折り返し</th></tr></thead>
<tbody>
<tr><td><code>normal</code> (既定)</td><td>圧縮</td><td>圧縮</td><td>する</td></tr>
<tr><td><code>nowrap</code></td><td>圧縮</td><td>圧縮</td><td>しない (1 行に固定)</td></tr>
<tr><td><code>pre</code></td><td>保持</td><td>保持</td><td>しない</td></tr>
<tr><td><code>pre-wrap</code></td><td>保持</td><td>保持</td><td>する ★ 推奨</td></tr>
<tr><td><code>pre-line</code></td><td>圧縮</td><td>保持</td><td>する</td></tr>
<tr><td><code>break-spaces</code></td><td>保持</td><td>保持</td><td>する (行末空白も改行可)</td></tr>
</tbody>
</table>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-css">/* テキストエリアやコードブロックでよく使う */
.code {
white-space: pre-wrap; /* 改行 + 空白保持、行末で折り返す */
font-family: monospace;
}
/* タグ風表示で改行禁止 */
.tag {
white-space: nowrap;
display: inline-block;
padding: 2px 8px;
}
/* チャット風 (改行は保持、空白は圧縮) */
.message {
white-space: pre-line;
}</code></pre>
<h2>JavaScript での空白挿入</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-javascript">// textContent はそのまま表示 (HTML エンティティは効かない)
el.textContent = 'a b'; // 表示: "a b" (圧縮される)
// innerHTML なら HTML エンティティが効く
el.innerHTML = 'a b'; // "a b"
// Unicode で直接書く
el.textContent = 'a b'; // U+00A0 を直接
// 全角スペース
el.textContent = 'a b'; // "a b"
// 改行
el.textContent = 'line 1\nline 2'; // textContent では \n が改行扱いされない
// → CSS で white-space: pre or el.innerHTML = 'line 1<br>line 2'</code></pre>
<h2>用途別のおすすめ</h2>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e8f5e9"><th>やりたいこと</th><th>推奨</th><th>避けるべき</th></tr></thead>
<tbody>
<tr><td>余白を作りたい (装飾)</td><td>CSS <code>padding</code> / <code>margin</code></td><td> 連打</td></tr>
<tr><td>テーブルや桁揃え</td><td>CSS Grid / table</td><td> 連打</td></tr>
<tr><td>「1,000 円」を改行させない</td><td><code> </code> 1 個 or <code>white-space: nowrap</code></td><td>—</td></tr>
<tr><td>コードを表示</td><td><code><pre><code></code></td><td>—</td></tr>
<tr><td>ユーザ入力をそのまま表示</td><td><code>white-space: pre-wrap</code></td><td>innerHTML (XSS リスク)</td></tr>
<tr><td>長い単語の折り返し</td><td><code>word-break: break-word</code></td><td>—</td></tr>
</tbody>
</table>
<h2>アクセシビリティ・SEO 上の注意</h2>
<ul>
<li><strong> を装飾目的で多用しない</strong> — スクリーンリーダーが余分に読み上げる、検索エンジンも単語分割に失敗する</li>
<li>段落の余白は CSS <code>margin</code> / <code>padding</code> で表現</li>
<li>桁揃えは表 (<code>table</code> / CSS Grid) で表現</li>
<li>「ふ り が な」のような装飾は<strong>letter-spacing</strong> で</li>
</ul>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-css">/* 文字間隔を空ける (空白を入れない) */
.spaced {
letter-spacing: 0.5em;
}
/* インデント */
.indent {
text-indent: 2em;
}</code></pre>
<h2>FAQ</h2>
<p><strong>Q: 全角スペースと nbsp の違いは?</strong><br />
A: <code> </code> は半角幅のスペース、全角スペース (U+3000、「 」) は全角文字幅。日本語文中の見栄えなら全角スペースの方が自然なケースが多い。</p>
<p><strong>Q: 半角スペースを直接書いても表示される場合がある</strong><br />
A: <code><textarea></code> や <code><pre></code> 内、または CSS <code>white-space: pre/pre-wrap</code> 適用済要素では保持されます。</p>
<p><strong>Q: 改行を半角スペースに置き換えるには?</strong><br />
A: JavaScript で <code>str.replace(/\n+/g, ' ')</code> / CSS では <code>white-space: normal</code> がデフォルトでそうなる。</p>