HTML

The <data> element in HTML links the text displayed for humans with machine-readable values like numbers or identifiers, making it possible to handle information in a more semantic way.

data 要素

<data>要素とは?

<data>要素 は、HTML5で導入された比較的新しい要素の一つで、「人間に見せるテキスト情報」と「機械が処理できるデータ値」を紐づけるために使用されます。具体的には、以下のようなシーンが想定されます。

<data>要素を使うことで、可視テキスト(ユーザが見るテキスト) と 機械可読なデータ値(value属性など) を一貫性をもって管理できます。

基本構文

HTML

<data value="機械可読なデータ">
	ユーザが見るテキスト
</data>

基本的な使用例

最も単純な例を挙げると、商品価格を表示するケースが分かりやすいでしょう。

HTML

<p>
	商品価格: 
	<data value="1000">
		¥1,000
	</data>
</p>

商品価格: ¥1,000

この例では、ユーザには「¥1,000」と表示されますが、HTMLソースコード上は value="1000" として数値が明示されています。

検索エンジンやスクリプトなどの機械処理で「この値は 1000 という数値である」と解釈させやすくなります。

なぜ<data>要素が重要なのか?

機械可読性と人間可読性の両立

HTML上で数値や識別子をそのまま出力すると、それがどういった意味を持つ値なのか機械側で判断しづらい場合があります。一方、<data>要素を用いると、機械可読 (machine-readable) な値を value に設定しつつ、ユーザにはよりわかりやすいフォーマットで表示が可能になります。

マイクロデータ・セマンティックWebとの相性

検索エンジンなどのクローラにとって、<data>要素の value 属性情報はデータを整理・解析するうえでヒントになります。また、セマンティックWebやマイクロデータを使って構造化データを埋め込む際にも、<data>要素は相性が良いです。

たとえば Schema.org の語彙を使って商品情報やレビューなどをマークアップする場合、<data>要素で数値情報を指定することで、より明示的に機械に伝えることができます。

アクセシビリティ面

ユーザがスクリーンリーダーを利用している場合などでも、<data>要素の適切な使用が、値に対する説明をしやすくする可能性があります。

ただし、まだスクリーンリーダーが <data>要素を完全に特別扱いするケースは多くないため、ARIA属性などの利用や、表示テキストの工夫で補完する必要があります。

<data>要素と類似のアプローチ

<span> + data-* 属性

HTML5では、独自のデータを要素に紐づける方法として、data-xxx 属性(カスタムデータ属性) もよく使われます。

たとえば、以下のように data-price という属性を独自に定義して数値を保持し、見た目上は整形された通貨表記を出すといった方法です。

HTML

<p>
	商品価格:
	<span data-price="1000">
		¥1,000
	</span>
</p>

商品価格: ¥1,000

JavaScriptからは

JavaScript

const spanEl = document.querySelector('[data-price]');
const price = spanEl.dataset.price; // "1000"

という形で取り出せます。

<data>要素との違い は、data-* 属性の場合、HTML仕様のセマンティックな要素としては特に決まった意味を持たないことです。一方、<data>は「機械可読な値を持つ要素」であるというセマンティクスがあります。

<meter> 要素や <progress> 要素

数値を扱うHTML要素としては、<meter>(メーター)や <progress>(進捗)なども存在します。これらは特定の範囲内の値を表示することを目的としており、ビジュアル的にゲージやプログレスバーを表すことができます。

ただ単純に任意のテキストに対して機械可読値を紐づけたいだけであれば、<data><span data-*>などが向いています。

<data>要素の応用例

内部IDやコードとの関連付け

たとえば、社員名簿やユーザー一覧などを表示するときに、ユーザーIDを value 属性として持たせることで、ユーザーに表示するときはわかりやすい名前を出しつつ、内部でのIDをしっかりと機械に渡すことが可能です。

HTML

<ul>
	<li>
		<data value="U12345">
			山田 太郎
		</data>
	</li>
	<li>
		<data value="U67890">
			佐藤 花子
		</data>
	</li>
</ul>

このようにしておくと、JavaScriptやサーバーサイドで処理するときに、表示名と裏のIDが一対一対応の関係で管理しやすくなります。

日付・時刻との組み合わせ

日付や時刻の情報を機械可読形式で持たせたいときは、通常**<time>要素**がよく使われますが、場合によっては<data>要素でもよいケースがあります。ただし、日付・時刻を扱うなら<time>の方がよりセマンティックで推奨度が高いです。

どうしても<data>で特定のフォーマットを示したいなら、次のように利用できます。

HTML

<p>
	イベント開始:
	<data value="2025-01-01T10:00:00">
		1月1日 午前10時
	</data>
</p>

イベント開始: 1月1日 午前10時

<time>要素であれば、<time datetime="2025-01-01T10:00:00">1月1日 午前10時</time> のように、より明確な属性名 datetime を使います。用途に応じて使い分けましょう。

通貨や重さ・長さなどの単位を扱う

数値に通貨単位や重さ・長さの単位が付随する場合、表示上は「○○ kg」「$○○」などの書式を使う一方で、機械が読むときには純粋な数値だけを参照できる形にしておくと便利です。

HTML

<p>
	重量:
	<data value="2.5">
		2.5 kg
	</data>
</p>

重量: 2.5 kg

