ホームページ  >  記事  >  ウェブフロントエンド  >  [翻訳] CSSモジュール - コーディングの未来_html/css_WEB-ITnose

[翻訳] CSSモジュール - コーディングの未来_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:18:21903ブラウズ

まえがき

これは、Glen Maddern によって 2015 年 8 月 19 日に公開された記事です。主に、以前に翻訳された記事「Understanding CSS Module Methods」で言及されていました。

ここでの翻訳はすべて私の理解に基づいているため、文章ごとに説明しているわけではありません。間違いがあることは避けられず、私のレベルには限界がありますので、皆様にご指摘いただければ幸いです。

テキスト

最近の CSS 開発の考え方の転換点を見つけたい場合は、2014 年 11 月に NationJS で行われた Christopher Chedeau の「CSS in js」スピーチを聞くのが最善です。これが境界線であり、さまざまなアイデアが高速粒子のようにそれぞれの方向に急速に発展します。たとえば、React でスタイルを記述する場合、および React に依存する一部のプロジェクトでは、React Style、jsxstyle、および Radium がその 3 つであり、最新かつ最も独創的で、最も実現可能な方法です。発明が隣接する可能性の探求であるならば、クリストファーは多くの隣接する可能性を創造しました。

これらの問題は、大規模な CSS コード ベースにさまざまな形で存在します。 Christopher 氏は、これらの問題は js でコードを記述することで解決できる可能性があると指摘しました。しかし、このソリューションには独自の複雑さと特殊性が伴います。前述のプロジェクト (React Style、jsxstyle、Radium) で :hover 状態で範囲を処理するメソッドを見てください。この問題はブラウザ側 CSS ですでに解決されています。

CSS モジュール チームは問題の鍵を発見しました。CSS との一貫性を保ち、styles-in-js を使用して記述することです。私たちは依然として CSS を使用することにこだわっていますが、多くの提案を提供してくれた友人に感謝します。

私たちは CSS とそれをより良く書く方法について考えるために知恵を絞ってきました。

ステップ 1: デフォルトのローカル スコープ

css モジュールでは、各ファイルは個別にコンパイルされるため、CSS の短い名前を使用できます。名前の競合を心配する必要はありません。送信ボタンの 4 つの状態の例を見てみましょう

従来の CSS 記述方法

Suit または BEM の名前付け、いくつかの CSS スタイル、および HTML を使用します。コードは次のとおりです:

css コード スニペット:

/*Components/submit-button.css */

.Button { /* Normal のすべてのスタイル */ }

.Button--disabled { /* オーバーライドfor Disabled * / }

.Button--error { /* Error をオーバーライドします */ }

