HTML を始めよう

この記事では HTML の不変的な基礎を扱って、始められるようにします。要素や属性などの重要な用語 (すでに聞き覚えはあるかもしれません)、それらが言語にどう組み込まれているか説明します。また、HTML 要素の構造、典型的な HTML ページの構造を見せて、その他の重要な基礎言語機能について説明します。それでは、 HTML の例とともに見ていきましょう。

前提条件: 基礎的なコンピューターリテラシー、 基本的なソフトウェアのインストールファイルの取り扱いに関する基本的な理解、
目的: HTML の基本的な知識を身につけ、いくつかの HTML 要素を書く練習をする。

HTML とは?

HTML (ハイパーテキスト・マークアップ・ランゲージ/Hypertext Markup Language) は、訪れたウェブサイトの構成をブラウザーに対して伝えるために使うマークアップ言語です。 HTML 言語はウェブ開発者が望むこと次第で、複雑なものにも簡単なものにもなります。HTML は要素の集まりからなり、コンテンツの一部を要素で囲む(マークアップする)ことで、特定の見せ方・動かし方に変えられます。囲むためのタグは、コンテンツの一部をハイパーリンク (ウェブ上の別ページへリンクすること) にしたり、単語を斜体にしたりすることができます。たとえば、次の一行を見てください。

My cat is very grumpy

この行を独立させたい場合、それを段落要素 (<p>) で囲んで段落であることを指定することができます。

<p>My cat is very grumpy</p>

Note: HTML の要素は大文字小文字を区別しません。つまり大文字でも小文字でも書くことができます。例えば <title> 要素は <title><TITLE><Title><TiTlE> などと書くことができて、どれも正しく動作します。しかし、すべての要素を小文字で書くことが、一貫性や信頼性、その他の理由のために最良の習慣です。

HTML 要素の構成

前段で紹介した段落要素についてもう少し詳しく見ていきましょう。

HTML の要素の構造を示すサンプルコード。 <p> My cat is very grumpy </p>.

この要素の主要な部分は次のとおりです。

  • 開始タグ (Opening tag): 要素名(この場合は段落を表す p)、囲んでいる開き山括弧と閉じ山括弧で構成されます。これは要素が始まってその効果が開始する位置を宣言します。この場合、段落が始まる位置です。
  • 内容 (Content): これは要素の内容です。この例の場合、段落のテキストです。
  • 終了タグ (Closing tag): 開始タグと同じですが、要素名の前にスラッシュを記載します。これは、要素の終わりを示すものです。終了タグを記載し忘れるのは、初心者にありがちなミスで、おかしな結果を生むことがあります。

要素は開始タグ、内容、終了タグが続いたものです。

実習: 最初の HTML 要素を作ってみる

下記の「編集可能なコード」内の行を <em> および </em> タグで囲むよう編集してください。要素を開始するには、開始タグ <em> を行の先頭に付けてください。要素を終了するには、行の最後に終了タグ </em> を付けてください。こうすることで、行がイタリック体(斜体)で書式化されるはずです。変更した内容が Output 領域に反映されるのを確認してください。

もし入力ミスをしても、リセット ボタンを押すことでいつでもリセットできます。本当に行き詰ってしまったら、 答えを見る ボタンを押せば答えを見ることができます。

要素を入れ子にする

要素の中に要素を入れることができます。これは入れ子(ネスト)と呼ばれています。たとえば “My cat is very grumpy.” と記述したい場合、“very” という語を <strong> 要素で囲むことができ、その語がより強く強調表示されることを意味します。

<p>My cat is <strong>very</strong> grumpy.</p>

入れ子にする方法には、正しい方法と間違った方法があります。上の例では、最初に p 要素を始め、次に strong 要素を始めました。適切に入れ子にするには、先に strong 要素を閉じてから p を閉じなければなりません。

次のものは、間違った入れ子の例です。

<p>My cat is <strong>very grumpy.</p></strong>

タグを開始および終了するには、互いの内側または外側にあるような形にしなければなりません。上の例のような重ね方では、ブラウザーはあなたの意図を推測しなければなりません。このような推測は、予期しない結果をもたらす可能性があります。

ブロック要素とインライン要素

