ドキュメント構造
基本ページテンプレート
すべての HTML5 ドキュメントは <!DOCTYPE html> で始まり、アクセシビリティと SEO のために lang 属性を持つ <html> が続きます。<head> にはメタデータ(charset、viewport、title)が含まれ、<body> には表示されるコンテンツが含まれます。viewport メタタグによりモバイルデバイスでの適切なレンダリングが保証されます。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Web Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>Welcome to my page.</p>
</body>
</html>Head セクションとメタデータ
<head> 要素には機械可読なメタデータが含まれます。charset は文字エンコーディングを宣言し(UTF-8 はほぼすべての文字をカバー)、description メタタグは SEO に不可欠です — 検索エンジンが結果に表示します。HTML 解析後にスクリプトを読み込むには defer を使用してください。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Page Title - Site Name</title>
<meta name="description" content="A brief description for SEO">
<meta name="author" content="John Doe">
<link rel="stylesheet" href="style.css">
<script src="app.js" defer></script>
</head>コメントと条件付きコメント
HTML コメントは <!-- で始まり --> で終わります。ブラウザには表示されませんがページソースで見えます。コメントはメモ残し、セクションのマーク(TODO、FIXME)、ドキュメント化に便利です。条件付きコメント(IE 専用)は廃止されましたがレガシーコードに存在する可能性があります。
<!-- This is a single-line comment -->
<!--
This is a
multi-line comment
-->
<!-- TODO: Add form validation -->
<!-- FIXME: Fix layout on mobile -->
<!--[if lt IE 9]>
<script src="html5shiv.js"></script>
<![endif]-->見出しの階層
HTML には h1(最高位)から h6(最低位)までの 6 レベルの見出しがあります。レベルを飛ばさず階層順に使用してください。検索エンジンは見出しを使ってページ構造を理解します。ベストプラクティス:ペ ージごとに h1 を 1 つ、主要セクションに h2、サブセクションに h3 など。
<h1>Main Page Title</h1>
<h2>Major Section</h2>
<h3>Subsection</h3>
<h4>Sub-subsection</h4>
<h5>Minor Heading</h5>
<h6>Lowest Level Heading</h6>
<!-- Use only one h1 per page for SEO -->
<h1>Blog Post Title</h1>
<h2>Introduction</h2>
<h3>Background</h3>Div と Span コンテナ
<div> は要素をグループ化しスタイルを適用するブロックレベルコンテナです。<span> はテキストの一部をスタイルするインラインコンテナです。どちらも意味を持たない汎用要素です — アクセシビリティと SEO のため、適切な場合はセマンティックタグ(header、nav、main、article)を優先してください。
<div class="container">
<div id="header" class="header">
<span class="logo">MySite</span>
<span class="tagline">Best Content</span>
</div>
<div class="content">
<p>Main <span class="highlight">content</span> here.</p>
</div>
</div>テキストフォーマット
太字、イタリック、強調
<strong> は重要なテキストを示し(スクリーンリーダーが強調します)、<b> は純粋に視覚的な太字です。同様に <em> はストレス強調を示し(セマンティック)、<i> は視覚的なイタリックです。アクセシビリティには <strong> と <em> を優先してください。<b> と <i> はセマンティックな重要性なしのスタイル目的で許容されます。
<p>This is <strong>important</strong> text.</p>
<p>This is <b>bold</b> text.</p>
<p>This is <em>emphasized</em> text.</p>
<p>This is <i>italic</i> text.</p>
<p><strong>Warning:</strong> Do not touch!</p>Mark、Delete、Insert
<mark> は関連性のあるテキストをハイライトします(検索ハイライトのように)。<del> は削除テキスト、<ins> は挿入テキストをマークし — 編集の表示に便利です。<s> は古い情報に取り消し線を引きます。<small> はサイドコメントや著作権用です。<u> はリンクに似るため慎重に使用してください。
<p>Please <mark>highlight this</mark> word.</p>
<p>The price is <del>$99</del> <ins>$79</ins> now.</p>
<p><s>Old information</s> is struck through.</p>
<p>Use <u>underline</u> sparingly.</p>
<p>Small <small>print</small> for side comments.</p>上付き文字と下付き文字
<sub> は下付き文字(ベースラインより下)を作成し、化学式(H2O)や数学変数に使用します。<sup> は上付き文字(ベースラインより上)を作成し、指数(x²)、序数(1st)、脚注に使用します。どちらも垂直位置とフォントサイズを調整するインライン要素です。
<p>H<sub>2</sub>O is water.</p>
<p>E = mc<sup>2</sup> is Einstein's equation.</p>
<p>1st<sup>st</sup> January 2024</p>
<p>CO<sub>2</sub> emissions are rising.</p>
<p>x<sup>2</sup> + y<sup>2</sup> = r<sup>2</sup></p>引用と出典
<blockquote> はブロックレベルの引用(インデント、複数行)用です。<q> はインラインの短い引用用です(引用符を自動的に追加)。cite 属性はソース URL を提供します。<cite> は作品のタイトルや著者名をタグ付けします。これらの要素は引用コンテンツのセマンティックマークアップを向上させます。
<blockquote cite="https://example.com/source">
<p>The best way to predict the future is to invent it.</p>
<footer>— <cite>Alan Kay</cite></footer>
</blockquote>
<p>As <q cite="https://example.com">someone once said</q>,
knowledge is power.</p>コードと整形済みテキスト
<code> はインラインコードスニペット(等幅フォント)をマークします。<pre> は整形済みテキストの空白と改行を保持します。<pre><code> の組み合わせで適切なインデント付きのコードブロックを表示します。<kbd> はキーボード入力を表します。<samp> はプログラム出力用、<var> は数学式の変数用です。
<p>Use the <code>console.log()</code> function.</p>
<p>Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy.</p>
<pre><code>function hello() {
console.log("Hello, World!");
return true;
}</code></pre>改行と水平線
<br> はテキスト内に改行を作成します(控えめに使用し、CSS を優先)。<hr> はセクション間の主題の区切りを表す水平線を作成します。<wbr> は長い単語や URL に改行機会を提案し、ブラウザが最適なポイントで改行できるようにします。間隔のための <br> の使用は避けてください — CSS マージンを使用してください。
<p>First line<br>Second line<br>Third line</p>
<p>Paragraph one.</p>
<hr>
<p>Paragraph two after a thematic break.</p>
<wbr><!-- word break opportunity for long URLs -->
https://example.com/<wbr>very<wbr>long<wbr>urlリンクとナビゲーション
基本リンク
<a> 要素がハイパーリンクを作成します。href は宛先 URL を指定します。外部リンクは完全 URL(https://...)を使用し、内部リンクは絶対パス(/about)、相対リンクはファイルパス(../index.html)を使用します。アンカーリンク(#section)は同じページの一致する id 属性を持つ要素にジャンプします。
<!-- External link -->
<a href="https://www.example.com">Visit Example</a>
<!-- Internal link (same site) -->
<a href="/about">About Us</a>
<!-- Relative link -->
<a href="../index.html">Home</a>
<!-- Anchor link (same page) -->
<a href="#section1">Jump to Section 1</a>リンクターゲットとリレーション
target='_blank' はリンクを新しいタブで開きます — セキュリティのため常に rel='noopener noreferrer' と併用してください(タブナビゲーション攻撃を防ぐ)。download 属性はファイルダウンロードをトリガーします。mailto: はメールクライアントを開き、tel: はモバイルで電話を発信します。rel 属性は関係を定義します(noopener、noreferrer、SEO 用 nofollow)。
<!-- Open in new tab -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
Open in new tab
</a>
<!-- Download link -->
<a href="report.pdf" download>Download PDF</a>
<!-- Email link -->
<a href="mailto:[email protected]?subject=Hello">Email us</a>
<!-- Phone link -->
<a href="tel:+1234567890">Call us</a>アンカーターゲット
id 属性を持つ任意の要素がアンカーターゲットになれます。href='#id' のリンクはその要素にスクロールします。これは目次、脚注、単一ページナビゲーションに不可欠です。アニメーションスクロールのために html に CSS 'scroll-behavior: smooth' を追加してください。固定ヘッダーのオフセットには 'scroll-margin-top' を使用します。
<h2 id="introduction">Introduction</h2>
<p>Content here...</p>
<h2 id="features">Features</h2>
<p>Content here...</p>
<!-- Navigation menu linking to sections -->
<nav>
<a href="#introduction">Intro</a>
<a href="#features">Features</a>
</nav>
<!-- Smooth scroll via CSS: scroll-behavior: smooth -->画像とフィギュアリンク
<img> を <a> で囲むと画像がクリック可能になります。title 属性はホバー時にツールチップを作成します(UX を向上させますが SEO の重み付けは低い)。アクセシビリティのため、 リンクされた画像に意味のある alt テキストを確保してください。キャプション付き画像には figure/figcaption を使用します(これもリンクにできます)。
<!-- Image as a link -->
<a href="https://example.com">
<img src="banner.jpg" alt="Click to visit">
</a>
<!-- Thumbnail linking to full image -->
<a href="full-size.jpg">
<img src="thumbnail.jpg" alt="View full image">
</a>
<!-- Link with title tooltip -->
<a href="https://example.com" title="Visit Example">
Hover for tooltip
</a>ナビゲーションメニュー
<nav> はスクリーンリーダーと SEO のためにナビゲーションセクションを識別します。現在のページを示すには aria-current='page' を使用します。パンくずリストはユーザーがサイト階層内の位置を理解するのに役立ちます。nav 内のリストはセマンティック構造を提供します。ユーザビリティのためナビゲーションをページ間で一貫させてください。
<nav>
<ul>
<li><a href="/" aria-current="page">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<!-- Breadcrumb navigation -->
<nav aria-label="Breadcrumb">
<ol>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/blog/post" aria-current="page">Post</a></li>
</ol>
</nav>画像とマルチメディア
画像
アクセシビリティと SEO のために常に alt テキストを含めてください — スクリーンリーダーや画像読み込み失敗時に画像を説明します。loading='lazy' は画面外画像の読み込みを遅延し、ページ速度を向上させます。srcset と sizes はレスポンシブ画像を可能にします — ブラウザがデバイス解像度とビューポートに基づいて最適な画像を選択します。レイアウトシフトを防ぐため常に width と height を指定してください。
<!-- Basic image -->
<img src="photo.jpg" alt="A sunset over mountains" width="800" height="600">
<!-- Image with lazy loading -->
<img src="hero.jpg" alt="Hero banner" loading="lazy" decoding="async">
<!-- Responsive image with srcset -->
<img
src="medium.jpg"
srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w"
sizes="(max-width: 600px) 480px, 800px"
alt="Responsive photo"
>Picture 要素
<picture> はアートディレクションとフォーマットフォールバックを提供します。<source> 要素は代替を提供し — ブラウザが最初にサポートするフォーマットを選びます(WebP/AVIF がより小さい)。media 属性は異なる画面サイズで異なる画像を可能にします。最後の <img> はフォールバックで常に存在する必要があります。これは完全に異なる画像を提供する場合に srcset より優れています。
<picture>
<source srcset="webp-image.webp" type="image/webp">
<source srcset="avif-image.avif" type="image/avif">
<source srcset="wide.jpg" media="(min-width: 800px)">
<img src="fallback.jpg" alt="Art-directed image">
</picture>Audio
<audio> は音声コンテンツを埋め込みます。controls は再生/一時停止/音量コントロールを追加します。複数の <source> 要素でフォーマットフォールバックを提供します(MP3 が最も広くサポート)。autoplay はブラウザにより制限されます — ミュートされた自動再生は一般に許可されます。loop は音声を繰り返します。内側のテキストは音声がサポートされない場合に表示されます。ユーザー体験のために常にコントロールを提供してください。
<audio controls>
<source src="song.mp3" type="audio/mpeg">
<source src="song.ogg" type="audio/ogg">
Your browser does not support the audio element.
</audio>
<!-- Autoplay (muted required in most browsers) -->
<audio autoplay muted loop>
<source src="background.mp3" type="audio/mpeg">
</audio>Video
<video> は再生、一時停止、音量、フルスクリーンのコントロール付きで動画を埋め込みます。poster は再生前のサムネイルを設定します。複数のソースでフォーマットフォールバックを提供します(MP4/H.264 が最も互換性あり)。<track> はアクセシビリティ用の字幕、キャプション、説明を追加します。playsinline は iOS での強制フルスクリーンを防ぎます。ミュート自動再生でない限り常にコントロールを含めてください。
<video controls width="640" height="360" poster="thumbnail.jpg">
<source src="movie.mp4" type="video/mp4">
<source src="movie.webm" type="video/webm">
<track kind="subtitles" src="subs.vtt" srclang="en" label="English">
Your browser does not support video.
</video>
<!-- Autoplay muted loop (common for backgrounds) -->
<video autoplay muted loop playsinline>
<source src="bg.mp4" type="video/mp4">
</video>Figure と Figcaption
<figure> は画像、図、コードリスト、引用などの自己完結型コンテンツとキャプションをグループ化します。<figcaption> はキャプションや凡例を提供します。このセマンティックグループ化はアクセシビリティを向上させます — スクリーンリーダーが関係をアナウンスします。フィギュアはテキストから参照でき(「図 1 を参照」)、コンテキストを失うことなくレイアウト内で移動できます。
<figure>
<img src="chart.png" alt="Quarterly sales chart showing 20% growth">
<figcaption>Figure 1: Q4 2024 sales growth by region.</figcaption>
</figure>
<figure>
<blockquote>
<p>The best way to predict the future is to invent it.</p>
</blockquote>
<figcaption>— Alan Kay, 1971</figcaption>
</figure>Iframe 埋め込み
<iframe> は外部コンテンツ(動画、地図、他のページ)を埋め込みます。アクセシビリティのために常に title 属性を含めてください。loading='lazy' は画面外 iframe のパフォーマンスを向上させます。allow 属性は機能ポリシーを指定します。sandbox 属性はセキュリティのために iframe の機能を制限します。注意してください — iframe はパフォーマンスとセキュリティに影響を与える可能性があります。
<!-- Embed a YouTube video -->
<iframe
src="https://www.youtube.com/embed/dQw4w9WgXcQ"
width="560" height="315"
title="YouTube video"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media"
allowfullscreen>
</iframe>
<!-- Embed a map -->
<iframe
src="https://maps.google.com/maps?q=Paris&output=embed"
title="Map of Paris" loading="lazy">
</iframe>リスト
順序なしリスト
<ul> は順序なし(箇条書き)リストを作成します。各項目は <li> で囲みます。list-style-type CSS プロパティで箇条書きスタイルを変更します(disc、circle、square、none)。順序なしリストは順序が重要でない項目用です。ナビゲーションメニューや機能リストには list-style: none とカスタムスタイルを使用します。
<ul>
<li>Apple</li>
<li>Banana</li>
<li>Cherry</li>
</ul>
<!-- Custom bullet style via CSS -->
<ul style="list-style-type: square;">
<li>First item</li>
<li>Second item</li>
</ul>順序付きリスト
<ol> は順次項目用の順序付き(番号付き)リストを作成します。start 属性は開始番号を設定します。reversed は降順で項目を表示します。type 属性は番号スタイルを変更します(1、A、a、I、i)。ステップ、ランキング、順序が重要な任意のシーケンスに <ol> を使用します。
<ol>
<li>First step</li>
<li>Second step</li>
<li>Third step</li>
</ol>
<!-- Start from a specific number -->
<ol start="5">
<li>Fifth item</li>
<li>Sixth item</li>
</ol>
<!-- Reverse order -->
<ol reversed>
<li>Countdown 3</li>
<li>Countdown 2</li>
<li>Countdown 1</li>
</ol>説明リスト
<dl> は用語(<dt>)と説明(<dd>)をペアにする説明リストを作成します。これは用語集、FAQ ページ、用語定義ペアに理想的です。複数の <dd> が 1 つの <dt> を説明でき、逆も可能です。説明リストは定義テーブルにはないセマンティックな意味を提供し、アクセシビリティを向上させます。
<dl>
<dt>HTML</dt>
<dd>HyperText Markup Language</dd>
<dt>CSS</dt>
<dd>Cascading Style Sheets</dd>
<dt>JavaScript</dt>
<dd>A programming language for the web</dd>
</dl>ネストされたリスト
<ul> や <ol> を <li> の中に配置してリストをネストできます。ブラウザはネストされたリストを自動的にインデントし、箇条書きスタイルを変更する場合があります。ネストは目次、ファイルツリー、マルチレベルメニューなどの階層構造を作成します。ユーザビリティのためネストを適度に(2-3 レベル)保ってください。深くネストされたリストは読みにくくなります。
<ul>
<li>Fruits
<ul>
<li>Apple</li>
<li>Banana</li>
</ul>
</li>
<li>Vegetables
<ol>
<li>Carrot</li>
<li>Spinach</li>
</ol>
</li>
</ul>リンク付きリスト(ナビゲーション)
<nav> 内のリンクリストはセマンティックなナビゲーションメニューを作成します。ネストされた <ul> 要素はドロップダウンサブメニューを形成します。この構造はスクリーンリーダーにアクセス可能で CSS で簡単にスタイルできます。インタラクティブなドロップダウンには aria 属性(aria-expanded、aria-haspopup)を使用します。リストベースのナビゲーションはアクセシブルなメニューの標準パターンです。
<nav>
<ul class="menu">
<li><a href="/">Home</a></li>
<li><a href="/products">Products</a>
<ul class="submenu">
<li><a href="/products/a">Product A</a></li>
<li><a href="/products/b">Product B</a></li>
</ul>
</li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>テーブル
基本テーブル
<table> は表形式データを作成します。<thead> はヘッダー行、<tbody> はボディ行、<tfoot> はフッター行をグループ化します。<tr> はテーブル行、<th> はヘッダーセル(太字、中央揃え)、<td> はデータセルです。thead/tbody/tfoot の使用はアクセシビリティを向上させ、より良いスタイリングを可能にします。テーブルはレイアウトではなくデータに使用してください。
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>City</th>
</tr>
</thead>
<tbody>
<tr>
<td>Alice</td>
<td>30</td>
<td>New York</td>
</tr>
<tr>
<td>Bob</td>
<td>25</td>
<td>London</td>
</tr>
</tbody>
</table>セルの結合
colspan はセルを複数列にまたがせます(水平にマージ)。rowspan はセルを複数行にまたがせます(垂直にマージ)。これらの属性は複数列をグループ化するヘッダーなどの複雑なテーブルレイアウトを作成します。結合には注意してください — スクリーンリーダーがテーブルを解析しにくくなる可能性があります。常にアクセシビリティをテストしてください。
<table border="1">
<tr>
<th colspan="2">Name</th>
<th rowspan="2">Age</th>
</tr>
<tr>
<th>First</th>
<th>Last</th>
</tr>
<tr>
<td>Alice</td>
<td>Smith</td>
<td>30</td>
</tr>
</table>テーブルキャプションとスコープ
<caption> はテーブルのタイトルを提供し、アクセシビリティを向上させます。<th> の scope 属性はヘッダーが列(scope='col')か行(scope='row')に適用されるかをスクリーンリーダーに伝えます。これは複雑なテーブルに不可欠です。さらに複雑なテーブルでは、id と headers 属性を使用してセルとヘッダーを明示的に関連付けます。
<table>
<caption>Employee Salary Report 2024</caption>
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Department</th>
<th scope="col">Salary</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Alice</th>
<td>Engineering</td>
<td>$95,000</td>
</tr>
</tbody>
</table>カラムグループ
<colgroup> はスタイリングのために列をグループ化します。その中の <col> 要素は特定の列にスタイル(特に幅)を適用します。これはすべてのセルに幅を設定するより効率的です。カラムグループは span 属性もサポートし、複数列を一度にスタイルできます。すべての行で一貫した列幅のために使用します。
<table>
<colgroup>
<col style="width: 30%;">
<col style="width: 50%;">
<col style="width: 20%;">
</colgroup>
<tr>
<th>Product</th>
<th>Description</th>
<th>Price</th>
</tr>
<tr>
<td>Laptop</td>
<td>15-inch laptop</td>
<td>$999</td>
</tr>
</table>テーブルのスタイリング
border-collapse: collapse は隣接する境界線を 1 つにマージします。:nth-child(even) でゼブラストライプ行を作成し(可読性を向上)、:hover でマウスオーバー時にハイライトします。th のスタイリングでヘッダーを区別します。テーブルスタイリングをクリーンで読みやすく保ちます — 過度な境界線を避けてください。レスポンシブテーブルは小さな画面でラッパーに overflow-x: auto が必要な場合があります。
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f4f4f4; }
tr:nth-child(even) { background-color: #f9f9f9; }
tr:hover { background-color: #e0e0e0; }
</style>
<table>
<tr><th>Name</th><th>Score</th></tr>
<tr><td>Alice</td><td>95</td></tr>
<tr><td>Bob</td><td>87</td></tr>
</table>フォームと入力
フォーム構造
<form> は入力コントロールを囲みます。action は送信 URL を指定し、method は GET(URL で表示)または POST(非表示)です。ファイルアップロードには enctype='multipart/form-data' が必要です。<fieldset> は関連フィールドをグループ化し、<legend> はキャプションを提供します。アクセシビリティのため、常に for/id マッチングで <label> と入力を関連付けてください。
<form action="/submit" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>Personal Information</legend>
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</fieldset>
<button type="submit">Submit</button>
</form>入力タイプ
HTML5 は組み込みのバリデーションとモバイルフレンドリーなキーボードを持つ多くの入力タイプを導入しました。type='email' はメール形式をバリデーションします。type='number' はスピナーを提供します。type='date' と 'time' はネイティブピッカーを表示します。type='color' はカラーピッカーを開きます。type='range' はスライダーを作成します。accept 付きの type='file' はファイルタイプを制限します。type='hidden' はユーザーに表示されないデータを格納します。
<input type="text" name="username" placeholder="Username">
<input type="email" name="email" required>
<input type="password" name="pwd" minlength="8">
<input type="number" name="age" min="0" max="120" step="1">
<input type="date" name="birthday">
<input type="time" name="appointment">
<input type="color" name="favcolor" value="#ff0000">
<input type="range" name="volume" min="0" max="100">
<input type="file" name="upload" accept="image/*">
<input type="hidden" name="token" value="abc123">Select と Textarea
<select> はドロップダウンを作成します。<optgroup> はラベル付きで関連オプションをグループ化します。<option> は選択肢を定義し、selected 属性で 1 つを事前選択します。<textarea> は複数行テキスト入力用です。rows と cols は表示サイズを設定します。maxlength は文字数を制限します。placeholder はヒントを提供します。どちらも required と disabled 属性をサポートします。
<label for="country">Country:</label>
<select id="country" name="country">
<optgroup label="North America">
<option value="us">United States</option>
<option value="ca">Canada</option>
</optgroup>
<optgroup label="Europe">
<option value="uk">United Kingdom</option>
<option value="fr">France</option>
</optgroup>
</select>
<label for="bio">Bio:</label>
<textarea id="bio" name="bio" rows="4" cols="40"
maxlength="500" placeholder="Tell us about yourself"></textarea>チェックボックスとラジオボタン
チェックボックスは複数選択を許可し、ラジオボタンは 1 つのみを許可します(同じ name を共有する場合)。checked 属性はオプションを事前選択します。クリック可能なテキストのために常に <label> で入力を囲んでください。アクセシビリティのために <fieldset> と <legend> で関連する選択肢をグループ化します。値は選択された場合のみサーバーに送信されます。
<fieldset>
<legend>Select your interests:</legend>
<label><input type="checkbox" name="interest" value="tech" checked> Tech</label>
<label><input type="checkbox" name="interest" value="music"> Music</label>
<label><input type="checkbox" name="interest" value="sports"> Sports</label>
</fieldset>
<fieldset>
<legend>Choose a plan:</legend>
<label><input type="radio" name="plan" value="free" checked> Free</label>
<label><input type="radio" name="plan" value="pro"> Pro</label>
<label><input type="radio" name="plan" value="enterprise"> Enterprise</label>
</fieldset>フォームバリデーション
HTML5 は組み込みのクライアント側バリデーションを提供します。required は空の場合送信を防ぎます。minlength/maxlength はテキスト長を制約します。pattern はカスタムバリデーションに正規表現を使用します(title 属性でユーザーをガイド)。type='email' と type='url' は形式をバリデーションします。min/max は数値と日付で動作します。バリデーションを無効にするにはフォームに novalidate を追加します。
<form>
<input type="text" name="username" required
minlength="3" maxlength="20"
pattern="[A-Za-z0-9_]+"
title="3-20 alphanumeric characters">
<input type="email" name="email" required>
<input type="url" name="website"
placeholder="https://example.com">
<input type="number" name="age" min="18" max="99">
<button type="submit">Submit</button>
</form>ボタンと Datalist
type='submit' はフォームを送信し、type='reset' はすべてのフィールドをクリアし、type='button' はカスタムボタンです。<datalist> は <input> 要素にオートコンプリート候補を提供します — list/id でリンクします。<select> とは異なり、ユーザーはカスタム値を入力できます。これはテキスト入力の柔軟性と候補の便利さを組み合わせます。
<!-- Button types -->
<button type="submit">Submit Form</button>
<button type="reset">Reset</button>
<button type="button" onclick="alert('Hi')">Click Me</button>
<!-- Datalist for autocomplete suggestions -->
<label for="browser">Choose a browser:</label>
<input list="browsers" name="browser" id="browser">
<datalist id="browsers">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
</datalist>セマンティック HTML
Header とナビゲーション
<header> は導入コンテンツを表します — 典型的にはロゴ、見出し、ナビゲーションです。ページの上部または <article> や <section> 内に配置できます。<nav> はナビゲーションリンクを識別し、スクリーンリーダーがナビゲーションにスキップするのに役立ちます。ページは複数のヘッダーを持てます(例:セクションごとに 1 つ)。Header は head とは異なります — 表示されるコンテンツです。
<header>
<h1>My Website</h1>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>Main と Article
<main> はページの主要コンテンツを囲みます(ページに 1 つのみ)。<article> は独立して配布できる自己完結型コンテンツ(ブログ記事、ニュース記事、フォーラム投稿)を表します。<time> と datetime は SEO のために機械可読な日付を提供します。<section> は見出しを持つ主題的に関連するコンテンツをグループ化します。これらのタグはドキュメントアウトラインとアクセシビリティを向上させます。
<main>
<article>
<h1>Blog Post Title</h1>
<p>Published on <time datetime="2024-01-15">January 15, 2024</time></p>
<p>The main content of the article...</p>
<section>
<h2>Subsection</h2>
<p>More content...</p>
</section>
</article>
</main>Section と Aside
<section> は見出しで関連コンテンツをグループ化します — コンテンツに自然な見出しがある場合に使用します。<aside> はメインコンテンツに付随的に関連するコンテンツ(サイドバー、プルクォート、広告、関連リンク)を表します。どちらもドキュメント構造を向上させます。セクションはネストできます。アサイドは通常サイドバーとしてスタイルされますが、セマンティックであり表現用ではありません。
<section>
<h2>Services</h2>
<p>We offer the following services:</p>
<article>
<h3>Web Design</h3>
<p>Custom website design...</p>
</article>
</section>
<aside>
<h3>Related Articles</h3>
<ul>
<li><a href="/post1">Related Post 1</a></li>
<li><a href="/post2">Related Post 2</a></li>
</ul>
</aside>Footer
<footer> はページまたはセクションのフッターコンテンツを含みます — 著作権、関連ドキュメントへのリンク、連絡先情報、サイトマップ。ページは複数のフッターを持てます(例:記事セクションごとに 1 つ)。フッターは視覚的に下部にある必要はありませんが、セマンティック的に終了コンテンツを表します。著作権記号には © を使用します。
<footer>
<div>
<h3>About Us</h3>
<p>Company information...</p>
</div>
<nav>
<a href="/privacy">Privacy Policy</a>
<a href="/terms">Terms of Service</a>
<a href="/sitemap">Sitemap</a>
</nav>
<p>© 2024 My Company. All rights reserved.</p>
</footer>Details と Summary
<details> はインタラクティブな開示ウィジェットを作成します — ユーザーが <summary> をクリックするまでコンテンツは非表示です。open 属性はデフォルトで展開表示します。これはネイティブ HTML で JavaScript 不要です。FAQ、折りたたみ可能なセクション、プログレッシブディスクロージャーに最適 です。ネストされた details でマルチレベルアコーディオンを作成します。[open] 属性セレクタでスタイルします。
<details>
<summary>Click to expand FAQ</summary>
<p>This content is hidden by default and shown when the summary is clicked.</p>
</details>
<!-- Open by default -->
<details open>
<summary>What is HTML?</summary>
<p>HTML (HyperText Markup Language) is the standard language for creating web pages.</p>
</details>
<!-- Nested details -->
<details>
<summary>Advanced Topics</summary>
<details>
<summary>Sub-topic</summary>
<p>Nested content...</p>
</details>
</details>メタタグと SEO
Charset と Viewport
charset='UTF-8' は文字エンコーディングを宣言し — すべての文字を正しく表示するために不可欠です。viewport メタタグはレスポンシブデザインに重要です:width=device-width はデバイス幅に一致し、initial-scale=1.0 はズームレベルを設定します。これがないとモバイルブラウザはデスクトップ幅でページをレンダリングします。これら 2 つのメタタグはすべての HTML ドキュメントに含めるべきです。
<head>
<!-- Character encoding -->
<meta charset="UTF-8">
<!-- Responsive viewport -->
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<!-- Internet Explorer compatibility -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>Description と Keywords
description メタタグは SEO に最も重要です — 検索エンジンが結果のタイトル下に表示します(160 文字以内に保ってください)。keywords は現代の検索エンジンにほぼ無視されます。robots はインデックスを制御します:index/noindex、follow/nofollow。author はコンテンツ作成者をクレジットします。クリック率を向上させるために魅力的な説明を書いてください。
<meta name="description"
content="Free HTML tutorials for beginners. Learn HTML tags, attributes, and semantic markup with examples.">
<meta name="keywords"
content="HTML, tutorial, web development, markup">
<meta name="author" content="John Doe">
<meta name="robots" content="index, follow">Open Graph(Facebook)
Open Graph(og:)メタタグは Facebook、LinkedIn、その他のプラットフォームで共有された時のページの表示を制御します。og:title、og:description、og:image、og:url が最も重要です。og:type は article、website、product などにできます。画像は少なくとも 1200x630 ピクセルにすべきです。デプロイ前に Facebook の Sharing Debugger でテストしてください。
<meta property="og:title" content="My Amazing Article">
<meta property="og:description" content="A brief description of the article.">
<meta property="og:image" content="https://example.com/image.jpg">
<meta property="og:url" content="https://example.com/article">
<meta property="og:type" content="article">
<meta property="og:site_name" content="My Website">
<meta property="og:locale" content="en_US">Twitter Cards
Twitter Card メタタグは Twitter/X でのリンクの表示を制御します。twitter:card は summary、summary_large_image、player にできます。大きな画像カードが最もエンゲージングです。twitter:site と twitter:creator は Twitter アカウントにリンクします。Open Graph タグが存在する場合、Twitter はそれらにフォールバックしますが、明示的な Twitter タグでより制御できます。Twitter Card Validator でテストしてください。
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="My Amazing Article">
<meta name="twitter:description" content="A brief description.">
<meta name="twitter:image" content="https://example.com/image.jpg">
<meta name="twitter:site" content="@mywebsite">
<meta name="twitter:creator" content="@author">Canonical と構造化データ
canonical リンクタグは検索エンジンにページの優先 URL を伝え、重複コンテンツのペナル ティを防ぎます。JSON-LD 構造化データは検索エンジンがコンテンツを理解するのを助け、リッチスニペット(星評価、パンくずリスト、検索結果の FAQ アコーディオン)を可能にします。Article、Product、Event、FAQPage などの schema.org タイプを使用します。Google の Rich Results Test でバリデーションしてください。
<!-- Canonical URL (prevents duplicate content issues) -->
<link rel="canonical" href="https://example.com/article">
<!-- Structured data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "My Article Title",
"author": "John Doe",
"datePublished": "2024-01-15",
"image": "https://example.com/image.jpg"
}
</script>SVG と Canvas
SVG の基礎
SVG(Scalable Vector Graphics)は品質を損なうことなくスケールする解像度非依存のグラフィックを作成します。イ ンライン SVG は CSS でスタイル可能で JavaScript で操作可能です。一般的な図形:<circle>、<rect>、<line>、<ellipse>、<polygon>、<path>。SVG はアイコン、ロゴ、図に理想的です。ラスター画像とは異なり、SVG はあらゆるサイズで鮮明です。
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="100" cy="100" r="50" fill="blue" stroke="black" stroke-width="2"/>
<text x="100" y="105" text-anchor="middle" fill="white">Circle</text>
</svg>
<!-- Inline SVG (can be styled with CSS) -->
<svg width="100" height="100">
<rect x="10" y="10" width="80" height="80" fill="red" rx="10"/>
</svg>SVG 図形
SVG 図形は座標ベースの属性を使用します。<rect> は x、y、width、height が必要。rx/ry で角丸を作成します。<circle> は cx、cy(中心)と r(半径)が必要。<ellipse> は異なる x/y 半径に rx と ry を使用します。<line> は x1,y1 から x2,y2 に接続します。<polygon> は points リストを取ります。fill は内部の色、stroke は輪郭を設定し ます。
<svg width="300" height="200">
<!-- Rectangle -->
<rect x="10" y="10" width="80" height="50" fill="orange" rx="10" ry="10"/>
<!-- Circle -->
<circle cx="200" cy="50" r="40" fill="green"/>
<!-- Ellipse -->
<ellipse cx="100" cy="150" rx="60" ry="30" fill="purple"/>
<!-- Line -->
<line x1="10" y1="180" x2="290" y2="180" stroke="black" stroke-width="2"/>
<!-- Polygon -->
<polygon points="250,10 290,80 210,80" fill="pink"/>
</svg>SVG パス
<path> は最も強力な SVG 要素で、d 属性とコマンドを使用します:M(moveto)、L(lineto)、H/V(水平/垂直線)、C(3次ベジェ)、Q(2次ベジェ)、A(円弧)、Z(パスを閉じる)。大文字 = 絶対座標、小文字 = 相対座標。viewBox は座標系を定義します。SVG アイコンはスケーラブルでスタイル可能なアイコンのためにパスを使用します。
<svg width="200" height="200">
<!-- M=move, L=line, C=curve, Z=close -->
<path d="M 10 10 L 100 10 L 100 100 Z" fill="none" stroke="black"/>
<!-- Bezier curve -->
<path d="M 10 100 C 50 10, 150 10, 190 100" fill="none" stroke="red"/>
<!-- Arc -->
<path d="M 10 100 A 90 90 0 0 1 190 100" fill="none" stroke="blue"/>
</svg>
<!-- SVG icon example -->
<svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 2L2 7v10l10 5 10-5V7z"/>
</svg>Canvas の基礎
<canvas> は JavaScript で操作されるビットマップ描画サーフェスです。getContext('2d') で 2D コンテキストを取得します。SVG とは異なり、canvas はピクセルベース(スケーラブルでない)で DOM の一部ではありません。Canvas は複雑なアニメーション、ゲーム、画像処理に適しています。SVG は静的グラフィック、アイコン、インタラクティブチャートに適しています。ニーズに応じて選択してください。
<canvas id="myCanvas" width="300" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// Draw a rectangle
ctx.fillStyle = 'blue';
ctx.fillRect(10, 10, 100, 80);
// Draw a circle
ctx.beginPath();
ctx.arc(200, 50, 30, 0, Math.PI * 2);
ctx.fillStyle = 'red';
ctx.fill();
// Draw text
ctx.font = '20px Arial';
ctx.fillText('Hello Canvas', 50, 150);
</script>インライン SVG アイコン
SVG <symbol> は <use href='#id'> で参照される再利用可能なアイコンを定義します。これは SVG スプライト技法です — アイコンを一度定義し、どこでも使用します。symbol は非表示(display:none)で <use> でインスタンス化されます。アイコンは fill='currentColor' で CSS 'color' から色を継承します。このアプローチは効率的(1 つの定義で多数の使用)で完全にスタイル可能です。
<!-- Reusable SVG symbol -->
<svg style="display:none">
<symbol id="icon-home" viewBox="0 0 24 24">
<path d="M12 2L2 12h3v8h6v-6h2v6h6v-8h3z"/>
</symbol>
</svg>
<!-- Use the icon -->
<svg width="24" height="24" fill="currentColor">
<use href="#icon-home"/>
</svg>
<!-- Styled icon -->
<svg width="32" height="32" class="icon" style="color: blue;">
<use href="#icon-home"/>
</svg>アクセシビリティ(ARIA)
ARIA ロール
ARIA ロールは要素がスクリーンリーダーにとって何をするかを定義します。ランドマークロール(banner、navigation、main、complementary、contentinfo)はスクリーンリーダーユーザーがページ領域間をジャンプできるようにします。HTML5 セマンティック要素(<header>、<nav>、<main>)は暗黙的な ARIA ロールを持つため、role 属性の追加はしばしば冗長です — しかし古いブラウザには有用です。可能な場合は常に ARIA よりセマンティック HTML を優先してください。
<!-- Landmark roles for page structure -->
<header role="banner">Site Header</header>
<nav role="navigation">Main Menu</nav>
<main role="main">Primary Content</main>
<aside role="complementary">Sidebar</aside>
<footer role="contentinfo">Footer</footer>
<form role="search">Search Form</form>
<!-- Document structure roles -->
<article role="article">Blog Post</article>
<section role="region" aria-label="Comments">Comments</section>aria-label と aria-labelledby
aria-label は可視ラベルが存在しない場合にアクセシブルな名前を定義します(例:アイコンのみのボタン)。aria-labelledby はコントロールにラベルを付ける可視テキスト要素の ID を参照します — 可視ラベルが画面に既にある場合に便利です。複数の ID がリストされる場合、テキストは順番に連結されます。可視テキストが存在する場合は aria-labelledby を優先してください。ラベルの同期を保てるためです。
<!-- aria-label provides accessible name directly -->
<button aria-label="Close menu" onclick="closeMenu()">✕</button>
<input type="search" aria-label="Search products" />
<!-- aria-labelledby references visible text -->
<div id="billing-label">Billing Address</div>
<input type="text" aria-labelledby="billing-label" />
<!-- Multiple labels combined -->
<span id="city">City</span>
<span id="required">required</span>
<input aria-labelledby="city required" />aria-describedby とツールチップ
aria-describedby は要素 ID で要素を追加の説明テキストにリンクします。スクリーンリーダーはラベルの後にこの説明をアナウンスします。ヘルプテキスト、ヒント、エラーメッセージに理想的です。エラーメッセージに role='alert' を使用して、表示された時に即座にアナウンスされるようにします。エラーのあるフィールドに aria-invalid='true' を設定し、スクリーンリーダーが無効状態を示すようにします。