CSS 手法を使用してモジュール性を実現する例

CSS 手法を使用してモジュール性を実現する例

1. CSS 方法論とは何ですか?

CSS methodologiesデザイン パターンまたは CSS 仕様として理解できます。市場での使用状況は次のとおりです。

上記画像の出典: https://2019.stateofcss.com/technologies/

日常の開発では、CSS 方法論に注意を払って理解する時間がないかもしれませんが、経験を積むにつれて、自分で考えたり、他の人のコードを読んだり、インターネット上の成熟したフレームワークを参照したりするようになります。これらのフレームワークには、CSS 方法論の優れた点が多少は含まれています。次の主流の CSS 方法論は、コンテンツを要約して整理するのに役立ちます。

2. 一般的な CSS 手法

1. オーケー

面向對象的CSS略してOOCSS ) は、Yahoo での作業に基づいて Nicole Sullivan によって 2008 年に提案されました。

(1)ルール

1. IDではなくクラスを使用する

クラスを直接使用してスタイルを設定します。これにより、セマンティクスが向上するだけでなく、CSS の HTML への依存も軽減されます。

2. 構造とスタイルの分離

初期の HTML と CSS では構造とスタイルの分離が実現されていましたが、CSS にはまだ 2 種類のスタイルが存在します。

  • 構造スタイル(長さ、幅、距離など)
  • 肌のスタイル(色、陰影など)

そのため、OOCSS ではこれら 2 つのスタイルを分離することを推奨しています。

たとえば、白/緑/赤の 3 つのボタンは次のように定義できます。

クラス="btn btn-default"

クラス="btn btn-green"

クラス="btn btn-red"

紫色のボタンがたくさんある場合は、別の紫色のボタン クラスを作成できます。これにより、CSS コードの量を大幅に削減できます。

3. 容器と内容物の分離

コンテンツは特定のコンテナに限定されるべきではなく、再利用のために解放されるべきです。

# 間違った書き方.header.action {
}
.header .action .login {
}
.header .action .register {
}

# .header{ の正しい書き方
}
。アクション{
}
。ログイン {
}
。登録する {
}

継承されたセレクターは、同じ名前によって発生するスタイルの競合 (複数の人がプロジェクトで共同作業している場合によく発生します) を軽減できるため便利です。ただし、使いすぎはよくありません。

(2)メリットとデメリット

利点:

  • モジュール式で再利用可能
  • コードの重複を減らす
  • スケーラビリティ、保守性、可読性の向上

欠点:

  • 深くネストされたセレクタの数は減りますが、クラスが追加されます
  • 小規模なプロジェクトなど、コード内に繰り返される視覚パターンがあまりない場合は、OOCSS を適用することは実用的ではない可能性があります。

(3)例

Bootstrap は OOCSS を使用します。

例えば:

html

 <div クラス = 'ヘッダー'>
        <ul class='メニュー'> 
            <li class='メニュー項目アクティブ'>1</li>
            <li class='menu-item'>2</li>
            <li class='menu-item'>3</li>
        </ul>
        <div class="アクション">
            <button class="btn btn-login">ログイン</button>
            <button class="btn btn-register">登録</button>
        </div>
    </div>

CS: ...

.ヘッダー{
}
.メニュー{
}
.メニュー項目{
}
.item.active {
}
。アクション {
}
.btn{
}
.btnログイン{
}
.btn-レジスタ{
}

2. 境界要素法

BEM - ブロック要素モディファイア。 2009年生まれ。

(1)内容

BEM は次の 3 つの部分で構成されます。

  • Block - ヘッダーなどのブロック
  • Element - ブロックメニューの下の項目などの子要素
  • Modfier - .current、.active などの状態

(2)ルール

1. 命名規則

  • - : ブロックまたはサブ要素内の複数の単語間の接続を示すハイフンとしてのみ使用されます。
  • __アンダースコア: ブロックとそのサブ要素を接続するために使用されます。
  • --ハイフン: ブロックの状態またはブロックのサブ要素を説明するために使用されます。

一部の企業 (Tencent など) の標準では、二重ハイフンは単一のアンダースコア ( _ ) に置き換えられます。

例: .block-name__element--modifier

デモHTML:

    <div クラス = 'ヘッダー'>
        <ul class='header__menu'> 
            <li class='header__menu-item--active'>1</li>
            <li class='header__menu-item'>2</li>
            <li class='header__menu-item'>3</li>
        </ul>
        <div class="header__action">
            <button class="header__btn--login">ログイン</button>
            <button class="header__btn--register">登録</button>
        </div>
    </div>

デモなし:

.ヘッダー{
    &__メニュー{}
    &__メニュー項目 {}
    &__アクション {}
    &__ボタン{  
        & - ログイン {}
        & - 登録する {}
    }    
}

2. ネストを避ける

BEM には最大で B+E+M の 3 つのレベルがあります。

したがって、 .block__el1__el2の形式を避け、直接.block_el2に変更してください。

ここのブロックは名前空間に非常に似ています。

(3)メリットとデメリット

利点:

  • 階層関係が一目でわかり、読みやすい
  • 制約の範囲を制限するために階層セレクターに依存する必要がないため、コンポーネント間のスタイルの汚染を回避できます。

欠点:

  • 命名方法は長くて見苦しく、書きにくいです (less/sass を使用すると書き方が簡単になります)
  • より小さなコンポーネントでは、BEM 形式は役に立たないように見えるかもしれません。ただし、パブリックのグローバル モジュール スタイル定義の場合は、BEM 形式を使用することをお勧めします。 (特に公開されているパブリックコンポーネント)

他の:

