HTML 入門

HTML <span> タグ

HTML において、要素はそのデフォルトの表示形式に基づいて、大きく「ブロックレベル(Block-level)」と「インライン(Inline-level)」の二つに分類されます。

前章では <div> タグについて学びました。これは汎用的なブロックレベルコンテナであり、常に新しい行から始まり、利用可能な全幅を占有する性質を持っています。

しかし、ウェブ開発の実務では、より精密なコントロールが求められる場面が多々あります。例えば、「段落内の一部の文字だけ色を変えたいが、改行はさせたくない」という場合です。そこで登場するのが <span> タグです。

<span> タグは、HTML における汎用的なインライン級コンテナです。その設計思想は、ページの全体的なレイアウトに影響を与えず、強制的な改行も行わずに、コンテンツの一部を「括る」ことにあります。これにより、特定の箇所にスタイルを適用したり、JavaScript で操作したりすることが可能になります。精密なテキストタイポグラフィを実現する上で、欠かすことのできないツールです。

1. インライン要素(Inline Elements)とは?

<span> タグの能力を最大限に引き出すために、まずは「インライン要素」とは何か、そしてブロックレベル要素と何が違うのかを理解しておく必要があります。

インライン要素は、新しい行から始まることはありません。コンテンツの幅が必要な分だけを占有し、文章の中の一語一語のように、周囲のテキストと自然に流れるように配置されます。行の末尾に達した時のみ、次の行へと折り返されます。

これまでの学習の中で、実は多くの一般的なインライン要素に触れてきました:

  • <a>: 超リンク(ハイパーリンク)
  • <strong><em>: 重要性や強調を表す
  • <i><b>: 斜体や太字(通常、セマンティクスは持たない)
  • <mark>: テキストのハイライト表示
  • <img>: 画像の挿入

これらの要素は一行のテキストの中にシームレスに溶け込み、視覚的な断絶を生むことなくコンテンツを構成します。

2. <span> タグを理解する

<span> タグは純粋なインラインコンテナです。<div> が中立的なブロックレベルコンテナであるのと同様に、<span> は中立的なインラインコンテナです。

デフォルトの状態では、テキストに <span> タグを付けても視覚的な変化はなく、ドキュメントのレイアウトも変わりません。これに class(クラス名)id 属性を組み合わせ、CSS でスタイルを定義したり JavaScript で動的なインタラクションを実装したりしたとき、初めてその真価が発揮されます。

<span> の主な用途:

  • 特定のテキストへのスタイリング: 長い文章の中で、特定の単語、フレーズ、文字に対して個別に色、フォント、サイズなどの CSS プロパティを設定します。
  • JavaScript 操作のターゲット: リアルタイムで更新される数値など、ページ内の特定のテキスト片を JavaScript で隔離・操作するためのフックとして利用します。
  • 限定的なセマンティック・グルーピング(無意味): <span> 自体に意味はありませんが、適切な HTML5 セマンティックタグ(<time><abbr> など)がない場合に、コード上で関連するインラインテキストをグループ化するために使用します。

基本的なデモを見てみましょう:

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Span タグの基本例</title>
</head>
<body>
    <p>これは普通のテキストです。時々、その中の <span>数文字だけ</span> をハイライトしたいことがあります。</p>
    <p>注意してください。<span>span で囲まれた文字</span> は依然として同じ行に留まり、文章の流れを全く妨げません。</p>
</body>
</html>

この例では、<span> タグが「数文字だけ」と「span で囲まれた文字」をラップしています。ブラウザで表示すると、通常のテキストと何ら変わりがないことが分かります。テキストが同じ行に収まっている様子は、<span> タグの「インライン」特性を完璧に表しています。

3. <span><div> の違い

<span>(インライン)と <div>(ブロックレベル)の違いを理解することは、ウェブタイポグラフィをマスターする鍵です。

特性<span> (インライン要素)<div> (ブロックレベル要素)
デフォルトの表示形式新しい行から始まらない。文章の流れに沿って配置される。常に新しい行から始まる。
幅 (Width)コンテンツの幅のみを占有する。デフォルトで親コンテナの 100% の幅を占有する。
高さ (Height)高さはコンテンツによって決まる。CSS で widthheight を直接制御できない(display プロパティを変えない限り)。高さはコンテンツによって決まる。widthheight を自由に設定可能。
マージン/パディング垂直方向(上下)の marginpadding は周囲の行を押し広げない。水平方向(左右)は有効。上下左右すべての marginpadding が有効。周囲のブロックレベル要素を押し広げる。
主な用途小さなテキスト片やインラインコンテンツのグループ化・スタイリング。大きなコンテンツの構造的なグループ化やレイアウト構築。

4. <span> の実践的な活用シーン

ウェブページ上の極めて限定的な範囲を精密にコントロールしたいとき、<span> は代替不可能なツールとなります。

4.1 テキストの特定とスタイリング

これは <span> の最も一般的な使い方です。通常、classid 属性を付与して CSS でターゲットを指定します。