HTML の要素には知っておくべき 2 つの重要なカテゴリーがあります。ブロックレベル要素とインライン要素です。

  • ブロックレベル要素は、ページ上で目に見えるブロックを形成します。ブロックレベル要素は、その前のコンテンツから改行して現れます。ブロックレベル要素に続く内容も新しい行に現れます。ブロックレベル要素は通常、ページ上の構造的要素になります。例えば、ブロックレベル要素は見出し・段落・リスト・ナビメニュー・フッターを表すかもしれません。ブロックレベル要素はインライン要素の中に入れ子になることはありませんが、別のブロックレベル要素の中に入れ子になることはあります。
  • インライン要素はブロックレベル要素の中に包含され、なおかつ、段落全体やコンテンツのグループではなく、文書の内容の小さな部分だけを囲む要素です。インライン要素は文書内で改行を行いません。通常、例えば、<a> 要素(ハイパーリンク)や <em><strong> といった強調要素のように、テキストと共に使用されます。

次の例を考えてみましょう。

<em>first</em><em>second</em><em>third</em>

<p>fourth</p><p>fifth</p><p>sixth</p>

<em> 要素はインライン要素です。以下で確認できるように、最初の 3 つの要素は同じ行で他の要素と互いに空間を空けずにたたずんでいます。一方で、<p> 要素はブロックレベル要素です。各要素はその上下に空間を伴った新たな行で表示されます(この間隔はブラウザーが段落に対して適用する既定の CSS のスタイル設定によるものです)。

Note: HTML5 においては要素のカテゴリーが再定義されています。詳しくは要素のコンテンツカテゴリーを参照してください。これらの定義は、以前の定義よりも正確で曖昧さもありませんが、新しい定義は、 ブロックインライン よりも理解するのがかなり複雑です。この記事では、この 2 つの用語に留めます。

Note: この記事で使用している ブロックインライン という用語は、 CSS ボックスの種類と同じ名前ですが、混同しないでください。既定では名前が関係ありますが、 CSS の表示型を変更しても要素のカテゴリーは変わらず、どの要素を含むことができるか、どの要素に含まれるかは変わりません。 HTML5 でこれらの用語を削除した理由の 1 つは、このかなり一般的な混乱を防ぐためでした。

Note: ブロックレベル要素とインライン要素の一覧を含む有用なリファレンスページがあります。ブロックレベル要素インライン要素をご覧ください。

空要素

全ての要素が上述の開始タグ、コンテンツ、終了タグのパターンに従っているわけではありません。要素によっては単一のタグのみで構成され、通常、文書内でそれが含まれている場所に何かを挿入したり埋め込んだりするために使用されます。例えば、以下の <img> 要素はウェブページ上のそれが含まれた場所に 1 つの画像ファイルを埋め込みます。

<img src="https://raw.githubusercontent.com/mdn/beginner-html-site/gh-pages/images/firefox-icon.png">

これはページに次の画像を出力するはずです。

Note: 空要素 (Empty elements) は void 要素と呼ばれることもあります。

Note: HTML では、例えば <img src="images/cat.jpg" alt="cat" /> のように、空要素のタグの末尾に / を追加する必要はありません。しかし、これは有効な構文であり、 HTML を有効な XML にしたい場合に使うことがあります。

属性

要素は次のように属性 (Attribute) を持つこともできます。

<p class="editor-note">My cat is very grumpy</p>

属性は実際のコンテンツの中で表示させたくない、要素に関する追加情報を保有します。この例では、class 属性は、要素をスタイル情報の対象とするために使用される識別名です。

各属性は次の要件を満たす必要があります。

  1. 属性名と要素名の間に 1 つの半角スペース(その要素内にすでに 1 つ以上の属性が設定されている場合は、併せて各属性名の間)
  2. 属性名とそれに続く等号 (=)
  3. 属性値、先頭と末尾を引用符で囲む

実習: 要素に属性を追加する

要素のもう一つの例は<a>です。これは_anchor_の略です。アンカーは、それが囲んでいるテキストをハイパーリンクにすることができます。アンカーは様々な属性を受け取ることができますが、以下のようなものがあります。

href

この属性の値は、リンク先のウェブアドレスを指定します。例えば、href="https://www.mozilla.org/" です。

title

この属性にはリンクについての追加情報(リンク先のページが何であるかなど)を記載します。例えば、title="The Mozilla homepage" のように書きます。この内容は、リンクにマウスカーソルを当てた時にツールチップとして表示されます。

