OOCSS / BEM / SMACSSアーキテクチャ


8

この記事では、フロントエンドコードを整理するために取り組んできました。BEM / SMACSSの記事を参照し、次に他の記事を参照します。

私は本当にベストプラクティスが何であるかを理解しようとしています...私はこの "標準"を決定するために数日を持ち、それから高優先度/高可視性/限られたタイムラインプロジェクトを実行する必要があります。そのため、アプリと同じように拡張できる基盤から始めたいと思います。

segment... という名前のコンポーネントがあるとすると、segments1ページあたり最大10 個のページが作成されます。それぞれsegmentが同じ基本クラスを共有します。ただし、特定のものsegmentsには修飾子があります(異なる背景色)。さらに、(BEMアプローチの)各ブロック内の要素にも修飾子があります。実例を示すために、ここに簡単な実装を示します(単一の要素のみで、arrowサイト全体にはそれぞれ4〜5個の要素がありますsegment)。

.segment__arrow {
    position: absolute;
    bottom: -24px;
    left: 50%;
    margin-left: -11px;
    background-position: center no-repeat;
    height: 21px;
    width: 21px;
    z-index: 2;
}
.segment__arrow--orange {
    @extend .segment__arrow;
    background-image: url('/images/arrow_orange.png');
}
.segment__arrow--white {
    @extend .segment__arrow;
    background-image: url('/images/arrow_white.png');
}

したがって、これは単一クラスのアプローチです。

<div class="segment__arrow--white"> ... </div>

または、マルチクラスアプローチを使用することもできます。

.segment__arrow {
    position: absolute;
    bottom: -24px;
    left: 50%;
    margin-left: -11px;
    background-position: center no-repeat;
    height: 21px;
    width: 21px;
    z-index: 2;
}
.segment__arrow--orange {
    background-image: url('/images/arrow_orange.png');
}
.segment__arrow--white {
    background-image: url('/images/arrow_white.png');
}

私のマークアップはどこにあるでしょう:

<div class="segment__arrow segment__arrow--white"> ... </div>

第三に、私はできる:

.segment__arrow {
    position: absolute;
    bottom: -24px;
    left: 50%;
    margin-left: -11px;
    background-position: center no-repeat;
    height: 21px;
    width: 21px;
    z-index: 2;
}
.segment__arrow.orange {
    background-image: url('/images/arrow_orange.png');
}
.segment__arrow.white {
    background-image: url('/images/arrow_white.png');
}

そして、私のクラスのdefは

<div class="segment__arrow orange"> ... </div>

おそらくsa_orange、緩やかなセレクターを避けるような何かでオレンジを名前空間にすることさえあります。

私が探している最終結果は、コードが少ない/メンテナンスが簡単です(おそらく、これで説明されているように、単一クラスのアプローチ(オプション1)を除外します) 、スケーラブルなアーキテクチャに関する素晴らしい記事で。マルチクラスアプローチ(オプション2)は、多くの冗長性(特に私のHTML内)ですが、非常に明示的です。3つ目はマルチクラスアプローチを使用しますが、名前空間修飾子(.segment__arrowなど)を使用しないため、少し冗長ではありません(ただし、明示的ではなく、高い)衝突の可能性)。

これについて実際の経験を持っている人は、これに取り組む最善の方法についてフィードバックを持っていますか?


要素から修飾子を分離することはこれらの原則に反しますよね?.orange単独では修飾子としての意味はありません。.segment__arrow--orangeマルチクラスアプローチで使用することに大きな問題はないと思います。もちろん、より大きなプロジェクトでは、HTMLが少し制御不能になる可能性があります(多くのクラス)。
kleinfreund 2013

休暇のため。ご回答ありがとうございます。ええ、それが私が3番目のオプションを考えている理由です。正解です。これらの原則に反していますが、プロジェクトが拡大するにつれて、class = "segment__arrow segment__arrow--orange segment__arrow--is-visible segment__arrow--something-else" ...と想像しています私のためにビットコードのにおいがし始めます...
スコット・シルヴィ

そうだね。このBEMバス全体を過度に運転するべきではありません。すべてをBEM化する必要はありません。
kleinfreund、2014年

回答:


8

長い間、明示的マルチクラスアプローチ(2番目の例)を使用および推奨してきました。これは、最も普遍的で、保守可能で、一貫性があるためです。ここで私はこの主張を支持しようとします。

シングルクラス

このアプローチは、修飾子のカテゴリが2つ以上ある場合に大きな問題があります。例えば.button修飾子を持つ小規模大規模な巨大なサイズとのための主要な成功情報、および警告のための「色」。通常の7(= 3 + 4)クラスに加えて、12の組み合わせもすべて作成する必要があります。

