why CSS preprocessors `extend` feature is wrong : http://t.co/oRl0rlh2Az
— bloodyowl.jsx (@bloodyowl) 2014, 11月 27
extendが悪いというより、HTMLに複数のclass属性値書いてスタイル当てることが悪いっていう例だと思う
— Masaaki Morishita (@m0rishitter) 2014, 11月 27
いわゆるマルチクラス設計の欠点は
- 共通するプロパティが上書きされる
- ルールセット間に暗黙の依存関係が生まれる
- (HTMLのセマンティックさを損ねる)
だと思ってる
— Masaaki Morishita (@m0rishitter) 2014, 11月 27
「共通するプロパティが上書きされる」が今回の例。
「ルールセット間の暗黙の依存関係」っていうのは、Twitter Bootstrapを例にすると、.btn-primary
や.btn-default
は.btn
と同じ要素に書かないといけないっていうアレ。HTMLの記述まで載った分厚いスタイルガイドが必要なのはこのせいだと思ってる。
extendはルールセット間で意味を共有できるので良いパーツだけど、既存のプリプロセッサーは"危険な"継承ができてしまう
— Masaaki Morishita (@m0rishitter) 2014, 11月 27
危険な継承の例 (Sass):
.foo { padding: 10px; } .bar { @extend .foo; font-size: 12px; } .foo { padding: 0; }
コンパイル結果:
.foo, .bar { padding: 10px; } .bar { font-size: 12px; } .foo, .bar { padding: 0; }
.foo
を.bar
で継承したけど、どこかで.foo
が上書きされたときにそれが.bar
にも適用されるので意図した結果にならないかもしれない、ってこと。
あと、プレースホルダーセレクタ (%
ではじまるやつ) 以外で継承元のルールセットを定義するのは良くない。
そこでYACPですよみなさん! https://t.co/f0gXEc9aS1
— Masaaki Morishita (@m0rishitter) 2014, 11月 27