[翻訳] OOCSS(オブジェクト指向CSS)とSassを結合することが最高のCSSコーディング方法である(OOCSS + Sass = The best way to CSS)
この間 客体志向 CSS 紹介を翻訳した. そしてジンウ様がデッグルで文を二つ紹介してくれた. その中一つを翻訳した. OOCSSの短所を指摘しながらその短所を補うことができる方法を紹介する文だ.
補完方法で提示するのが Sassのに, コーディングするようにファイルを作成した後 CSSでコンパイル(?)する方法だ. これでは確かにパブリッシャーの時間は短縮されるでしょう. しかし OOCSSが目標にする軽量のファイルサイズは満たすことあるかというつもりだ. 後で Sassをもうちょっと分かるようになれば判断をして見ようと思う.
今個人的な考えには, CSSをコンパイルまですることは小規模のプロジェクトには当たらないようで, 私は主に小規模プロジェクトをするから使う仕事があるようではないというのだ.
* 分かる点 : semanticという単語は ‘セマンティックス’と翻訳した. 元々semanticは次世代 HTMLで重要な概念で使われる言葉だ.翻訳すれば ‘意味論的’という意味になるのに, 事実 ‘意味論的な’ なんかこのような式で翻訳しても大きい問題はない. しかし, 業界でもっとよく使われる用語は ‘セマンティックス’だ. それでそのまま ‘セマンティックス’と翻訳した.
——
客体志向 CSS増えた素敵だ. しかしセマンティックスしないクラスたちでマークアップを散らかすことは素敵ではない. HTML あちこちに散らばっているクラスたちを 皆 変えなければならないことが生ずるはずだが, それはとてもかんしゃくが起こる事だ. しかし OOCSSと Sassを結合したら, 二つの分野で最高の結果物を得るようになる. モジュール化と HTML 維持補修容易性. (HTMLを複雑な CSSで散らかす必要がないから.)
OOCSSは HTML 維持補修を大変にさせる
まず, 早くあきらめた人々, かなり多い数は多分沸き返えたはずで, 次に “セマンティックスしない”は話を聞いたはずだ. 解法がある. 私の真正な関心事は ただセマンティックスしてからではない.私の関心事は維持補修だ. セマンティックスしないクラスはコンポネントを説明する必要がなくて, これはクラスが 後ほど コンポネントで除去されることもできるということを意味する.
CSSだけでモジュールを作る方法はセマンティックスしないクラスを使う方法しかない. (現在としては.) そうだったら, すべての HTML 要素にこのクラスたちを適用しなければならない. これが OOCSSのモジュール接近法だ. しかしこれは大きな問題を生む.
- 私はスタイルが変更される度に HTML 全体を扱きながら修正したくない. 私は スタートアップ会社から働いたが, いつも変更があった.
- はなはだしくは, クラスを追加しなければならない DOM 要素に接近権限がない場合もある! ページ要素たちをレンダリングするところジャバスクリプトコンポネントを使っていたら, コンポネント中にある要素にはクラスを追加することができない. (何か狂った仕業をしない以上.)
HTML 維持補修を大変にさせる点さえ除けば, OOCSSの残り部分は当たる音たちだ. 繰り返しをモジュールに抽象化することは大規模プロジェクトで CSSを維持補修すること容易くできる唯一の方法だ. それじゃ, 問題点を避けながら利得を取ることができる方法があるか?
救援の OOSass! 1
OOCSSと Sassを結合すればおびただしい力が生ずる. Sassの@extend
ジシザヌンダルン選択者のスタイルを継ぐようにしてくれる.```@mixinのようにすべてのものを重複させない. しかし階層的に使うとか, 階層化されたものなどとともに使ったら
@extend`呼び出しさえコードを汚なくすることができる. 2
嬉しくも Sass 3.2は プレースホルダーという機能を追加した. プレースホルダーは他の所で @extend
路呼び出して使う前までは何も出力しない選択者だ. プレースホルダーはこんなに生じた.
%separator
border-top: 1px solid black
hr
@extend %separator
.separator
@extend %separator
上コードはこんな CSSを生成する.
hr,
.separator {
border-top: 1px solid black
}
プレースホルダーは mixin
おこるが普通の @extend
呼び出しが作り出す 汚ないコードという問題を避けるようにしてくれる. こんな特徴おかげさまでプレースホルダーはセマンティックスしない CSS モジュールを作るのに最上だ. 私はこのモジュールを “パターン”と呼ぶ. パターンには違うのに交ぜて使うことができるスタイルを少し入れて置く.
実際使用事例を見よう
OOCSS 最高の事例である .media
モジュールを見よう. .media
モジュールを .status
, .profile
同じ多様なコンポネントに適用したいだろう.
しかし, .media
クラスをすべての HTMLに繰り返して貼り付けたくはないだろう.特にもう .status
わ .profile
クラスを HTMLに広く使った状態なら言葉だ. こういう時プレースホルダーを使えばまともに DRYできる. 3 これが私たちの %media
パターンだ.
%media
overflow: hidden
&:first-child
float: left
&:last-child
overflow: hidden
このようにすれば .media
クラスをすべての要素たちに繰り返して貼り付ける代わり, 願う所に %media
パターンを extend
すればよい.
.status
@extend %media
// Status-specific styles here...
.profile
@extend %media
// Profile-specific styles here...
すなわち, HTMLにセマンティックスしたクラスだけ付けておけば良いという話だ. .status
わ .profile
同じの言葉だ. こんなことまでタイピングしたくないじゃないだろう. こんなクラスたちさえなければ<article>
[同じ HTML] 要素しか残らないから言葉だ.
このようにすれば柔軟性も得ることができる. statusのスタイルを変更して今 .media
モジュールが必要なければ, @extend
呼び出しをとり除さえすればよい! .media
クラスをとり除こうと HTMLを歩き回る必要がない.
気付きの早い人々は私が .media
モジュールをちょっと修正して使ったということ気付いたんだ. 今, ジャバスクリプトコンポネントを使う時 DOM 接近圏がない場合に帰って見よう…
OOSassはジャバスクリプトコンポネントにスタイルを加えやすくしてくれる
私が OOCSSを使う時経験した最大の問題は, DOMを完全に制御することができてどこにでもクラスを付けることができると仮定するというのだった. そうではない時がある! ジャバスクリプトコンポネントを利用して (あるいは他の何かを利用して) レンダリングする時, 私たちはただコンポネント一番の上のコンテナだけ触れることができる.
.user-dropdown
要素にDropdownView
を付けると仮定して見よう. .user-dropdown
に .media
クラスを付けることはできるが, dropdownの .button
おこるが .menu-item
中にある要素にはクラスを付ける方法がない. コンポネント中の DOMは制御することができないからだ.
Sassのプレースホルダーを使えば問題がない.
.dropdown
// ここはすべての dropdownに適用するスタイル...
.user-dropdown
// ここは特定 dropdownsにだけ適用するスタイル...
.menu-item
@extend %media
CSS クラスだけ持ってコンポネント中の DOMを触れようとすれば狂った仕業をしなければならない. コンポネントに入って行ってカプセル化されていることを破壊するとか文字列基盤の無惨なクラスネーム APIを利用するとか. 4 しかし Sass パターンを使えば直接制御しない DOM 要素が伸びても構わない. 5
よし, よし, それでは例題を見よう
私は他の人々が作った CSS パターンをよく読んで見る. それで私も私のをいくつ共有する事にした. 私が Segment.ioを作る時全体的に使用したパターンだ.
Lip
これはアップルスタイルの仕分け者だ. コンテンツの上方へ唇のようにスタイルを作ってくれる. (逆方向で使うため %reversed-lip
度作った.)
[訳者註 - 何やら知りたくて Segment.ioに行って見たが, 下のイメージのように見えるやつだ. セクションを区分する時そのまま線ではなくあのように仄かなグラデーションで作ったことだ. あれが唇のようにできたと lipだと名付けたようだ.]
%lip
clear: both
display: block
height: 5px
background: url('/public/images/patterns/lip/lip.png') no-repeat
background-size: 100% 100%
%reversed-lip
@extend %lip
background-image: url('/public/images/patterns/lip/reversed-lip.png')
Valley
ぺこぺこに見えるように HTML 要素上下で lipを追加する.
%valley
position: relative
overflow: hidden
&::before,
&::after
content: ''
position: absolute
left: 0
right: 0
&::before
@extend %lip
top: 0
&::after
@extend %reversed-lip
bottom: 0
Plane(平面)
とても簡単な, 丸い角ボックス. Segment.ioで土台に色を加えるために使う.
%plane
box-shadow: 0 2px 5px rgba($black, .1)
border-radius: $border-radius-medium
%white-plane
@extend %plane
background-color: $white
%off-white-plane
@extend %plane
background-color: $off-white
...
Seam(境目)
黒い竝びと白い竝びを重ねておいてで半透明するように見える borderを見たことがあるでしょう. 私はそれを seamと呼ぶ. (訳者註 : 善良だが引くことなのにちょっとぺこぺこに入って行ったように見える線言葉だ. 下引かれている線がこの人が言う線だ. rgbaが支援されるブラウザーでばかりまともに見える.)
%seam
clear: both
display: block
height: 0px
border-top: 1px solid rgba($black, .12)
border-bottom: 1px solid rgba($white, .15)
Well
valleyのように, ページで入っている部分だ. <code>
例題みたいな所に使う. (このブログで使うことと似ている. [訳者註 - このブログと言う(のは)著者のブルログルを言う.])