target

リンク先の内容を表示する場所(閲覧コンテキスト)を指定します。例えば、 target="_blank" と指定すると、リンク先の内容を新しいタブに表示します。現在のタブにリンク先の内容を表示させたい場合は、この属性を省略します。

それでは以下の入力欄を編集して、好きなサイトのリンクを張ってみましょう。

  1. <a> 要素を追加してください。
  2. href 属性と title 属性を追加してください。
  3. 新しいタブでリンク先を開くために target 属性を追加してください。

変更した内容が ライブ出力 領域に反映されるのを見ることができます。リンクが表示され、マウスを当てると title 属性の値が表示され、クリックすると href 属性にあるウェブアドレスに移動することが確認できるはずです。要素名と各属性の間にはスペースを記載する必要があることを覚えておいてください。

もし、間違えた場合は、常に リセット ボタンを使用してリセットすることができます。実に困ったときは、答えを見る ボタンを押して、答えを見ることができます。

論理属性

沢山の HTML ソースを見ていくうちに、属性値のない属性を見かけることがあるでしょう。これは文法的に許されています。これらは「論理属性」と呼ばれています。論理属性は一般的に属性名と同じ属性値だけを取ることができます。例えば、 disabled 属性は input 要素に指定することができる論理属性と考えてください。(これを使用して、ユーザーが入力できないようにフォームの入力要素を「無効」にします。無効にされた要素は、通常グレーアウトした外見になります。)

<input type="text" disabled="disabled">

略式で、以下のように書いても受け入れられます。

<!-- disabled 属性を使用すると、エンドユーザーが入力ボックスにテキストを入力できないようにします。 -->
<input type="text" disabled>

<!-- disabled 属性がないため、テキスト入力が許可されます。 -->
<input type="text">

参考までに、上記の例では無効ではないフォームの入力要素も記載しています。上の例の HTML は、このような結果になります。

属性値を引用符で囲むことの省略

他にも多くのサイトのコードを見ていると、引用符を使わない属性値など、奇妙なマークアップのスタイルに出会うことがあります。これは特定の状況では許されることですが、他にもマークアップが崩れてしまうことがあります。例えば、先ほどのリンクの例をもう一度見てみると、 href 属性だけを使った基本的なバージョンを次のように書くことができます。

<a href=https://www.mozilla.org/>favorite website</a>

しかし、例えば次のように半角スペースの入った title 属性を追加すると動作がおかしくなります。

<a href=https://www.mozilla.org/ title=The Mozilla homepage>favorite website</a>

この場合だと「title 属性は "The" という属性値を持ち、それとは別に <a> 要素が Mozillahomepage という論理属性を持つ」というようにブラウザーは誤解します。明らかに、これは意図したものではありません。以下のライブ例でわかるように、エラーや予期せぬ動作を発生させます。リンクの上にマウスを当てて、タイトルテキストを表示してみてください。

安全なコードを書くために、必ず属性値には引用符をつけましょう。そうすれば、先ほどのような問題を避けることができ、コードの可読性も向上します。

二重引用符か単一引用符か

