Because We Love Happy Coding

フリーライターからエンジニア × 講師。発信力だけあり余ってる感じ

headタグの中身が見えてしまったら

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

同級生SさんからのSOS。

head要素の中身、特にtitle要素とscript要素の中がブラウザに表示されてしまうのだという。同級生の中でもデキるSさんからのSOSなので、まさかそんな、と思いながら画面を見せてもらった。(画面はサンプル)

f:id:mogami74:20170317034112j:plain

たしかにtitle要素の中身、本来、ブラウザウィンドウのタブ上にとか、ウィンドウバーに表示される内容が、ブラウザの画面内にも表示されている。タブ上にも表示されているので、title要素としての機能は生きている。meta要素などは画面にこそ表示されないが、やはり機能は正常。

タグの綴りミスなども見て見たが、間違っているように思えない。

私が画面を見て首を捻っていると、同級生が集まってきて検討に加わった。

才気あふれるKくんがふと「display:noneにしてみたらどうなるんですかね」と言った。

解決編

開発者ツールでtitle要素に「display:none」を指定してみると、ちゃんと消えた。それどころか、もともと「display:none」という指定があったのが、打ち消し線で「無効」になっていたのを発見した。

無効化された「display:none」の出所は「user agent stylesheet」つまりブラウザのデフォルト状態だ。

f:id:mogami74:20170316164543j:plain

謎はすべて解けた。

そもそも、ブラウザはデフォルトのスタイル指定を持っている。padding やmarginの指定がブラウザによってまちまちなのはよく知られており、それをリセットするための「リセットCSS」といった考え方も存在する。

実は、head 要素やtitle要素のデフォルトのスタイル指定が内部に存在し、それは「display:none」になっているらしい。逆に、普通のhtmlページで、head要素とtitle要素に「display:block」を指定すると、Sさんのページと同様、title要素の中身を表示することに成功?した。

実はmeta要素も「display:block」されていたのだが、meta要素はそもそも空要素のタグで閉じタグがないので、innerHTMLが存在しない。だから画面上に表示されるものがないのだ。title要素やscript要素はinnerHTMLがあるので、表示されてしまう。

Sさんのスタイルシートを確認したところ、リセットCSSの一環として、全称セレクタで「display: block」を指定していたことが判明。

html * {
    margin:0;
    padding:0;
    display:block;
}

なるほど。これがそんなふうに出てくるとは思わなかった。勉強になった。