Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第11章 属性値はなぜ省略できるのか

この章では、HTML の属性値省略が「雑でも通るから」ではなく、属性の種類と文脈に応じて条件つきで許された設計だと見ます。ゴールは、disabledchecked のような書き方を見たときに、「短く書ける便利な癖」と受け取るのではなく、「何が省略され、何が省略されていないのか」を区別して説明できるようになることです。

前章では、コメントのような地味な構文にも境界規則があることを見ました。この章では逆に、HTML がどこを意図的に省略可能にしているかを扱います。次章では、こうした細かな規則を含む HTML 仕様書が誰のために書かれているのかへ進みます。

11.1 省略できる属性と、できない属性は同じではない

HTML の属性を見ると、すべてが name="value" の形で厳密に並んでいるように見えます。しかし実際には、属性にはいくつか種類があります。その違いが、省略の可否にそのまま現れます。

もっとも分かりやすいのはブール属性です。

<input disabled>
<input disabled="disabled">
<input checked>

disabledchecked では、問われているのは「どんな値か」よりも「その状態があるかどうか」です。ブール属性では、属性が存在すること自体が true を表します。だから属性名だけで意味が成立します。ここで省略されているのは属性そのものではなく、値を書き下す形です。

ここに有名な落とし穴があります。disabled="false" と書いても、要素は無効化されたままです。 ブール属性では「存在するかどうか」だけが意味を持つので、false という値を入れても「属性が存在する」事実は変わらないからです。無効化をやめたいなら、属性ごと取り除くしかありません。値で真偽を切り替える、という直感がここでは通用しないわけです。

一方で、srchref のように、何を指すかが値そのものに依存する属性はそうはいきません。<img src> だけでは、どの画像を参照するのか決まりません。つまり、HTML は何でも短くしてよいのではなく、意味が保てる場面だけを選んで省略可能にしています。

11.2 引用符の省略にもかなり狭い条件がある

省略という話で、もう 1 つよく挙がるのが引用符です。HTML では、属性値のまわりの "' を省略できる場面があります。

<input type=text>
<a href=/about>

ただし、ここでも「いつでも省ける」わけではありません。空白や特定の記号を含むと、値の境界が分からなくなります。つまり引用符の省略は、HTML が雑に許している近道ではなく、「この文字列なら境界を見失わない」という条件つきの短縮記法です。

たとえば、次のような値では同じ感覚では書けません。

<a title=会社概要ページ>

この場合、空白を含む時点で値の切れ目が曖昧になります。人間には 1 つの題名に見えても、パーサーにとってはそうではありません。だから引用符が必要になります。

この条件を外してしまうと、第10章で見たコメントの境界規則と同じ問題が起きます。パーサーが「どこまでが値なのか」を安定して判断できなければ、後ろに続く属性や要素の解釈まで崩れます。ここでも HTML が守っているのは、見た目の簡便さより先に、境界を読み取れることです。

11.3 書きやすさを残しながら、境界は壊さない

では、なぜ HTML はこうした省略を残したのでしょうか。背景には、HTML が長く手書きの文書として使われてきた事情があります。毎回すべてを冗長に書かなくても済むようにして、著者の負担を減らしたい。その意図はたしかにあります。

その出自も関係しています。HTML はもともと SGML(1986 年に ISO 規格になった、文書をマークアップするための言語)をベースに作られました。タグや引用符を省略できる仕組みの多くは、この SGML から受け継いだものです。つまり HTML の省略可能性は、その場の思いつきではなく、文書記述言語の系譜を引いた性質でした。

しかし同時に、HTML は好き勝手な省略を許してはいません。ブール属性にはブール属性の、省引用には省引用の条件があります。つまり HTML がしているのは、「短く書けるようにすること」そのものではなく、「意味と境界を壊さない範囲で短く書けるようにすること」です。

この見方を持つと、第9章と第10章とのつながりも見えます。空要素では、要素が持てる内容を分類していました。コメントでは、終端と衝突しないよう境界を守っていました。属性値の省略でも同じで、先にあるのは文法上の条件です。省略可能性は、その条件の内側でだけ成立しています。

11.4 実務では「省略可能」と「省略すべき」を分ける

実務で重要なのは、仕様上省略できることと、普段のコードで省略したほうがよいことを分けることです。たとえば formatter やチーム規約が常に引用符を付けるなら、それは仕様に反しているのではなく、読みやすさと保守性を優先しているだけです。

同じことはブール属性にも言えます。disabled とだけ書いてもよいし、テンプレートや生成規則の都合で別の書き方が出てくることもあります。そこで大事なのは、表記ゆれそのものより、「なぜこの属性では値を省略できるのか」「なぜこの属性ではできないのか」を説明できることです。

この章で言いたいのは、「引用符はいつでも省ける」「HTML は適当でも通る」といった雑な印象の逆です。HTML は著者の負担を減らすための近道を用意しつつ、その近道が文法の条件の内側に収まるよう設計しています。次章では、こうした規則を細かく書き連ねている HTML 仕様書が、そもそも誰のための文書なのかを見ます。

参考資料