この記事では、属性を囲む引用符としてすべて二重引用符 (") を使用しています。しかし HTML コードによってはで単一引用符 (') を見ることがあるかもしれません。これは書き方の問題なので、属性値は二重引用符で囲んでも単一引用符で囲んでも構いません。例えば次の 2 つの行は等価です。

<a href="https://www.example.com">A link to my example.</a>

<a href='https://www.example.com'>A link to my example.</a>

単一引用符と二重引用符を混在させることはできないことに注意してください。この(以下の)例は引用符を混在させたもので、間違った動作をします。

<a href="https://www.example.com'>A link to my example.</a>

しかし、一方の型の引用符を使用している場合、属性値の にもう一方の型の引用符を記載することができます。

<a href="https://www.example.com" title="Isn't this fun?">A link to my example.</a>

引用符を同じ種類の引用符(単一引用符または二重引用符)の中で使用する場合は、 HTML エンティティを使用する必要があります。例えば、このようにすると壊れてしまいます。

<a href='https://www.example.com' title='Isn't this fun?'>A link to my example.</a>

代わりに、このようにしてください。

<a href='https://www.example.com' title='Isn&apos;t this fun?'>A link to my example.</a>

HTML 文書の構成

これまで、個々の HTML の要素の基礎を説明しましたが、それら単体ではあまり有用ではありません。ここでは個々の HTML の要素を使って HTML ページを構成する方法を説明していきます。

<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <title>My test page</title>
  </head>
  <body>
    <p>This is my page</p>
  </body>
</html>

上記の HTML 文書を例に、順に解説していきます。

  1. <!DOCTYPE html>: 文書型定義です。 HTML の黎明期(1991 ~ 1992 年ごろ)には、文書型定義は、 HTML ページが良い HTML とみなされるために従わなければならない一連のルールへのリンクとして機能するものでした。文書型定義は、以前は次のような形で使用されていました。
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    最近は、文書型定義は歴史的な遺物であり、他のすべてが正しく動作するために記載する必要があるものです。<!DOCTYPE html> は、有効な文書型定義としてカウントされる最も短い文字列です。知っておくことがあることはこれだけです。
  2. <html></html>: <html> 要素。ページ上のすべての内容を囲む要素です。ルート要素と呼ばれることもあります。
  3. <head></head>: <head> 要素。この要素は、 HTML ページに記載する、ページが閲覧者に見せるコンテンツではないものすべてを入れるコンテナーとして機能します。これには、検索結果に現れるキーワードやページの説明文、内容をスタイル設定するための CSS、文字セットの宣言などが記載されます。これについては、次の記事で詳しく説明します。
  4. <meta charset="utf-8">: <meta> この要素は、 <base>, <link>, <script>, <style> または <title> など、他の HTML メタ関連の要素では表現できないメタデータを表現します。htmlattrxref("charset", "meta")}} 属性は、文書の文字セットを UTF-8 に設定します。これは、人間の書いた言語の大半の文字を含むものです。この設定により、ページは、それが含むかもしれないあらゆるテキスト内容を扱うことができます。これを設定しない理由はありませんし、後でいくつかの問題を回避するのに役立ちます。
  5. <title></title>: <title> 要素。ページのタイトルを設定します。このタイトルは、ページが読み込まれたブラウザータブに表示されるタイトルです。また、ページタイトルは、そのページがブックマークされたときの説明にも使用されます。
  6. <body></body>: <body> 要素。テキスト、画像、動画、ゲーム、再生可能な音声トラックなど、ページに表示されるすべてのコンテンツがこの中に記載されます。

実習: HTML 文書にいくつかの機能を追加

もし HTML 文書を書く練習をローカルコンピューターで試したい場合は、次のようにしてください。

  1. 上記の HTML ページのコードサンプル全体を選択して「コピー」します。
  2. テキストエディター上で新規ファイルを作成します。
  3. 新規テキストファイルの中で「貼り付け」します。
  4. index.html という名前でファイルを保存します。

Note: 元となる HTML テンプレートは MDN 学習領域 GitHub リポジトリーにも置いてあります。

ウェブブラウザーでこのファイルを開くとレンダリングされた HTML 文書が表示されます。コードを編集した場合は、ブラウザー上でページの更新(または、再読み込み)を行うと編集結果が反映されます。最初はこんな表示です。

This is my page と書かれたシンプルな HTML ページこのアクティブラーニングでは、前述のようにコンピューター上でコードをローカルに編集することもできますし、下のサンプルウィンドウで編集することもできます(編集可能なサンプルウィンドウは、この場合 <body> 要素の内容だけを表しています)。以下の作業を実装するために、腕を磨いてください。

  • <body> 要素の開始タグの直下にページのメインタイトルを書きましょう。このメインタイトルは <h1> 開始タグと </h1> 終了タグで囲んでください。
  • 段落の内容を編集して、自分が興味を持っている話題についてテキストを記入しましょう。
  • 重要な言葉は、 <strong> 開始タグと </strong> 終了タグで囲み、太字で目立たせるようにしましょう。
  • この記事の前の方で説明したリンクを段落に追加してみましょう。
  • 文書に画像を追加しましょう。この記事の前の方で説明したように、段落の下に配置しましょう。別の画像(コンピューターのローカル、またはウェブのどこか)にリンクすることができれば、ボーナスポイントを獲得できます。

間違えた場合は リセット ボタンを押すことで元に戻すことができます。分からない場合は 答えを見る ボタンを押して答えを見てみましょう。

