セマンティックHTML

HTML5セマンティクス(タグ、ランドマーク、見出し、フォーム、ARIA)をレビュー、書き換え、説明します。ユーザーがHTMLを貼り付けたときや、マークアップのレビュー、適切なタグ、アクセシビリティ、'divitis'の修正を依頼したときに使用します。

セマンティックHTML とは?

このスキルは、HTMLのセマンティクスをレビューし、修正されたバージョンと各選択の理由を説明するためのものです。主な目的は、**プレーンなHTML5**に焦点を当て、フレームワークに依存しないことです。JSXなどのテンプレート言語でコードが提供された場合でも、最終的なマークアップのみを分析し、HTMLで回答します。 このスキルは、ブラウザがHTMLをDOMに変換し、そこから**アクセシビリティツリー**を構築するという基本原理に基づいて説明を行います。各タグには暗黙のロール(`<button>`→button、`<nav>`→navigationなど)があり、スクリーンリーダーや検索エンジンはそのツリーを読み取ります。CSSが消えても構造が意味をなすかどうかというメンタルテストを推奨し、抽象的なルールではなく具体的な例(「スクリーンリーダーは...とアナウンスします」「Tabキーはこの要素をスキップします」)を用いて説明します。 ワークフローは、まずタグを見る前にコンテンツを理解し、次にチェックリスト(ドキュメント、ランドマーク、見出し、インタラクション、フォーム、リストとテーブル、メディア、テキスト、ARIA)に沿ってレビューし、最後に定義された形式(診断、修正コード、理由)で回答します。過剰修正を避け、レイアウトやスタイリングのみのための`<div>`や`<span>`はそのまま維持することを推奨します。 このスキルは、Claude Code、Cursor、CodexなどのAIエージェントで使用でき、ユーザーが記述した言語で応答します。MDNやHTML Living Standardを必要に応じて参照し、ルールに疑問がある場合はリンクを引用します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lucasaugustsof/skills/tree/HEAD/semantic-html

Installed? Explore more 生産性&コラボレーション skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

セマンティックHTML は何をしますか?

HTMLをレビューし、修正版を返し、各選択の理由を説明するのを支援します。常にプレーンなHTML5に焦点を当て、フレームワークに依存しません。コードがJSXや他のテンプレートとして提供された場合でも、結果のマークアップのみを分析し、HTMLで回答します。

ユーザーが記述した言語で返信します。

セマンティクスが重要な理由(説明に使用)

ブラウザはHTMLをDOMに変換し、そこからアクセシビリティツリーを構築します。すべてのタグには暗黙のロールがあります(<button>→button、<nav>→navigation、<h2>→見出しレベル2)。スクリーンリーダー、検索エンジン、リーダーモード、拡張機能はそのツリーを読み取り、CSSは読み取りません。<div>をボタンのようにスタイリングしても、見た目はボタンですが、ツリーにとっては単なる汎用ブロックです。フォーカスを受け取らず、Enter/Spaceに応答せず、ボタンとしてアナウンスされません。

説明は、ブラウザが何を理解し、ページを使用する人にとって何が変わるかに基づいて行い、暗記したルールに頼らないようにしてください。抽象的な説明よりも、具体的な例(「スクリーンリーダーは...とアナウンスします」「Tabキーはこの要素をスキップします」)を優先してください。

有用なメンタルテスト:CSSが消えた場合、構造はまだ意味をなしますか?

ワークフロー

  1. タグを見る前にコンテンツを理解します。 各ブロックは何ですか?ナビゲーション、メインコンテンツ、独立したアイテム、インタラクティブなコントロール?意図があいまいな場合(例:ボタンのように見えるリンク)、最も可能性の高い読み取りを想定し、どの想定をしたかを明記します。
  2. 以下のチェックリストを使用してレビューします。
  3. 定義された形式で回答します。

レビューチェックリスト

ドキュメント

  • <!DOCTYPE html>、<html lang="...">、<meta charset="utf-8">、<meta name="viewport">、説明的な<title>(スニペットが完全なドキュメントの場合のみ)。

ランドマーク

  • <header>、<nav>、<main>(ページに1つだけ表示可能)、<aside>、<footer>。
  • <section>はテーマ別のコンテンツをグループ化し、通常は見出しを持ちます。見出しがない場合は、おそらく<div>であるべきです。
  • <article>はそれ自体で意味をなすコンテンツ(投稿、商品カード、コメント)です。
  • ページに複数の<nav>がある場合→aria-labelで区別します。