seam
%well
box-shadow: inset 0 1px 5px rgba($black, .14)
border-radius: $border-radius-medium
%off-white-well
@extend %well
background-color: $off-white
%light-gray-well
@extend %well
background-color: $light-gray
...
もうあなたの順番だ
この文を通じて CSS コンポネントでパターンにできることと使い方に対してよく分かるようになったら良いだろう. [パターンを] 使う所はどこにでもある.
パターンは ただ一つ機能だけ しなければならない.そしてそれをよくしなければならない. 海里ロバートはパターンの名前は抽象的に, セマンティックスしないように作らなければならないと 論評した. そうすればパターンは抽象化されるはずで, それではどこででも使うことができるようになる. またパターンはいつも他のものなどを基盤で作成することができる. 私が valley 例題でしたことのようにね.
似ている自分ばかりのパターンがあったら, 私に一度見せてくれてほしい!
Notes:
- OOSass to the rescue! ↩
-
nestを階層的だと翻訳した. 原文筆者は
.navi .title
こんな式で使うことを nestと称したことで, それで私はそれを階層的使用だと翻訳した. ↩ - DRYは開発原則の中で一つだ. Don’t Repeat Youselfの弱者. ↩
- You’d have to do uncouth things to get that to work with pure CSS classes: reaching into components and destroying their encapsulation, or using some sort of horrific string-based className API. ↩
- But with Sass patterns you can easily augment DOM elements that you have no direct control of. ↩
- コメント機能はありません。コメントの代わりに[email protected]
にメールを送ってください。