.Button--in-progress { /* In Progress をオーバーライドします */

html コード スニペット:

上記のコードは、ネストされたセレクターの使用を避けて、4 つのステータス クラス名を持ち、正常に動作します。以前のスタイル クラス名または参照されているスタイル クラス名との競合を避けるために、セレクターとして大文字で始まる単語 Button を使用します。そして、 --modifier 構文を使用して基本的なスタイルを削除します。

これまでのところ、これは優れた保守可能なコードです。ただし、厳密な命名規則も導入されました。ただし、これは標準の CSS を使用して行う最良の方法です。

CSS モジュールの書き方

CSS モジュールを使用すると、短い名前の使用を心配する必要はありません。このように見えます。

/*Components/submit-button.css */

.normal { /* Normal のすべてのスタイル */ }

.disabled { /* Disabled のすべてのスタイル */ }

.error { /* すべてのスタイルfor Error */ }

.inProgress { /* すべてのスタイル for In Progress */

ほら、どこにも長いプレフィックスを追加する必要はありません。他の言語と同様に、ローカル変数の前に長い接頭辞を追加する必要はなく、CSS に対応するファイル名を submit-botton.css に変更するだけで済むのはなぜでしょうか。

これにより、JS で require または import を使用してロードされた CSS モジュール ファイルをコンパイルできるようになります。

/* コンポーネント/submit-button.js */

'./submit-button.css' からスタイルをインポートします

buttonElem.outerHTML = `

操作が成功したことを示す同様の結果が得られます。命名規則

まだわかります たとえば、ボタン

/*Components/submit-button.css */

.normal { /* Normal のすべてのスタイル */ }

.disabled { /* Disabled のすべてのスタイル*/ }

.error { /* エラーのすべてのスタイル */ }

.inProgress { /* 進行中のすべてのスタイル */

すべてのクラス名は独立しており、1 つが基本クラス名であり、他のクラス名は独立しています。修正に使用されます。

CSS モジュールでは、すべてのクラスにすべてのプロパティとスタイルが含まれている必要があります

。これは、JS でクラス名を使用する場合に大きな違いをもたらします。

/* こんなことしないでください */

`class=${[styles.normal,styles['in-progress']].join(" ")}`

/* 違いは、別のクラス名を使用することです*/

`class=${ styles['in-progress']}`

/* キャメルケースを使用するのが最善です*/

`class=${styles.inProgress}`

もちろん、コード量に応じて課金する場合は、そのまま続けることができます。

React の例

これは React 固有の CSS モジュールに関するものではありません。ただし、React は、CSS モジュールを使用するときに特に優れたエクスペリエンスを提供します。ここではさらに複雑な例を示します。

/*コンポーネント/submit-button.jsx */

import { Component } from 'react';

'./submit-button.css' からスタイルをインポート

export デフォルトクラス SubmitButton extends Component {

render() {

let className, text = "送信"

if (this.props.store.submissionInProgress) {

className =styles.inProgress text = "処理中..."

} else if (this. props.store.errorOccurred) {

className = style.error

} else if (!this.props.form.valid) {

className = style.disabled

} else {

className = style.normal

}

return

}

}

グローバルな競合を気にせずにスタイルを使用できるため、コンポーネントの開発に集中できます。書き方ではありません。 CSS と js を頻繁に切り替える作業から一度離れると、もう元には戻れなくなります。

しかし、これはほんの始まりにすぎません。スタイルのマージを考慮すると、CSS モジュールは問題外になります。

ステップ 2 すべてはコンポーネントです

前述したように、CSS モジュールでは、各状態に必要なスタイルがすべて含まれている必要があります。

複数の状態が必要であると仮定して、CSS モジュールと BEM の命名を比較してみましょう。

/* BEM スタイル */

innerHTML = `

これは、JS コードを変更したり、CSS デバイスを書き換えたりすることなく、複数のスタイルを結合できます。

ステップ 3. ファイル間でコードを共有する

SASS または LESS を使用して作業し、@import を通じて同じワークスペース内のファイルを参照します。変数や関数を宣言し、他のファイルで使用できます。非常に優れた方法ですが、プロジェクトごとに変数の名前が競合する可能性があります。次に、コードをリファクタリングして、variables.scss と settings.scss を記述する必要がありますが、どのコンポーネントがどの変数に依存するかはわかりません。設定ファイルは非常に大きくなります。

より良い解決策 (「Webpack を使用してより小さな CSS を構築する」) もありますが、SASS のグローバルな特性により、依然として大きな制限があります。

CSS モジュールは一度に 1 つのファイルのみを実行するため、グローバル スコープを汚染しません。 JS コードは import または require を使用して依存関係を参照し、CSS モジュールは compose を使用して別のファイルからスタイルを参照します。

/* Colors.css */

.primary { color: #720; }

.Secondary { color: #777; }/* 他のヘルパー クラス... */

/* submit-button.css */

.common { /* font-sizes, padding, border-radius */ }

.normal { composes: common; composes: "../shared/colors.css" からのプライマリ }

コンポーネントを使用するでは、ローカルクラス名と同じように、colors.css ファイルのクラスを参照できます。また、変更されたコンポーネントのクラス名は出力時に変更されますが、CSSファイル自体は変更されず、ブラウザサイドCSSを生成する前にcomposesブロックも削除されます。

/* Colors.css */

.shared_colors__primary__fca929 { color: #720; }
.shared_colors__ Secondary__acf292 { color: #777; }

/* submit-button.css */

.components_submit_button__common__abc 5436 { /* フォント-サイズ、パディング、ボーダー半径 */ }
.components_submit_button__normal__def6547 {}

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。