見出し

  • レベルをスキップしない階層(h2→h4は問題です)。
  • 見出しはそのセクションを説明します。テキストを大きくするためだけに見出しを使用したり、見出しの代わりにスタイル付きテキストを使用しないでください。

インタラクション

  • ページ上のアクション→<button>(フォーム内では明示的なtypeを付ける)。別のURLへのナビゲーション→<a href>。
  • <div onclick>、<span onclick>、hrefのない<a>は注意信号です。
  • ネイティブ要素を再実装する前に検討する:<details>/<summary>、<dialog>。

フォーム

  • すべてのフィールドには関連する<label>があります(for/id、または入力をラップ)。プレースホルダーはラベルの代わりになりません。
  • ラジオ/チェックボックスグループは<fieldset> + <legend>で囲みます。
  • 適切なtype(email、tel、number、date...)と、必要に応じてautocomplete。

リストとテーブル

  • アイテムのセット→<ul>/<ol>;用語と定義のペア→<dl>。
  • <table>は表形式データのみに使用し、<caption>、<thead>、<th scope>を付けます。レイアウトには絶対に使用しないでください。

メディア

  • <img>には目的を説明するaltを。装飾的なもの→alt=""。
  • キャプション付き画像→<figure> + <figcaption>。

テキスト

  • 意味のある強調:<strong>/<em>;<b>/<i>は重要性のないスタイル上のオフセットにのみ使用します。
  • <time datetime>、<blockquote>/<q>、<cite>、<abbr>、<code>/<pre>、<address>を適切な場所で使用します。
  • <br>はコンテンツの一部としての改行(住所、詩)にのみ使用し、スペーシングには使用しません。

ARIA

  • 最初のルール:ネイティブ要素が存在する場合は、ARIAの代わりにそれを使用します。
  • 冗長なARIA(<button role="button">、<nav role="navigation">)や、タグと矛盾するARIAにフラグを付けます。

過剰修正しないでください。 <div>と<span>は、ブロックがレイアウトやスタイリングのみのために存在する場合、正しいです。すべての<div>を<section>に置き換えると、アクセシビリティツリーが悪化します。

応答形式(ミックス調:直接修正+簡潔な理由)

診断

影響別にグループ化された問題のリスト:

  • アクセシビリティ/ユーザビリティを損なう — 誰かがページを使用するのを妨げるもの(フォーカスのないボタン、ラベルのないフィールド、altのない画像)。
  • 不正確なセマンティクス — 機能はするが、誤った構造を伝える(スキップされた見出し、タイトルのないsection)。
  • 詳細 — 粒度の細かい改善。

各項目:何が問題か → 何を使用すべきか。1行。

修正コード

書き換えられた完全なHTML。変更部分にのみ短いコメントを付けます。

理由

重要な決定ごとに2~5の簡単な説明。ブラウザ/アクセシビリティツリーが何をするかに基づいて説明します。中心的な概念(例:暗黙のロール、ランドマーク)がある場合は、具体的な例を交えて一度説明します。

コードがすでに適切な場合は、その旨を明確に述べ、本当に調整する価値があるものだけを指摘します。

例

入力:

<div class="header">
  <div class="logo">Store</div>
  <div class="menu"><a>Home</a><a>Products</a></div>
</div>
<div class="title">Deals</div>
<div onclick="buy()">Buy</div>

出力(簡略版):

診断

  • ユーザビリティを損なう:<div onclick> → <button type="button">;hrefのない<a> → href付きのリンク。
  • 不正確なセマンティクス:.header → <header>;.menu → <nav>と<ul>;.title → <h1>;<main>の欠落。

修正コード

<header>
  <p class="logo">Store</p>
  <nav aria-label="Main">
    <ul>
      <li><a href="/">Home</a></li>
      <li><a href="/products">Products</a></li>
    </ul>
  </nav>
</header>
<main>
  <h1>Deals</h1>
  <button type="button" onclick="buy()">Buy</button>
</main>

理由

  • <div>はTabキーの順序になく、Enterキーにも反応しません。<button>にはフォーカスとキーボードサポートが組み込まれており、「ボタン」としてアナウンスされます。
  • hrefのない<a>はブラウザにとってリンクではありません。フォーカスを受け取らず、スクリーンリーダーのリンクリストにも表示されません。
  • <nav>と<main>はランドマークになります。スクリーンリーダーユーザーは直接それらにジャンプできます。

出典

ルールに疑問がある場合は、MDNまたはHTML Living Standardで確認し(ドキュメンテーションツールが利用可能な場合はそれを使用)、リンクを引用してください。

関連スキル