Normalize.cssの意図(想像)
最近、Normalize.cssがいろいろ揉めてた。
ある日、Normalize.cssには純粋な正規化以外のコードは含むべきでないとして、破壊的な変更を含むリリースがあった。html { font-family: sans-serif; }
やbody { margin: 0; }
などのいわゆるopinionatedなスタイルが削除された。
しかし、それはオーナーの意志ではなく、すぐにその変更を打ち消したバージョンがリリースされた。
その際の主張としては、Normalize.cssは純粋な正規化だけのためのものではなく、有用なデフォルトを提供するベースになるCSSであるというものだった。
ただそう考えると、何を基準にopinionatedなルールが存在しているのかという疑問が生まれる。実際はこれは、作者の独自の考えから来るものということではなく、どの環境でも同じスタイルを適応させるための指定だ。ユーザーエージェントのスタイルシートには指定が無くても、別々のスタイルが適応されることはある。(この辺自分でも根本的に理解できてないけど)その差を是正するためにhtml { font-family: sans-serif; }
とか書かれてる。
normalize.css、こうじゃなくてこうだろって思うんだけどopinionatedの解釈は人それぞれという気がしてきて何も考えられない pic.twitter.com/mJuo9Yd6u7
— キャッシュクリアお願いします (@_yuheiy) 2017年6月6日
この辺のスタイルも気になってたんだけど、ユーザーエージェントのスタイルシートはこの辺に対して個別のスタイルを書いているので、明示的にスタイルを指定しなければばらつきが出るからこうなっている。継承したほうが便利だとは思うんだけど、ユーザーエージェントのスタイルシートは基本的には継承するように書かれていない。継承しないのがユーザーエージェントのデフォルトだ。だからNormalize.cssとしてはこの形が正しいのだと納得できた。いや想像なんだけど。
そう考えると、例外はbody { margin: 0; }
のみだと言える。その他は全てユーザーエージェントをまたいでもスタイルを統一させるための宣言だ。Normalizeとして正しい。
自明なのかもしれないし、どこかに言及が有るのかもしれないけど、忘れそうなので書いといた。
そもそも、ベースになるCSSをなぜここまで深く考える必要があるのかというと、CSSにおいて最初に採用したベースは二度と変更できないケースがほとんどだからだ。なぜならスコープが大き過ぎて影響範囲が予想できないから。この問題はおそらく、Shadow DOMを採用できる時代が来て、真にScopedなスタイルを実現できるようになれば解決の糸口は見える。最長でも10年くらい辛抱すればどうにかなるはずだと思ってる。