少し前にリリースされた Chrome 149 安定版、Web開発者向けの追加が目立ちましたね。新しいプロパティや機能が並ぶリリースノートを眺めていると、つい派手なものに目がいきがちです。
そんな中で、ひとつ「お?」と手が止まった項目がありました。UA stylesheet から <table> 要素に対する border-color: gray というルールが削除された、というものです。
初学者のかたですと「なんでこんな項目に?」って思うかもしれませんね。非常に地味な変更ですが、この一行を見て「あ!」と膝を打つ開発者は少なくないはずです。
罫線の色を指定した覚えはないのに、なぜか文字の色とは違う少しくすんだグレーの線が引かれてしまう。気にはなるけど深追いするほどでもないし、「まあブラウザのデフォルトだろう」と、border-color を上書きしてやり過ごす。そんな経験、ありませんか?
今回削除されたルールは、まさにその「なぜか灰色の枠線」の正体です。
Chrome だけが持っていた、仕様にないルール
本来、border-color を明示していない要素の枠線は currentColor、つまりその要素の color に従うのが筋です。ところが Chrome の UA stylesheet には、<table> の枠線の色をわざわざ gray に固定するルールが長らく残っていました。だから、文字が黒でもテーブルの枠だけがグレーになる。指定していないのに文字色ともズレている。あの小さな違和感は、ここから来ていたわけです。
そして興味深いのは、このルールが HTML の仕様には存在しない、という点です。さらに言えば、Firefox にも WebKit(Safari)にも、この gray のルールはありませんでした。Chrome だけが、仕様にない色を当てていたという事です。
余談だけど、ブラウザ開発者だって頭を抱えていた……かも?
実はこの謎のルール、長らく Chromium の Issue トラッカー等でも「歴史的遺物」として扱われていました。つまり、ブラウザを作っている彼ら自身も「これ、仕様からズレてるよね」って、とっくに気づいていたんです。でも、すぐに直されることはなく現在まで来てしまった。そこにはおそらく「互換性維持」というブラウザ開発における重い壁があったのかもしれませんし、単に「後で直そう」と頭の隅っこにありながらも放置されてしまったのかもしれません。いずれにせよ、たった一行の修正が「正しさ」と「影響範囲」の天秤にかけられ、あるいは単なる面倒くささの狭間で、長らく宙に浮いていたのだと推測できます。
UA stylesheet については、以前このブログの「実は最初から当たっているCSSの話」でも触れました。ブラウザがあらかじめ用意してくれている土台。普段からあまりに自然に機能しているため、私たちはつい、その土台が最初から完璧に整えられた不変のルールであるかのように錯覚してしまうことがあります。
しかし実際には、影響範囲を気にして、あるいは単に面倒でなかなか手を出せなかった古いコード(技術的負債)がしれっと混ざっていることがある。私たちが「ブラウザの仕様だから仕方ない」とわざわざ border-color を上書きしてやり過ごしていた裏で、彼らも「これ、いつかどうにかしないとなあ」と頭を抱えていたのかもしれません。そう考えると、なんとも言えない共感を覚えてしまいます。
「ブラウザ差です」の、もう一段下
<table> の枠の色がブラウザによって違うという現象は、ともすれば「ブラウザ差だから仕方ない」で片付けられてしまいます。検索しても「これはブラウザ差です」と説明されて終わる、よくあるパターンです。でも、その一段下を覗いてみれば差が出ていた理由は明確でした。片方のブラウザだけが、仕様にない古いルールをずっと引きずっていた。それだけのことです。
「ブラウザ差」という言葉は説明のようでいて、実は思考を止めてしまう便利な蓋でもあると、個人的には感じています。そこで止まることなく、仕様を基準に「そもそもどうなっているのか」を確かめてはじめて、差の原因が曖昧な“相性”ではなく、具体的なズレだったことが見えてきます。やはり、一次情報に立ち返るスタンスや、それを自ら読み解くことができる力は、こうした場面で本当に強いですよね。
土台だって修正される
ブラウザの挙動はたいてい正しい。でも、その「ブラウザのルール」自体が仕様という上位の基準からズレていることだって、ごくたまにあります。
今回の border-color: gray は、まさにそういう一例でした。ブラウザは自分の持つルールに従って、忠実に灰色を当てていた。挙動としては一貫していたけれど、そのルールそのものが本来は存在しないものでした。
つまり、「ブラウザのルールを疑う」ことのさらに先に、「そもそもそのルールは仕様に照らして正しいのか」を問う段がある。そして実際に今回、Chromeはそれを問い直し、ルールを削除しました。相互運用性、つまりブラウザ間で同じ見た目になることを優先して、自分の長年の古いクセを直したわけです。
私たちが当たり前のように立っているこの土台も、不変ではなく、案外こうして修正されていくものなのかもしれません。