検索エンジンが数値解析を行っている場合、value が数値として処理されることが期待できます。また、JavaScriptで parseFloat() などを使って、ユーザが入力したデータに対しリアルタイムでバリデーションや計算を行う際にも役立ちます。

JavaScriptとの連携

値の取得

<data>要素の value 属性は、.value プロパティで簡単に取得が可能です。また、getAttribute() で生の属性値として取得する方法もあります。

HTML

<data id="price" value="1000">¥1,000</data>

<script>
	const dataEl = document.getElementById('price');
	
	// 1. JavaScriptのプロパティを利用する
	console.log(dataEl.value); 
	// "1000" (文字列として返る)
	
	// 2. あるいは getAttribute() で取得
	console.log(dataEl.getAttribute('value'));
	// "1000"
</script>
¥1,000

値の更新

<data>要素の値をJavaScriptから更新することも可能です。value プロパティに対して代入すると、HTML上の属性値も更新されます。

HTML

<data id="stock" value="20">在庫: 20</data>

<script>
	const stockEl = document.getElementById('stock');
	
	// 在庫数を5に更新する
	stockEl.value = "5";
	
	// 画面上に見せるテキストも更新する
	stockEl.textContent = "在庫: 5";
</script>
在庫: 20

このようにすると、value"5" に変わり、要素の中身のテキスト(ユーザが閲覧できる部分)も "在庫: 5" となります。

ユーザに見せる表示と、裏で管理する値を別々に制御することで、より柔軟なUIを作れます。

<data>要素のブラウザ対応状況

セマンティックな情報を最大限活かすためには、モダンブラウザをターゲットとするのが望ましいです。

<data>要素を使う際のベストプラクティス

本当に<data>要素が適切か検討する
<data>value属性と要素内容の整合性を保つ
可能ならマイクロデータや構造化データと組み合わせる
アクセシビリティを意識する
JavaScriptで動的に値を更新する場合は、表示テキストも合わせて更新する

まとめ

<data>要素は、セマンティックに「機械可読な値を有するテキスト」をマークアップできる便利な要素です。まだまだ <span data-*><time> など他の要素に比べるとマイナーではありますが、使いこなすと次のようなメリットを享受できます。

機械可読性の向上
検索エンジンやスクリプトとの連携がより明確になる
表示と内部値の分離
ユーザ向けの表示と機械向けの値を一元管理できる
セマンティックなマークアップ
より意味のあるHTMLを書くことで、メンテナンス性や可読性が向上する

一方で、実案件に導入するときは、要素のサポート状況や代替要素との役割などを十分理解し、適材適所で使うことが重要です。

カスタムデータ属性(data-*)との住み分けや、<time><meter><progress>など類似用途の要素も確認したうえで、最適な要素を選択しましょう。

Sample

最後に、本記事の要点を踏まえたサンプルWebページ例を示します。<data>要素を利用して、商品一覧と在庫管理を簡単にマークアップしたページを想定してみましょう。

HTML

<h2>商品一覧</h2>
<ul>
	<li>
		<strong>商品名:</strong> 高級コーヒー豆
		<br>
		<strong>価格:</strong> 
		<data id="coffee-price" value="1200">¥1,200</data>
		<br>
		<strong>在庫:</strong> 
		<data id="coffee-stock" value="15">15袋</data>
	</li>
	<li>
		<strong>商品名:</strong> 紅茶ティーバッグ
		<br>
		<strong>価格:</strong> 
		<data id="tea-price" value="800">¥800</data>
		<br>
		<strong>在庫:</strong> 
		<data id="tea-stock" value="10">10箱</data>
	</li>
</ul>

<button id="buy-coffee">コーヒー豆を1袋購入</button>
<button id="buy-tea">紅茶を1箱購入</button>

<script>
	// 在庫を1つ減らすサンプルスクリプト
	function buyProduct(dataElementId) {
		const dataEl = document.getElementById(dataElementId);
		// 現在のvalue属性を取得 (文字列として返るので数値に変換する)
		let stockValue = parseInt(dataEl.value, 10);

		if (stockValue > 0) {
			stockValue--;
			// value属性を更新
			dataEl.value = stockValue.toString();
			// 表示テキストも更新
			dataEl.textContent = stockValue + (dataElementId === 'coffee-stock' ? '袋' : '箱');
		} else {
			alert('在庫がありません。');
		}
	}

	document.getElementById('buy-coffee').addEventListener('click', () => {
		buyProduct('coffee-stock');
	});

	document.getElementById('buy-tea').addEventListener('click', () => {
		buyProduct('tea-stock');
	});
</script>

商品一覧

上記のサンプルページでは、商品名・価格・在庫を表示しつつ、<data>要素の value 属性で在庫数を管理しています。購入ボタンを押すと在庫数が1つ減り、表示上も更新される仕組みです。これにより、ユーザに見せるテキスト と システムが扱う数値 が分離されつつ、一貫した管理が可能となります。

おわりに

<data>要素はまだあまり普及していませんが、「表示内容に対して裏で機械可読な値をもたせたい」 というニーズに合致する場合、とても有効に使えます。

ぜひ、普段のWebアプリケーション開発やSEO対策、マイクロデータとの連携などの場面で、適宜活用してみてください。そうすることで、よりセマンティックで拡張性の高いHTMLを実現できます。