はじめに
「HTMLなんてタグを囲むだけでしょ?」
そう思って学習を始め、いざ実務や案件でコードを書こうとしたとき、以下のような壁にぶつかったことはありませんか?
- 「
<div>ばかり使って書いていたら、コードレビューで『セマンティックじゃない』と怒られた」 - 「CSSを当てたら意図通りにならずデザインが崩れて、結局何が悪いのかわからない」
- 「SEOやアクセシビリティって、具体的にHTMLで何を設定すればいいの?」
本記事は、「プログラミングやWebの知識がゼロの初心者(猿でもわかるレベル)」 からスタートし、最終的に 「Web制作の現場や実務案件で即戦力として通用するレベル」 までの知識を網羅した完全ガイドです。
単なる「タグの一覧辞書」ではありません。「なぜそのタグを使うのか」「現場ではどう書くのが正解なのか」「やってはいけないアンチパターンは何か」 まで徹底的に解説します。
1. そもそもHTMLとは?(猿でもわかる概念理解)
1.1 Webサイトの構造とHTMLの役割
Webサイトをつくる技術は、よく 「人間(あるいは建物)」 に例えられます。
| 技術 | 役割 | 人間に例えると | 建物に例えると |
|---|---|---|---|
| HTML | 構造(骨組み・意味) | 骨格・臓器 | 柱・壁・部屋の間取り |
| CSS | 見た目(装飾・レイアウト) | 服・メイク・髪型 | 壁紙・インテリア・外装塗料 |
| JavaScript | 動き(機能・対話) | 筋肉・神経系(動く仕組み) | 自動ドア・エレベーター・照明スイッチ |
HTMLは HyperText Markup Language(ハイパーテキスト・マークアップ・ランゲージ) の略です。
- HyperText:ページ間をハイパーリンク(URL)で行き来できる文書
- Markup:文章に対して「ここは見出し」「ここは画像」「ここは段落」という 意味(役割)を印(Mark)づける 作業
CSSでどれだけ見た目をかっこよくしても、JavaScriptでどれだけ凄いアニメーションを動かしても、骨組みであるHTMLが崩れているWebサイトは欠陥住宅 です。
1.2 タグ・要素・属性という3大用語
HTMLを理解するための必須用語は3つだけです。ここを曖昧にしないようにしましょう。
<a href="https://example.com" target="_blank">公式サイトはこちら</a>
① タグ(Tag)
< と > で囲まれた記号のことです。
- 開始タグ:
<a> - 終了タグ:
</a>(スラッシュ/が入る)
② 要素(Element)
開始タグから終了タグまで、その中のコンテンツも含めた全体 のことを「要素」と呼びます。
- 上の例では
<a href="...">公式サイトはこちら</a>全体が a要素 です。
③ 属性(Attribute)と 属性値(Value)
要素に対して「追加の情報」や「機能」を与える設定値です。開始タグの中に書きます。
-
属性名:
href(リンク先を指定する属性) -
属性値:
[https://example.com](https://example.com)(具体的なURL)
2. これだけは押さえる!HTMLの超基本構造
2.1 最小限のHTMLテンプレート
すべてのWebページは、以下の「基本構文」からスタートします。まずはこれを丸暗記するか、スニペット(単語登録)に登録しておきましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ページのタイトル | サイト名</title>
</head>
<body>
<h1>こんにちは!</h1>
<p>はじめてのWebページへようこそ。</p>
</body>
</html>
2.2 各コードの意味を完全解説
<!DOCTYPE html>
「この文書は最新の標準仕様である HTML5 で書かれています」とブラウザに伝える宣言(ドキュメントタイプ宣言)です。これがないと、ブラウザが古い表示モード(互換モード)になり、表示が崩れる原因になります。
<html lang="ja">
HTML全体の親要素です。lang="ja" 属性をつけることで、「このページは日本語で書かれています」とGoogle検索エンジンや音声読み上げソフト(スクリーンリーダー)に伝えます。
<head> 要素
「ブラウザや検索エンジン向けの情報(ページの裏設定)」 を書く場所です。画面上には直接表示されません。
<body> 要素
「ユーザーの画面上に実際に表示されるメインコンテンツ」 を書く場所です。
3. <head> 内の必須タグと設定
現場で案件をやるとき、<head> の設定を適当に書くと 「SNSでシェアされたときに画像が出ない」「スマホで見たときに文字が小さすぎて崩れる」 といった致命的なトラブルになります。
3.1 実務で使う完璧な <head> テンプレート
<head>
<!-- 文字コード指定(一番上に書く) -->
<meta charset="UTF-8">
<!-- レスポンシブ対応(スマホ表示に必須) -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル(SEO・検索結果・タブ表示で最重要) -->
<title>Web制作プロ講座 | 株式会社Sample</title>
<!-- ページの説明文(検索結果のメタディスクリプション) -->
<meta name="description" content="Web制作の現場で使える実践的なHTML/CSS技術を学ぶ講座です。初心者からプロを目指す方向け。">
<!-- OGP設定(SNS共有時の見栄えを設定) -->
<meta property="og:site_name" content="Web制作プロ講座">
<meta property="og:title" content="Web制作プロ講座 | 初心者からプロへ">
<meta property="og:description" content="Web制作の現場で使える実践的なHTML/CSS技術を学ぶ講座です。">
<meta property="og:type" content="website">
<meta property="og:url" content="https://example.com/">
<meta property="og:image" content="https://example.com/assets/images/ogp.png">
<meta name="twitter:card" content="summary_large_image">
<!-- ファビコン(ブラウザタブのアイコン) -->
<link rel="icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<!-- CSSファイルの読み込み -->
<link rel="stylesheet" href="./css/style.css">
</head>
4. 基礎編:よく使う超重要タグ
ここからは <body> の中で使う、Webページを作る上で欠かせない基礎タグを紹介します。
4.1 テキスト系の基本タグ
見出しタグ(<h1> 〜 <h6>)
文章の「見出し」を表します。数字が小さくなるほど重要度が高くなります。
<h1>メインタイトル(1ページに原則1つ)</h1>
<h2>大見出し(章のタイトル)</h2>
<h3>中見出し(節のタイトル)</h3>
⚠️ 実務の注意点
見出しタグを 「文字を大きく太くするため」だけに使うのは厳禁 です。文字の大きさはCSSで調整します。見出しはあくまで「文章の階層構造(目次)」を表すために使ってください。<h1>の次にきなり<h3>を使うなどの階層飛びもNGです。
段落(<p>)と 改行(<br>)
<p>これは1つ目の段落です。文章のまとまりを表します。</p>
<p>文章の中でどうしても改行したいときだけ<br>brタグを使います。</p>
⚠️ 実務の注意点
デザイン上の理由(見た目の間隔をあけたい等)で<br><br><br>と連打するのは絶対にやめてください。余白調整はCSSのmarginやpaddingで行います。
4.2 ハイパーリンク(<a>)
Webページ同士をつなぐ最も重要な要素です。
<!-- 別タブで開く外部リンク -->
<a href="https://google.com" target="_blank" rel="noopener noreferrer">Googleで検索</a>
<!-- ページ内リンク(スムーススクロール等) -->
<a href="#section-contact">お問い合わせフォームへ移動</a>
💡 プロの知識:
rel="noopener noreferrer"とは?
target="_blank"(別タブ開く)を指定する場合、必ずrel="noopener noreferrer"を付与します。これがないと、開いた先のページから元のページを操作されるセキュリティ脆弱性(タブナビング攻撃)が発生したり、パフォーマンス低下の原因になります。
4.3 画像(<img>)
画像を表示するための要素です。終了タグが存在しない 「空要素(Self-closing tag)」 です。
<img src="./images/hero.jpg" alt="青空の下でパソコンを操作するエンジニアの女性" width="800" height="450" loading="lazy">
-
src属性:画像ファイルのパス(位置) -
alt属性:代替テキスト(画像が表示されない場合や、視覚障害者向け読み上げソフトで読まれる説明文) -
width/height属性:画像の元サイズを指定(レンダリング時のレイアウト崩れ「CLS」を防止するために必須) -
loading="lazy":画面外の画像をスクロールして近づくまで読み込まない設定(表示速度改善に有効)
4.4 リスト(<ul>, <ol>, <li>)
箇条書きや順序のあるリストを表現します。
<!-- 順序なしリスト(Bullet Point) -->
<ul>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</ul>
<!-- 順序ありリスト(番号付き) -->
<ol>
<li>会員登録をする</li>
<li>メールの認証リンクを押す</li>
<li>ログインして利用開始</li>
</ol>
5. 中級編:セマンティックHTMLとモダンレイアウト
初心者を卒業し、脱ビギナーを果たす最大のポイントが 「セマンティックHTML(意味論的HTML)」 です。
5.1 なぜ <div> 祭り(div中毒)を卒業しなければならないのか?
かつてのWeb制作では、レイアウトを組むために何でもかんでも <div> で囲んでいました。
<!-- ❌ 昔の悪い例(div中毒) -->
<div class="header">...</div>
<div class="nav">...</div>
<div class="main">
<div class="article">...</div>
</div>
<div class="footer">...</div>
これでも見た目は問題なく作れます。しかし、検索エンジン(Google)や音声読み上げブラウザから見ると「どこが重要で、どこがメニューで、どこが本文なのか」全く理解できません。
現代のHTML5では、役割に応じた専用の構造化タグ(HTML5セマンティック要素) が用意されています。
<!-- ⭕ 現在の正しい例(セマンティックHTML) -->
<header>...</header>
<nav>...</nav>
<main>
<article>...</article>
</main>
<footer>...</footer>
5.2 必須で覚える構造化要素(セマンティックタグ)
| タグ | 役割・意味 | 使用場所の具体例 |
|---|---|---|
<header> |
ページやセクションの導入部 | ロゴ、グローバルナビゲーション、検索バーなど |
<nav> |
主要なナビゲーション | グローバルメニュー、フッターナビ、パンくずリスト |
<main> |
ページの中心となるメインコンテンツ | 1ページにつき1つだけ配置(共通ヘッダー・フッター以外の領域) |
<article> |
独立した記事・コンテンツ | ブログ記事、ニュース詳細、SNSの1投稿、商品カード |
<section> |
テーマごとにグループ化された章・節 | 「会社概要」「サービス一覧」「お問い合わせ」などの区切り |
<aside> |
メインコンテンツと間接的な関係の補足情報 | サイドバー、関連リンク、広告領域 |
<footer> |
ページやセクションの結び | 著作権表示(Copyright)、会社概要リンク、SNSアイコン |
+-------------------------------------------------------+
| <header> |
| +-------------------------------------------------+ |
| | <nav> | |
| +-------------------------------------------------+ |
+-------------------------------------------------------+
| <main> |
| +---------------------------------+ +------------+ |
| | <article> | | <aside> | |
| | +---------------------------+ | | (サイド) | |
| | | <section> | | | | |
| | +---------------------------+ | | | |
| +---------------------------------+ +------------+ |
+-------------------------------------------------------+
| <footer> |
+-------------------------------------------------------+
6. 実務編:フォーム(Form)構築の完全理解
お問い合わせフォームや会員登録画面は、Web制作の実務で最もバグや崩れが発生しやすいポイントです。
6.1 フォームの基本構造とパーツ一覧
<form action="/send.php" method="POST">
<!-- テキスト入力 -->
<div class="form-group">
<label for="username">お名前 <span class="badge">必須</span></label>
<input type="text" id="username" name="username" placeholder="山田 太郎" required>
</div>
<!-- メールアドレス入力 -->
<div class="form-group">
<label for="email">メールアドレス</label>
<input type="email" id="email" name="email" autocomplete="email">
</div>
<!-- ラジオボタン(1択を選択) -->
<fieldset>
<legend>性別</legend>
<label><input type="radio" name="gender" value="male" checked> 男性</label>
<label><input type="radio" name="gender" value="female"> 女性</label>
</fieldset>
<!-- セレクトボックス(ドロップダウン) -->
<div class="form-group">
<label for="subject">お問い合わせ種別</label>
<select id="subject" name="subject">
<option value="">選択してください</option>
<option value="service">サービスについて</option>
<option value="recruit">採用について</option>
</select>
</div>
<!-- 複数行テキスト -->
<div class="form-group">
<label for="message">お問い合わせ内容</label>
<textarea id="message" name="message" rows="5"></textarea>
</div>
<!-- 送信ボタン -->
<button type="submit">送信する</button>
</form>
6.2 フォーム作成における【実務絶対ルール】
① <label> と <input> を必ず紐付ける
文字(「お名前」などのテキスト)をクリックしたときに、入力欄にフォーカスが入るようにします。
<!-- ⭕ 方法A:for属性とid属性で紐付ける -->
<label for="user-id">ユーザーID</label>
<input type="text" id="user-id" name="user_id">
<!-- ⭕ 方法B:labelの中にinputを入れる -->
<label>
ユーザーID
<input type="text" name="user_id">
</label>
これを怠ると、スマホユーザーがラジオボタンやチェックボックスの小さな円を指でピンポイントでタップしなければならず、ユーザー体験(UX)が最悪になります。
7. 実務編:アクセシビリティ(a11y)とWAI-ARIA
現代のフロントエンド開発において、Webアクセシビリティ(障害者や高齢者を含む誰もが情報にアクセスできること) の確保は義務化が進んでおり、実務で強く求められます。
7.1 WAI-ARIA(ウェイ・アリア)とは?
HTMLの標準タグだけでは表現できない動的なUI(ハンバーガーメニューやアコーディオン、モーダルダイアログなど)に対して、「これは今どんな状態か」を支援技術(スクリーンプリンター等)に伝えるための拡張規格 です。
7.2 実務で使えるWAI-ARIA属性の具体例
① ハンバーガーメニューの開閉状態を伝える (aria-expanded)
<!-- メニューが開いているときは aria-expanded="true" にJavaScriptで切り替える -->
<button type="button" aria-label="メニューを開く" aria-expanded="false" aria-controls="global-nav">
<span class="hamburger-line"></span>
</button>
<nav id="global-nav">
<!-- メニューコンテンツ -->
</nav>
-
aria-label:ボタンの中にテキストがない(アイコン画像やSVGのみ)場合、画面読み上げソフト用に代替テキストを与える。 -
aria-expanded:アコーディオンやメニューが開いているか (true) 閉じているか (false) を示す。 -
aria-controls:このボタンがどの要素をコントロールしているかidで示す。
8. 実務編:パフォーマンス最適化とWeb Speed
Webサイトの表示速度は、SEO(検索順位)およびコンバージョン率(成約率)に直結します。HTMLでできる軽量化テクニックを紹介します。
8.1 次世代画像フォーマット(<picture> タグ)の活用
ユーザーのブラウザやデバイスに応じて、最適な画像を自動で切り替えて配信します。
<picture>
<!-- WebP/AVIFなどの軽量な次世代フォーマットを優先 -->
<source srcset="hero.avif" type="image/avif">
<source srcset="hero.webp" type="image/webp">
<!-- 非対応ブラウザ用のフォールバック -->
<img src="hero.jpg" alt="メインビジュアル" width="1200" height="600">
</picture>
8.2 CSS/JavaScriptの最適な読み込み順序
レンダリングブロック(ブラウザが画面を描画するのを邪魔すること)を防ぐ書き方です。
<head>
<!-- CSSは <head> 内で読み込み、画面構築を急がせる -->
<link rel="stylesheet" href="style.css">
<!-- 重いJavaScriptは defer 属性をつけて非同期読み込み+HTML解析完了後に実行 -->
<script src="main.js" defer></script>
</head>
9. 現場のプロがやっているHTML記述のルール・チートシート
実務のチーム開発で「綺麗なコード」を書くためのコーディング規約(作法)です。
9.1 チェックリスト
-
小文字で記述する:
<DIV>ではなく<div>、HREFではなくhref。 -
属性値はダブルクォーテーションで囲む:
class="box"とする。 - インデント(文字の下げ)を揃える:スペース2文字(または4文字)で統一。
- 見出しレベル(h1〜h6)の階層を守る:デザイン都合でレベルを飛ばさない。
-
<img>タグのaltを空にしない:装飾画像の場合はalt=""と明記する(属性自体を消さない)。 -
id属性の重複を避ける:1ページ内で同じidは1回しか使えない。
10. まとめ:これからのHTML学習ロードマップ
お疲れ様でした!本記事の内容を理解すれば、実務で必要なHTMLの知識の80%以上はカバーできています。
最後に、これからのステップアップに向けた学習手順を提案します。
- DevTools(検証ツール)を使いこなす
- Chromeで
F12を押し、実際のWebサイトがどのようなHTML構造(DOM)で組まれているか観察してみましょう。
- HTMLバリデータで構文チェックを行う
- W3C Markup Validation Service などを使い、自分の書いたコードにエラーがないかテストする習慣をつけましょう。
- CSS(Flexbox / CSS Grid)と連携させる
- セマンティックに組んだ正しいHTMLに対して、CSSでレイアウトを当てる練習へ進みましょう。
HTMLは一見シンプルですが、「正しく、安全で、誰もがアクセスできるコード」 を書く深さを持った素晴らしい言語です。本記事をいつでも辞書がわりに読み返し、現場で活躍するスキルを身につけていってください!