.button--small--primary
.button--small--success
.button--small--info

これまでのところ少し不便ですが、災害ではありません。

もう1つの煩わしさ-より大きなもの-は、正しい順序「サイズが最初、色が2番目」を使用する必要があるため、覚えておく必要があります(十分に文書化されています)。

最悪の場合は、JavaScriptが関係している場合です。このボタンの「色」を変更して、現在のサイズを維持したいですか?クラス属性を解析してください!成功を取り除きたい修飾子をですか?クラス属性を解析してください!

たとえば、Bootstrapには7つの「色」、4つのサイズ、およびアクティブ/無効の状態があることを数えます。単一クラスのアプローチを維持するには、119(= 13 + [7 * 4 + 7 * 2 + 4 * 2] + 7 * 4 * 2)クラスを宣言する必要があります。それが大きな問題です。

明示的なマルチクラスには、13個のクラス(各修飾子に1つ)だけが必要です。順序は任意です。最後に、1つを追加、削除、および変更しながら、他を保存すると、jQueryでは次のようになります。

$('#login-button').removeClass('button--primary').addClass('button--success');

ショートカットマルチクラス

まず、あなたが言ったように、衝突の可能性があります-それ自体は悪いことです。

第二に、それが意味することは、は.segment__arrow.orangeより高い特異性を持ち、単一のクラスセレクターで上書きできないことです。これは、要素がたとえば大きなボタンだけでなく、たとえばログインボタンでもある場合にしばしば問題になります。そのコードは次のようになります。

<a href="#" class="button large primary login__button">Log in</a>

ログインボタンの左側と右側のパディングを大きくし、高さを大きくしたい場合があります。これは、ますます特定のセレクターをもたらし、私たちを特定の地獄に連れて行くでしょう行かれます-OOCSSが私たちを救うべき場所。

これが明示的なマルチクラスアプローチでは発生しないことは明らかです。

明示的なマルチクラス

このことの唯一の問題(私が知る限り)は、マークアップに非常に長いクラスがいくつかあることです。私はこれを認めます。

これはパフォーマンスへの影響がごくわずか(まったくない)であるため、開発者の好みの問題にすぎないことに注意してください。標準の圧縮がこれを処理します。

そうは言っても、優れたIDEを使用することで、これらを作成するのに役立ちます(はい、わかっています。

一方では、このような長いクラスを見ると、構造についてもっと考えるように強いられます。たとえば、別のコンポーネントにネストするのではなく、新しい(再利用可能な)コンポーネントを導入する方が良いかどうか。


0

私は今、このシングル/マルチクラスの問題についてチームメイトと議論しています

ベストプラクティスに基づく個人的な見解の一部を以下に示します

ベストプラクティス

  • htmlは要素を宣言します
  • CSSコントロールのレンダリング

単一クラスは常にベストプラクティスに従っている

追加の維持メリットと、それが達成できる良い名前

  • スタイルの変更にはhtmlの更新は必要ありません*(デモを参照)

  • HTMLのロックスタイル(適切なスタイルまたは何もない)

デモ

@mixin segment__arrow {
    position: absolute;
    bottom: -24px;
    left: 50%;
    margin-left: -11px;
    background-position: center no-repeat;
    height: 21px;
    width: 21px;
    z-index: 2;
}

.segment__arrow--type1 {
    @include segment__arrow;
    background-image: url('/images/arrow_orange.png');
}
.segment__arrow--type2 {
    @include segment__arrow;
    background-image: url('/images/arrow_white.png');
}

@mixin includeは@extendよりも優れています

  1. 最終CSSでコードの順序を制御できます
  2. gzipバージョンのサイズが小さい

@extendと同じで、再利用でき、HTMLのマルチクラスを置き換えることができます

@mixinを使用すると、柔軟性が向上します

@mixin segment__arrow--type1 {
    @include segment__arrow;
    background-image: url('/images/arrow_orange.png');
}
@mixin segment__arrow--type2 {
    @include segment__arrow;
    background-image: url('/images/arrow_white.png');
}
.segment__margic-arrow {
    @include screen(mobile) {
       @include segment__arrow--type1
    }
    @include screen(desktop) {
       @include segment__arrow--type2
    }
}

JavaScriptを使用する場合

smacssの状態規則

単一クラスの欠点

一つだけ:

CSSファイルサイズが大きい場合でも、ページ内のWebサイトセクションまたはコンポーネントに基づいてCSSをいつでも簡単に最適化できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.