例 1:長文内の重要用語のハイライト
法的なドキュメントをマークアップしており、特定の用語を強調して注意を促す必要があると想定します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Span スタイルの例</title>
    <style>
        /* 実戦では外部 CSS ファイルに記述しますが、ここではデモ用に内部記述します */
        .critical-term {
            color: #CC0000; /* 深い赤色 */
            font-weight: bold; /* 太字 */
            background-color: #FFFFCC; /* 薄い黄色の背景 */
            padding: 2px 4px; /* 文字の周囲に少しの余白 */
            border-radius: 3px; /* 緩やかな角丸 */
        }
        .highlight-phrase {
            color: #006600; /* 深い緑色 */
            font-style: italic; /* 斜体 */
        }
    </style>
</head>
<body>
    <p>
        ユーザーは本ドキュメントに規定された <span class="critical-term">利用規約</span> を遵守することに同意します。
        遵守されない場合はサービスの停止を招く可能性があります。続行する前に、<span class="highlight-phrase">すべての内容を注意深くお読みください</span>。
    </p>
    <p>
        登録プロセスにおいて、すべてのユーザーは当社の <span class="critical-term">プライバシーポリシー</span> を承諾する必要があります。
        このポリシーは、お客様の個人情報の取り扱いについて詳細に説明しています。
    </p>
</body>
</html>

この例では、異なる class を持った <span> タグを使用しています。CSS をまだ学習していなくても、<span> が段落のレイアウトを壊すことなく、「利用規約」や「プライバシーポリシー」に独立した視覚スタイルを与えていることがはっきりと分かります。

例 2:数値と単位に異なるスタイルを設定する
数値を際立たせ、単位を少し控えめに表現したい場合に有効です。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Span 単位のタイポグラフィ例</title>
    <style>
        .value {
            font-weight: bold;
            color: #0056b3; /* 青色 */
            font-size: 1.2em; /* 少し大きく */
        }
        .unit {
            color: #6c757d; /* グレー */
            font-size: 0.9em; /* 少し小さく */
        }
    </style>
</head>
<body>
    <p>必要なケーブルの総延長は <span class="value">150</span><span class="unit"> メートル</span>です。</p>
    <p>荷物の重量は約 <span class="value">2.5</span><span class="unit"> kg</span>です。</p>
    <p>記録された平均気温:<span class="value">22.5</span><span class="unit">°C</span>。</p>
</body>
</html>

ここでは、二つの <span> タグを隣接させ、数値と単位をそれぞれラップしています。これらは同じ行に並びますが、CSS によって全く異なる印象を与えることができます。

4.2 動的コンテンツの「足場」として

JavaScript を用いた動的なウェブサイトにおいて、<span> は非常に重要です。JavaScript がテキスト全体をリロードすることなく、特定の一部の文字だけをこっそり書き換えるための「フック(引っ掛かり)」を提供します。

例:リアルタイムの株価情報
「テック企業の株価は現在 $123.45 で、今日は 0.8% 上昇しています。」という一文があるとします。
株価が秒単位で変動するとき、文章全体をリフレッシュしたくはありません。代わりに、数値だけを固有の id を持つ <span> で囲みます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Span 動的コンテンツの例</title>
</head>
<body>
    <p>
        テック企業の株価は現在 <span id="techcorp-price">$123.45</span> で、
        今日は <span id="techcorp-change">0.8% 上昇</span> しています。
    </p>
    
    <script>
        // JavaScript が ID を使って span の内容を書き換えるイメージです
        /*
        setInterval(() => {
            const priceSpan = document.getElementById('techcorp-price');
            // 新しい価格を取得したと仮定
            priceSpan.textContent = '$125.00'; 
        }, 3000);
        */
    </script>
</body>
</html>

5. よく使われる HTML インライン要素一覧

タグ名称役割と主なユースケース
<span>汎用コンテナ。セマンティクスを持たない。主に CSS スタイリングや JavaScript 操作のフックとして利用される。
<a>超リンク(Anchor)。他ページ、ファイル、同一ページ内、メールアドレス等へのリンクを作成。
<strong>重要な強調。内容が強い重要性、深刻さ、緊急性を持つことを示す。ブラウザでは太字で表示される。SEO やアクセシビリティに有効。
<em>強調(Emphasis)。アクセントを変えて強調することを示す。ブラウザでは斜体で表示される。
<mark>ハイライトテキスト。ユーザーの注意を引くためにマーカーを引いたような効果。デフォルトで黄色背景。
<code>コンピュータコード。短いコードの断片を囲む。通常、等幅フォント(Monospace)で表示。
<sub>下付き文字(Subscript)。化学式(H₂O)や数式で使用。
<sup>上付き文字(Superscript)。べき乗(x²)や注釈番号で使用。
<q>短い引用(Quote)。一行以内の短い引用。ブラウザが自動的に二重引用符(" ")を付ける。
<b>視覚的太字。単に太字にするだけで、重要性の意味は持たない(基本的には <strong> 推奨)。
<i>視覚的斜体。単に斜体にする。外国語、専門用語、思考活動などを表す(基本的には <em> 推奨)。
<br>換行(Break)。強制的に改行を入れる。終了タグのない空要素。
<img>画像(Image)。ウェブページに画像を埋め込む。
<input>入力ボックス。ユーザーからの入力を受け取るフォームコントロール。
<button>ボタン。クリック可能なボタン要素。
<label>フォームラベル。入力フォームに説明テキストを付け、クリックでのフォーカス移動を可能にする。