BEM 命名ではクラス名が長くなりますが、gzip 圧縮後は帯域幅のオーバーヘッドは無視できます。

BEM ではタグ セレクターの使用は許可されません。最も単純な li でも .menu-item として記述する必要があります。

(4)実践

Ele.me のフレームワーク elementUI は BEM の一種です。また、company.yandex.ru/ の Web サイトでも調べることができます。

3. スマック

SMACSS (Scalable & Modular Architecture CSS、CSS のスケーラビリティとモジュール アーキテクチャを意味します)。 Jonathan Snook は 2011 年に Yahoo で勤務し、Yahoo Mail の CSS を書いていたときにこれを思いつきました。

(1)ルール

1. CSSルールの分類

CSS は 5 つのカテゴリに分類されます。

Base基本仕様

たとえば、CSS Reset や CSS Normalize などです。

Layoutレイアウト仕様

たとえば、左列と右列、グリッド システムなどです。

Module

たとえば、製品リスト、ナビゲーション バーなどです。再利用可能。

State仕様

たとえば、選択された状態。

Themeスタイルの仕様

2. 命名規則

クラス名に前綴を追加します。

Base にはプレフィックスは必要ありません。クラスや ID の代わりにタグを使用します。

  • l-レイアウトの接頭辞として使用されます: l-inline
  • m- 、Module: m-calloutのプレフィックスとして使用されます。ただし、接頭辞を使用する必要はありません。
  • is-状態の接頭辞として使用されます: is-collapsed
  • テーマは通常、以前存在していたクラス名を使用して新しい theme.css を作成します。別のクラス名を使用する場合は、 theme-プレフィックスを使用できます。

例:

<div class="l-box m-profile m-profile--is-pro-user">
  <img class="m-avatar m-profile__image" />
  <p class="m-profile__bio">...</p>
</div>

(2)例

オンラインデモ: https://codepen.io/savemuse/pen/gWVpvd

4. アトミックCSS

Atomic CSSも Yahoo によって提案されており、文字通り原子CSSとして理解できます。

(1)例

<div className="P(10px) M(20%) 位置(f) 開始(50%) Bgc(#fff)" />

上記の HTML 内のクラス名を通常の CSS に解析するのに役立つ特別な Atomic CSS ツールがあります。 (わずかに)

(2)メリットとデメリット

利点: CSS スタイルをコンポーネントに最小限に抑え、再利用性を最大限に高めます。

デメリット: 基本的にはインライン形式で記述しますが、クラス名を使用して表現します。

(3)まとめ

このアプローチは本当に過激です。今のところは受け入れられません。

結論

過激な Atomic はさておき、残りの OOCSS/BEM/SMACSS については次の提案があります。

それぞれの考え方は補完的かつ対立しており、実際の開発ではトレードオフ的に使用されることもあります。

これらはすべて、CSSプリプロセッサ(less/sassなど)と組み合わせて効率を高めることができます。

上記で紹介した利点を比較してまとめると、それらが解決する中心的な問題はモジュール性であることがわかります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  Docker で FastDFS ファイル システムを構築する (マルチイメージ チュートリアル)

>>:  訪問者を惹きつけるウェブサイトコンテンツを作成する14の方法

推薦する

CentOS 7 環境でソースコードから MySQL 5.7 をインストールする方法

この記事では、CentOS 7 環境でソース コードから MySQL 5.7 をインストールする方法...

無効と読み取り専用で入力を読み取り専用に設定する

読み取り専用入力を実現するには、無効と読み取り専用の 2 つの方法があります。当然、どちらの結果も読...

uniapp WeChatミニプログラムのグローバル共有を実装するためのサンプルコード

目次グローバル共有コンテンツファイルを作成するファイルをインポートしてグローバルに登録するページ共有...

Vue プロジェクトに Electron を追加するための詳細なコード

1. package.jsonに追加する "メイン": "electr...

複数のフィールドを変更するためのMysql更新の構文の詳細な分析

MySQL でレコードを更新すると、構文は正しいのですが、レコードが更新されません...質問文実行前...

Nodeはkoa2を使用してシンプルなJWT認証方式を実装します

JWT の紹介JWTとは正式名称はJSON Web Tokenで、現在最も人気のあるクロスドメイン認...

Mysql5.7.14 Linux版のパスワードを忘れた場合の完璧な解決策

/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...

組み込みオブジェクトに関するJavascriptの基礎

目次1. 組み込みオブジェクトの紹介1.1 数学オブジェクト1.2 数学における方法1.3 日付オブ...

MySQL 1対多関連クエリのページングエラー問題の解決方法

XML価格照会のクエリデータにはリストが含まれているため、コレクションが必要です <結果マップ...

Linux カーネル デバイス ドライバーのメモリ管理に関する注意事項

/************************ * Linux メモリ管理 *********...

vue.js でよく使われる v 命令の解析

目次Vue でのモデルバインド表示の if の v-text の説明v-html: v-オンv-if...

Nginx 運用保守ドメイン名検証方法例

インターフェイス ドメイン名を構成する際、各パブリック プラットフォームはドメイン名に対する開発者の...

一定期間の日ごと、時間ごとの統計データを取得するMySQLの詳しい説明

毎日の統計情報を取得するプロジェクトを実行する際、プロジェクト ログを分析する必要があります。要件の...

MySQL thread_stack 接続スレッドの最適化

MySQL は、ネットワーク経由だけでなく、名前付きパイプ経由でも接続できます。MySQL への接続...

Dockerコンテナのネットワーク管理とネットワーク分離の実装

1. Dockerネットワーク管理1. Dockerコンテナ方式1) Dockerが外部ネットワーク...