HTML 内のホワイトスペース

上記の例において、大量の(半角)ホワイトスペース(空白文字)がコード内にあることに気づいたかもしれません。これは無くても構いません。次の 2 つのコードスニペットは等価です。

<p>Dogs are silly.</p>

<p>Dogs        are
         silly.</p>

HTML 要素の内容でどれだけホワイトスペースを使用したとしても(1 つ以上の空白文字だけでなく、改行も含みます)、 HTML パーサーはコードをレンダリングする際に、ホワイトスペースの並びを 1 文字の空白に縮小します。では、なぜこれほど多くのホワイトスペースを使用するのでしょうか。その答えは、読みやすさにあります。

Note: 訳注: 全角空白はホワイトスペースに含まれず、空白の縮小の対象にもなりません。

コードをきれいに整形すると、何をしようとしているのかがわかりやすくなります。この HTML では、入れ子になっている各要素を、中に入っている要素よりも空白 2 文字分多く字下げしています。整形スタイル(それぞれの字下げレベルを空白何文字分にするか、など)はあなた次第ですが、書式化は検討した方がいいでしょう。

実体参照: HTML に特殊文字を含める

HTMLでは、<>"'& の各文字が特殊文字として扱われます。これらは HTML の構文の一部です。では、これらの特殊文字をどのようにテキストに記述するのでしょうか?例えば、アンパサンドや小なり記号を使用したい場合、コードとして解釈されないようにするには、次のようにします。

そのためには、文字参照(実体参照、エンティティ、とも)を使用します。これは文字を表す特別なコードで、まさにそのような状況で使用するためのものです。それぞれの文字参照は、アンパサンド(&)で始まり、セミコロン(;)で終わります。

実際の文字 等価な文字参照
< &lt;
> &gt;
" &quot;
' &apos;
& &amp;

等価な文字参照は、 '&lt;' は未満 (less than)、 '&quot;' は引用 (quotation) という具合に思い出しやすくできています。実体参照についての詳細は、XMLとHTMLの文字実体参照一覧 (ウィキペディア)を参照してください。

以下の例では、 2 つの段落があります。

<p>HTML では、<p>要素で段落を定義します。</p>

<p>HTML では、&lt;p&gt;要素で段落を定義します。</p>

上記の例をブラウザーに解釈させたものを下記に出力しています。 1 つ目の段落の出力が間違っていることが分かるかと思います。2 つ目の <p> が新しい段落の始まりとして認識されているためです。 2 つ目の段落は、山括弧を文字参照に置き換えているため、正しく表示されます。

Note: 他の記号に実体参照を使用する必要はありません。現代のブラウザーは、 HTML の文字エンコーディングが UTF-8 に設定されていれば、実際の記号を正しく扱うことができるからです。

HTML のコメント

HTML には、コードにコメントを書く仕組みがあります。ブラウザーはコメントを無視するので、事実上、ユーザーからはコメントが見えません。コメントのそのため、自分の論理やコーディングを説明するためのメモをコードに記載することができます。これは、コードベースを完全に覚えていないほど長い間離れていた後に、コードベースに戻った場合にとても役に立ちます。同様に、コメントは、さまざまな人が変更や更新を行う際に非常に重要です。

HTML のコメントを書くには、特別なマーカーの <!----> で囲んで下さい。例えば以下のようにします。

<p>コメントの外にいます。</p>

<!-- <p>コメントの中にいます。</p> -->

下記を見ると、最初の段落は表示されますが、次の段落は表示されないことが分かります。

まとめ

記事の最後までたどり着きました。 HTML の基本を楽しんでいただけたでしょうか。

この時点で、あなたは HTML がどのようなものか、そしてどのように動作するのか、基本的なレベルで理解できたはずです。また、いくつかの要素や属性を書くことができるようになっているはずです。このモジュールの後続の記事では、ここで紹介したトピックのいくつかをさらに詳しく説明し、また、この言語の他の概念も表示する予定です。

Note: HTML を学び始めたら、 CSS の基本を学ぶことも検討してみてください。 CSS は、ウェブページのスタイル設定に使用される言語です。例えば、フォントや色を変更したり、ページのレイアウトを変更したりすることができます。 HTML と CSS がうまく協調しながら動作することがおわかりいただけると思います。

関連情報

このモジュール内